22

Meine Aktivitätsklasse erweitert android.support.v7.app.ActionBarActivity. Ich ersuche Fenster-Funktion und ruft setSupportProgressBarIndeterminateVisibility() in der onCreate() -Methode wie folgt:setSupportProgressBarIndeterminateVisibility raising java.lang.NullPointerException bei Verwendung mit 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); 
} 

Ich kann nicht begreifen, was mit meinem Code falsch ist und warum ich java.lang.NullPointerException vom setSupportProgressBarIndeterminateVisibility() angehoben bin immer.

Meine gradle Abhängigkeiten enthalten:

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

Weiß jemand, wie man mit dem API 21 die unbestimmten Fortschrittsbalken in der support.v7 Aktionsleiste benutzen?

Antwort

21

Per this comment auf Chris Banes' (der Autor von AppCompat) AppCompat v21 Ankündigung Beitrag:

In beiden Fällen werden die Statusleiste nicht auf Toolbar mehr unterstützt.

Auf Grund:

Da Toolbar ein stark fokussierten Widget ist. Wenn Sie eine ProgressBar möchten, fügen Sie sie selbst zur Toolbar hinzu (es ist nur eine ViewGroup).

Ich würde mehr Informationen erwarten, da die offizielle Dokumentation hier in Kürze aktualisiert wird.

32

Sie müssen die Toolbar anstelle von ActionBar verwenden und die ProgressBar in die Toolbar einfügen.

Hier ist eine einfache Lösung zum Einfügen unbestimmter ProgressBar in Toolbar; überhaupt stellt sich heraus, es ist einfach nicht schwer :) Ihr wie dieses ProgressBar XML-Element in Ihrer Toolbar setzen:

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

Und dann in Ihrem AppCompatActivity, rufen Sie einfach die ProgressBar nach der Toolbar das Abrufen und die ProgressBar sichtbar eingestellt oder unsichtbar, wenn Sie es brauchen.

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

this helps :)

EDIT: ActionBarActivity mit AppCompatActivity nach den neuesten Android-Support-Bibliotheken Richtlinien ersetzt.

+0

Ausgezeichnete Antwort! Ich habe vielleicht den gleichen Layout-Code wie oben (vielleicht habe ich es aus einer früheren Antwort erhalten), aber die "Sichtbarkeit = weg" wird auf einem Galaxy S5 unter 4.4.2 ignoriert. Ich muss die ProgressBar-Ansicht programmgesteuert nach ID suchen und ihre Sichtbarkeit auf View.GONE festlegen. Denkst du, das ist eine Art Appkompat-Problem? – swooby

+0

@sooby Ich habe Galaxy S5 läuft 5.0 und die Sichtbarkeit = gegangen funktioniert gut (mit der neuesten Support-Bibliothek appcompat-v7: 22.2.). Vielleicht ist es ein spezifischer älterer appcompat- oder 4.4.2-spezifischer Fehler. Nichtsdestotrotz können Sie auch "visibility = invisible" verwenden, wenn Sie den Toolbar-Platz für etwas anderes nicht benötigen :) – ABVincita

+1

Der XML-Code sollte verbessert werden mit: 'android: layout_gravity =" end "'. – drindt

Verwandte Themen