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

SetSupportProgressBarIndeterminateVisibility raise 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?

4b9b3361

Ответ 1

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

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

<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);
}

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

EDIT: заменил ActionBarActivity на AppCompatActivity согласно последним рекомендациям библиотек поддержки Android.

Ответ 2

Per этот комментарий на сообщение Chris Banes (автор AppCompat) AppCompat v21:

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

В чем причина:

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

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