Je commence un nouveau projet qui utilise la AppCompat/ActionBarCompat
dans la v7
bibliothèque de soutien. J'essaie de comprendre comment utiliser le à getSupportActionBar
partir d'un fragment. Mon activité qui héberge le fragment s'étend ActionBarActivity
, mais je ne vois pas de classe de support similaire pour les fragments.
De l'intérieur de mon fragment
public class CrimeFragment extends Fragment {
//...
getActivity().getSupportActionBar().setSubtitle(R.string.subtitle); // getSupportActionBar is not defined in the v4 version of Fragment
//...
}
La page Google pour l'utiliser ( http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html ) indique qu'il ne devrait y avoir aucun changement pour le v4
fragment. Dois-je envoyer tous mes getActivity()
appels à un ActionBarActivity
? Cela semble être une mauvaise conception.
Bien que cette question ait déjà une réponse acceptée, je dois souligner qu'elle n'est pas totalement correcte: appeler à
getSupportActionBar()
partir deFragment.onAttach()
provoquera uneNullPointerException
rotation de l'activité.Réponse courte:
Utilisez
((ActionBarActivity)getActivity()).getSupportActionBar()
dansonActivityCreated()
(ou à tout autre moment après dans son cycle de vie) au lieu deonAttach()
.Longue réponse:
La raison en est que si un
ActionBarActivity
est recréé après une rotation, il restaurera tous les fragments avant de créer réellement l'ActionBar
objet.Code source pour
ActionBarActivity
dans lasupport-v7
bibliothèque:ActionBarActivityDelegate.createDelegate()
crée l'mImpl
objet en fonction de la version d'Android.super.onCreate()
isFragmentActivity.onCreate()
, qui restaure tous les fragments précédents après une rotation (FragmentManagerImpl.dispatchCreate()
, & c).mImpl.onCreate(savedInstanceState)
isActionBarActivityDelegate.onCreate()
, qui lit lamHasActionBar
variable à partir du style de fenêtre.mHasActionBar
c'est vrai,getSupportActionBar()
reviendra toujoursnull
.Source pour
ActionBarActivityDelegate.getSupportActionBar()
:la source
ActionBarActivity
est obsolète. Utiliser à laAppCompatActivity
placeSi quelqu'un utilise com.android.support:appcompat-v7: et AppCompatActivity comme activité, cela fonctionnera
la source
dans votre
fragment.xml
ajouter uneToolbar
balise à partir de la bibliothèque de supportMaintenant, comment pouvons-nous le contrôler depuis la
MyFragment
classe? Voyons voironCreateView
fonction à l' intérieur ajouter ce qui suitet si vous voulez ajouter
items
à la barre d' outils à l' intérieurMyFragment
vousmust
ajoutez cette ligne dans laonCreateView
fonctioncette ligne est importante, si vous l'oubliez, Android ne remplira pas vos éléments de menu.
supposons que nous les identifions dans
menu/fragment_menu.xml
après cela, remplacez les fonctions suivantes
J'espère que cela t'aides
la source
Une réponse actualisée à la réponse de Pierre-Antoine LaFayette
ActionBarActivity est obsolète; utiliser à la
AppCompatActivity
placela source
Pour ceux qui utilisent kotlin,
la source