22

Moja klasa aktywności obejmuje rozszerzenie android.support.v7.app.ActionBarActivity. Ja zainteresowanie funkcję okna i wywołanie setSupportProgressBarIndeterminateVisibility() w metodzie onCreate() w następujący sposób:setSupportProgressBarIndeterminateVision zwiększając wyjątek java.lang.NullPointerException, gdy jest używany z pakietem SDK systemu Android 5.0 (API 21)

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

nie mogę zrozumieć, co się dzieje z mojego kodu i dlatego jestem coraz java.lang.NullPointerException podniesiony przez setSupportProgressBarIndeterminateVisibility().

Moi Gradle Zależności zawiera:

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

Czy ktoś wie, jak używać nieokreślony pasek postępu na pasku akcji support.v7 z API 21?

Odpowiedz

21

Per this comment na Chris Banes' (autor AppCompat) AppCompat V21 ogłoszenie wpis:

czy inaczej, pasek postępu nie są obsługiwane na pasku narzędzi już.

Na dlaczego:

Ponieważ pasek jest wysoce skoncentrowany widget. Jeśli chcesz pasek postępu, dodaj go sam do paska narzędzi (to tylko ViewGroup).

Oczekuję więcej informacji, wkrótce oficjalna dokumentacja zostanie zaktualizowana.

32

Musisz użyć paska narzędzi Toolbar zamiast ActionBar i dodać pasek ProgressBar do paska narzędzi.

Oto proste rozwiązanie do wstawiania nieokreślonego paska postępu do paska narzędzi; Okazuje się, że to nie jest trudne w ogóle :) Wystarczy umieścić swój ProgressBar elementu XML wewnątrz Toolbar tak:

<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> 

a potem w swoim AppCompatActivity, wystarczy pobrać ProgressBar po pobraniu pasku narzędzi i ustawić ProgressBar widoczny lub niewidoczne, gdy jest to potrzebne.

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

Nadzieja to pomaga :)

EDIT: zastąpiony ActionBarActivity z AppCompatActivity zgodnie z najnowszymi wytycznymi biblioteki obsługi Android.

+0

Doskonała odpowiedź! Być może nie ma to związku z tym, że mam dokładnie taki sam kod układu, jak powyżej (może otrzymałem go z jednej z wcześniejszych odpowiedzi), ale "widoczność = minęła" jest ignorowana na Galaxy S5 z uruchomionym 4.4.2. Muszę programowo znaleźć widok ProgressBar według id i ustawić jego widoczność na View.GONE. Czy uważasz, że jest to jakiś problem z aplikacją? – swooby

+0

@swooby Mam Galaxy S5 z systemem 5.0 i widoczność = odeszła działa dobrze (przy użyciu najnowszej biblioteki aplikacji appcompat-v7: 22.2.). Może to konkretny, starszy, konkretny błąd aplikacji lub 4.4.2. Niemniej jednak możesz również użyć "visibility = invisible", jeśli nie potrzebujesz używać miejsca na pasku narzędzi do czegoś innego :) – ABVincita

+1

Kod XML powinien zostać ulepszony za pomocą: 'android: layout_gravity =" end "'. – drindt

Powiązane problemy