Подтвердить что ты не робот

Appcompat показывает, что прогресс в панели действий вызывает NPE

После обновления моего SDK до всех последних нововведений Android 5.0 я не могу использовать индикаторы выполнения, встроенные в ActionBar в appcompat. Я выполнил все обычные исправления (move supportRequestWindowFeature() до setContent() и до супервызов в oncreate), но ничего не работает. Вот что я делаю:

public class LoginActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
    supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    super.onCreate(savedInstanceState);

    setContentView(R.layout.login);
    ...
    loginButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
                ...
                setSupportProgressBarIndeterminateVisibility(true);
        }
    });

} и трассировка стека:

10-18 19:38:21.053: E/AndroidRuntime(11206): java.lang.NullPointerException: Attempt to invoke     virtual method 'void android.support.v7.internal.widget.ProgressBarCompat.setVisibility(int)' on a null object reference
10-18 19:38:21.053: E/AndroidRuntime(11206):    at android.support.v7.app.ActionBarActivityDelegateBase.updateProgressBars(ActionBarActivityDelegateBase.java:786)
10-18 19:38:21.053: E/AndroidRuntime(11206):    at android.support.v7.app.ActionBarActivityDelegateBase.setSupportProgressBarIndeterminateVisibility(ActionBarActivityDelegateBase.java:692)
10-18 19:38:21.053: E/AndroidRuntime(11206):    at android.support.v7.app.ActionBarActivity.setSupportProgressBarIndeterminateVisibility(ActionBarActivity.java:327)
10-18 19:38:21.053: E/AndroidRuntime(11206):    at com.myapppackage.LoginActivity$2.onClick(LoginActivity.java:82)

Это на Nexus 5 под управлением Android 4.4.4. Тема приложения наследуется от Theme.AppCompat. Приложение построено с Android 5.0, а targetSDK равно 21. Когда я использую setSupportProgress для нормального горизонтального индикатора выполнения, то самое происходит. Любая помощь очень ценится.

EDIT: Нашел проблему. В файле android.support.v7.internal.widget.ToolbarWidgetWrapper:

@Override
public void initIndeterminateProgress() {
    Log.i(TAG, "Progress display unsupported");
}

Может быть, не ошибка, а функция? Панели инструментов, похоже, являются новыми ActionBars.

У меня есть копия приложения V20 appcompat на другом компьютере, поэтому я возвращаюсь к этому.

4b9b3361

Ответ 1

Возможным обходным путем для этого было бы вручную добавить ProgressBar в качестве пользовательского представления и переопределить setSupportProgressBarIndeterminateVisibility

В onCreate:

ProgressBar progressBar = new ProgressBar(this);
progressBar.setVisibility(View.GONE);
progressBar.setIndeterminate(true);
getSupportActionBar().setDisplayShowCustomEnabled(true);
getSupportActionBar().setCustomView(progressBar);

В вашей деятельности:

@Override
public void setSupportProgressBarIndeterminateVisibility(boolean visible) {
    getSupportActionBar().getCustomView().setVisibility(visible ? View.VISIBLE : View.GONE);
}

Конечно, переключение на панель инструментов и добавление ProgressBar должно быть более надежным в будущем.

Ответ 2

Похоже, что неопределенный прогресс и горизонтальный индикатор выполнения не поддерживаются в библиотеке поддержки V21. Из файла android.support.v7.internal.widget.ToolbarWidgetWrapper:

@Override
public void initIndeterminateProgress() {
    Log.i(TAG, "Progress display unsupported");
}

Крис Банес подтвердил это: http://chris.banes.me/2014/10/17/appcompat-v21/#comment-1642002459. Я использую старую копию appcompat v20. Вот ZIP для всех, кто в ней нуждается: https://drive.google.com/file/d/0B2dSjU9N8KdZUEFuMkhLZzJZOFU/view?usp=sharing

Ответ 3

РЕДАКТИРОВАТЬ: Ниже показано, что это не работает, потому что ProgressBarCompat является скрытым классом и не может быть добавлен в ваш XML-макет. Это похоже на ошибку в библиотеке appcompat.


Он ищет индикатор выполнения в ActionBarActivityDelegateBase.java:

private ProgressBarCompat getCircularProgressBar() {
    ProgressBarCompat pb = (ProgressBarCompat) mActivity.findViewById(R.id.progress_circular);
    if (pb != null) {
        pb.setVisibility(View.INVISIBLE);
    }
    return pb;
}

И используя его в методе updateProgressBars() в том же классе. Похоже, разработчик должен добавить ProgressBarCompat к вашей деятельности.

Ответ 4

Для всех, кто делает обновление своих приложений/библиотек, они отказались от поддержки панели прогресса в библиотеке appsupport v7. https://code.google.com/p/android/issues/detail?id=78310