setSupportProgressBarIndeterminateVisibility вызывает java.lang.NullPointerException при использовании с Android 5.0 SDK (API 21)

Мой класс активности расширяет android.support.v7.app.ActionBarActivity. Я запрашиваю функцию окна и вызываю setSupportProgressBarIndeterminateVisibility() в методе onCreate() следующим образом:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.activity_main);
    setSupportProgressBarIndeterminateVisibility(true);
}

Я не могу понять, что не так с моим кодом и почему меня java.lang.NullPointerException поднимает setSupportProgressBarIndeterminateVisibility().

Мои зависимости Gradle содержат:

compile 'com.android.support:appcompat-v7:21.0.0'

Кто-нибудь знает, как использовать неопределенный индикатор выполнения на панели действий support.v7 с API 21?


person Lubos Ilcik    schedule 19.10.2014    source источник


Ответы (2)


Вам нужно использовать панель инструментов вместо ActionBar и добавить ProgressBar на панель инструментов.

Вот простое решение для вставки неопределенного ProgressBar в панель инструментов; оказывается, это совсем не сложно :) Просто поместите xml-элемент ProgressBar в панель инструментов следующим образом:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary">

    <ProgressBar
        android:id="@+id/progress_spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:indeterminate="true"
        android:visibility="gone" />

</android.support.v7.widget.Toolbar>

А затем в своей AppCompatActivity просто извлеките ProgressBar после извлечения панели инструментов и установите для ProgressBar видимость или невидимость, когда вам это нужно.

protected void onCreate(Bundle savedInstanceState) 
{
    setContentView(R.layout.toolbar);

    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);

    progressBar = (ProgressBar) findViewById(R.id.progress_spinner);

    //Make progress bar appear when you need it
    progressBar.setVisibility(View.VISIBLE);

    //Make progress bar disappear
    progressBar.setVisibility(View.INVISIBLE);
}

Надеюсь это поможет :)

РЕДАКТИРОВАТЬ: заменил ActionBarActivity на AppCompatActivity в соответствии с последними рекомендациями по библиотекам поддержки Android.

person ABVincita    schedule 23.11.2014
comment
Отличный ответ! Возможно, не связанная с этим заметка: у меня точно такой же код макета, как и у вас выше (возможно, я получил его из одного из ваших предыдущих ответов), но visibility=gone игнорируется на Galaxy S5 под управлением 4.4.2. Мне нужно программно найти представление ProgressBar по идентификатору и установить для него видимость View.GONE. Как вы думаете, это какая-то проблема appcompat? - person swooby; 05.06.2015
comment
@swooby У меня есть Galaxy S5 с версией 5.0, и visibility=gone работает нормально (с использованием последней библиотеки поддержки appcompat-v7:22.2.). Возможно, это конкретный старый appcompat или конкретная ошибка 4.4.2. Тем не менее, вы также можете использовать visible=invisible, если вам не нужно использовать пространство панели инструментов для чего-то еще :) - person ABVincita; 10.07.2015
comment
Код xml должен быть улучшен с помощью: android:layout_gravity="end". - person drindt; 01.08.2015
comment
У кого-нибудь возникли проблемы с использованием searchView с этим решением? Проблема в том, что вы расширяете searchView, а затем сворачиваете его, панель инструментов волшебным образом становится видимой библиотекой поддержки - person lujop; 20.08.2015
comment
Я пытаюсь это сделать с помощью API 26, android:layout_gravity=end, похоже, не существует для ProgressBar. Результатом становится полоса прогресса в середине панели инструментов. - person amitavk; 30.08.2017

Согласно этому комментарию к Крису Бейнсу (автору AppCompat) AppCompat v21 пост анонса:

В любом случае индикатор выполнения больше не поддерживается на панели инструментов.

Почему:

Потому что панель инструментов — это узкоспециализированный виджет. Если вам нужен ProgressBar, добавьте его на панель инструментов самостоятельно (это просто ViewGroup).

Я ожидаю больше информации, так как официальная документация будет обновлена ​​здесь в ближайшее время.

person ianhanniballake    schedule 19.10.2014