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 на другом компьютере, поэтому я возвращаюсь к этому.
Ответы
Ответ 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