22

Мой класс активности расширяет android.support.v7.app.ActionBarActivity. Я запрашиваю функцию окна и вызова setSupportProgressBarIndeterminateVisibility() в методе OnCreate() следующим образом:setSupportProgressBarIndeterminateVisibility raise java.lang.NullPointerException при использовании с Android 5.0 SDK (API 21)

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?

ответ

21

Per this comment на Крис Бэйнс (автор AppCompat) AppCompat V21 объявления поста:

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

О том, почему:

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

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

32

Вам нужно использовать панель инструментов вместо 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 поддержки библиотек.

+0

Отличный ответ! На, возможно, несвязанной ноте, у меня есть тот же самый код макета, что и у вас выше (возможно, я получил его из одного из ваших более ранних ответов), но «видимость = нет» игнорируется в Galaxy S5, работающем на 4.4.2. Я должен программно найти представление ProgressBar по id и установить его видимость на View.GONE. Считаете ли вы, что это какая-то проблема с appcompat? – swooby

+0

@swooby У меня Galaxy S5 работает 5.0, а visibility = gone работает просто отлично (с использованием последней библиотеки поддержки appcompat-v7: 22.2.). Возможно, это конкретный старый appcompat или 4.4.2 конкретная ошибка. Тем не менее, вы также можете использовать «visibility = invisible», если вам не нужно использовать пространство на панели инструментов для чего-то еще :) – ABVincita

+1

Код xml должен быть улучшен с помощью: 'android: layout_gravity =" end "'. – drindt

 Смежные вопросы

  • Нет связанных вопросов^_^