.getSupportActionBar nicht verfügbar in Fragment; Workaround führt zu NullPointerException bei Rotation

8

Struktur

(Namen der Activies / Fragmente geändert)

Basierend auf einigen Tipps, die in Android Programming: The Big Nerd Ranch Guide geschrieben wurden, habe ich folgende Struktur:

  • MyListFragment extends ListFragment
  • MyListActivity extends SimpleFragmentActivity
  • SimpleFragmentActivity extends ActionBarActivity

MyListActivity.java

%Vor%

SingleFragmentActivity.java

%Vor%

Nachdem ich die grundlegenden Funktionen meiner App (einschließlich Contextual Action Bar, Navigation, ...) umrissen und programmiert habe, wollte ich sicherstellen, dass die App ohne großen zusätzlichen Aufwand so abwärtskompatibel wie möglich ist. Daher habe ich begonnen, die AppCompat (com.android.support:appcompat-v7:20+) ActionBar zu verwenden.

Was mich am Anfang verblüffte, war, dass ich - im Gegensatz zu allen Tutorials oder den Entwicklerrichtlinien von Android, die ich gelesen habe - die Methode getSupportActionBar in Android Studio noch nie verfügbar hatte (ich verwende Android Studio v0.8.2 und JRE 1.7_60). Immer, wenn ich getActivity().getSup eintippe, sind die einzigen Vorschläge, die ich bekomme, getSupportFragmentManager und getSupportLoaderManager .

Als Workaround erstelle ich eine Membervariable ActionBar mActionBar in MyListFragment und initialisiere sie:

%Vor%

Das scheint entweder bei Android 4.4.4 (Moto G) und 2.3.4 (LG E-510) zu funktionieren - den einzigen Geräten, die ich zur Verfügung habe.

Wie dem auch sei, bei der Rotation geht die ActionBar-Zuweisung verloren und die Anwendung stürzt mit einer NullPointerException ab. Debuggen der Anwendung und Festlegen eines Haltepunkts in der folgenden Zeile in onCreate :

%Vor%

Ich habe herausgefunden, dass mActionBar nach der Rotation null ist. Das Einfügen dieser Zeile in onCreateView hat nicht geholfen.

Was ich versucht habe

  • Platzieren der Initialisierung von mActionBar in
    • onAttach
    • onActivityCreated
    • onCreate / onCreateView direkt vor .setTitle wird
    • aufgerufen

Ich habe keine Ideen und bin dankbar für Ratschläge.

EDIT-0 (30.07.)

Ausnahme wird ausgelöst (nach der Bearbeitung nach Alex Vorschlag )

%Vor%

MyListFragment Zeile 54 (Ausnahme bei Verwendung von SingleFragmentActivity und ActionBarActivity als Besetzung)

%Vor%

SingleFragmentActivity Zeilen 20-22:

%Vor%     
PattaFeuFeu 30.07.2014, 12:52
quelle

3 Antworten

32

Wirf deine getActivity() auf ActionBarActivity / AppCompatActivity (abhängig davon, was du benutzt) und du hast Zugriff auf die Unterstützung ActionBar .

%Vor%

oder

%Vor%

Verwenden Sie diesen Code in onActivityCreated(...) method anstelle von onAttach(...)

    
Alex 30.07.2014, 13:00
quelle
7

Jetzt sollte es eigentlich sein:

%Vor%

, weil ActionBarActivity veraltet ist.

Aber das ist nur, wenn Sie dies außerhalb einer Aktivität tun müssen, wo es am häufigsten geschieht.

    
jazzinthemorning 30.09.2015 02:01
quelle
1

Obwohl diese Antwort sehr spät gegeben wird, kann sie jemandem helfen. Wir können direkt folgenden Code aufrufen: ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("String");
Es funktioniert auch gut.

    
Senthilkumar S 06.09.2016 21:39
quelle