Ich starte ein neues Projekt, das die AppCompat/ActionBarCompat
In- v7
Support-Bibliothek verwendet. Ich versuche herauszufinden, wie man das getSupportActionBar
aus einem Fragment heraus verwendet. Meine Aktivität, die das Fragment hostet, wird erweitert ActionBarActivity
, aber ich sehe keine ähnliche Unterstützungsklasse für Fragmente.
Aus meinem Fragment heraus
public class CrimeFragment extends Fragment {
//...
getActivity().getSupportActionBar().setSubtitle(R.string.subtitle); // getSupportActionBar is not defined in the v4 version of Fragment
//...
}
Die Google-Seite für die Verwendung ( http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html ) gibt an, dass für das v4
Fragment keine Änderungen vorgenommen werden sollten . Muss ich alle meine getActivity()
Anrufe an einen ActionBarActivity
senden? Das scheint schlechtes Design zu sein.
Obwohl diese Frage bereits eine akzeptierte Antwort hat, muss ich darauf hinweisen, dass sie nicht ganz richtig ist: Ein Anruf
getSupportActionBar()
vonFragment.onAttach()
führt zu einemNullPointerException
Wenn Sie wenn die Aktivität gedreht wird.Kurze Antwort:
Verwenden Sie
((ActionBarActivity)getActivity()).getSupportActionBar()
inonActivityCreated()
(oder einen beliebigen Punkt danach in seinem Lebenszyklus) anstelle vononAttach()
.Lange Antwort:
Der Grund dafür ist, dass bei einer
ActionBarActivity
Neuerstellung nach einer Rotation alle Fragmente zuvor wiederhergestellt werden dasActionBar
Objekt tatsächlich erstellt wird.Quellcode für
ActionBarActivity
in dersupport-v7
Bibliothek:ActionBarActivityDelegate.createDelegate()
schafft diemImpl
Objekt abhängig von der Android-Version.super.onCreate()
istFragmentActivity.onCreate()
, wodurch alle vorherigen Fragmente nach einer Drehung wiederhergestellt werden (FragmentManagerImpl.dispatchCreate()
, & c).mImpl.onCreate(savedInstanceState)
istActionBarActivityDelegate.onCreate()
, das diemHasActionBar
Variable aus dem Fensterstil liest .mHasActionBar
ist wahr,getSupportActionBar()
wird immer zurückkehrennull
.Quelle für
ActionBarActivityDelegate.getSupportActionBar()
:quelle
ActionBarActivity
ist veraltet. Verwenden SieAppCompatActivity
stattdessenWenn jemand com.android.support:appcompat-v7: und AppCompatActivity als Aktivität verwendet, funktioniert dies
quelle
in Ihrem
fragment.xml
Add-Toolbar
Tag aus der Support-BibliothekWie können wir es nun vom
MyFragment
Unterricht aus steuern ? Mal schauenInnerhalb der
onCreateView
Funktion fügen Sie Folgendes hinzuund wenn Sie zur
items
Symbolleiste hinzufügen möchten, fügenMyFragment
Siemust
diese Zeile innerhalb deronCreateView
Funktion hinzuDiese Zeile ist wichtig, wenn Sie es vergessen, wird Android Ihre Menüelemente nicht füllen.
Nehmen wir an, wir identifizieren sie in
menu/fragment_menu.xml
Danach überschreiben Sie die folgenden Funktionen
hoffe das hilft
quelle
Als aktualisierte Antwort auf die Antwort von Pierre-Antoine LaFayette
ActionBarActivity ist veraltet. Verwenden Sie
AppCompatActivity
stattdessenquelle
Für diejenigen, die Kotlin verwenden,
quelle