getSupportActionBar depuis l’intérieur de Fragment ActionBarCompat

Je commence un nouveau projet qui utilise la bibliothèque de prise en charge AppCompat/ActionBarCompat dans la version 7. J’essaie de comprendre comment utiliser getSupportActionBar dans un fragment. Mon activité qui héberge le fragment étend ActionBarActivity , mais je ne vois pas de classe de support similaire pour Fragments.

De mon fragment

  public class CrimeFragment extends Fragment { //... getActivity().getSupportActionBar().setSubtitle(R.ssortingng.subtitle); // getSupportActionBar is not defined in the v4 version of Fragment //... } 

La page de 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 fragment v4 . Dois-je lancer tous mes getActivity() vers un ActionBarActivity ? Cela semble être un mauvais design.

Après Fragment.onActivityCreated (…), vous aurez une activité valide accessible via getActivity ().

Vous devrez le convertir en ActionBarActivity puis appeler getSupportActionBar ().

 ((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.ssortingng.subtitle); 

Vous avez besoin de la dissortingbution. Ce n’est pas une conception médiocre, c’est une compatibilité ascendante.

Bien que cette question ait déjà une réponse acceptée, je dois préciser que ce n’est pas tout à fait correct: l’appel de getSupportActionBar() partir de Fragment.onAttach() provoquera une NullPointerException lorsque l’activité sera pivotée.

Réponse courte:

Utilisez ((ActionBarActivity)getActivity()).getSupportActionBar() dans onActivityCreated() (ou tout point suivant dans son cycle de vie) au lieu de onAttach() .

Longue réponse:

La raison en est que si une ActionBarActivity est recréée après une rotation, elle restaure tous les fragments avant de créer l’object ActionBar .

Code source pour ActionBarActivity dans la bibliothèque support-v7 :

 @Override protected void onCreate(Bundle savedInstanceState) { mImpl = ActionBarActivityDelegate.createDelegate(this); super.onCreate(savedInstanceState); mImpl.onCreate(savedInstanceState); } 
  • ActionBarActivityDelegate.createDelegate() crée l’object mImpl fonction de la version d’Android.
  • super.onCreate() est FragmentActivity.onCreate() , qui restaure tous les fragments précédents après une rotation ( FragmentManagerImpl.dispatchCreate() , & c).
  • mImpl.onCreate(savedInstanceState) est ActionBarActivityDelegate.onCreate() , qui lit la variable mHasActionBar à partir du style de la fenêtre.
  • Avant que mHasActionBar soit vraie, getSupportActionBar() retournera toujours null .

Source pour ActionBarActivityDelegate.getSupportActionBar() :

 final ActionBar getSupportActionBar() { // The Action Bar should be lazily created as mHasActionBar or mOverlayActionBar // could change after onCreate if (mHasActionBar || mOverlayActionBar) { if (mActionBar == null) { ... creates the action bar ... } } else { // If we're not set to have a Action Bar, null it just in case it's been set mActionBar = null; } return mActionBar; } 

Si quelqu’un utilise com.android.support:appcompat-v7: et AppCompatActivity comme activité, cela fonctionnera

 ((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.ssortingng.subtitle); 

dans votre fragment.xml ajoutez la Toolbar de la bibliothèque de support

   

Maintenant, comment pouvons-nous le contrôler à partir de la classe MyFragment ? Voyons voir

dans la fonction onCreateView append le suivant

 mToolbar = (Toolbar) view.findViewById(R.id.toolbar); ((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar); //add this line if you want to provide Up Navigation but don't forget to to //identify parent activity in manifest file ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

et si vous souhaitez append des items à la barre d’outils dans MyFragment vous must append cette ligne dans la fonction onCreateView

  setHasOptionsMenu(true); 

cette ligne est importante, si vous l’oubliez, android ne remplira pas les éléments de votre menu.

supposons que nous les identifions dans menu/fragment_menu.xml

après cela remplacer les fonctions suivantes

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fragment_menu, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.action_1: // do stuff return true; case R.id.action_2: // do more stuff return true; } return false; } 

J’espère que cela t’aides

En réponse à la réponse de Pierre-Antoine LaFayette

ActionBarActivity est obsolète; utilisez plutôt AppCompatActivity

 ((AppCompatActivity)getActivity()).getSupportActionBar();