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. 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();