116 votes

getSupportActionBar à l'intérieur du fragment ActionBarCompat

Je démarre un nouveau projet qui utilise la fonction AppCompat/ActionBarCompat en v7 bibliothèque de soutien. J'essaye de comprendre comment utiliser la getSupportActionBar de l'intérieur d'un fragment. Mon activité qui héberge le fragment étend ActionBarActivity mais je ne vois pas de classe de soutien 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 ) dit qu'il ne devrait y avoir aucun changement pour le v4 fragment. Est-ce que je dois couler tous mes getActivity() appels à un ActionBarActivity ? Ça ressemble à une mauvaise conception.

315voto

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

Vous devrez le convertir en ActionBarActivity, puis faire l'appel à getSupportActionBar().

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

Vous avez besoin de la distribution. Ce n'est pas une mauvaise conception, c'est une compatibilité descendante.

38voto

matiash Points 14851

Bien que cette question ait déjà une réponse acceptée, je dois signaler qu'elle n'est pas totalement correcte : appeler getSupportActionBar() de Fragment.onAttach() provoquera un NullPointerException lorsque l'activité est tournée.

Réponse courte :

Utilice ((ActionBarActivity)getActivity()).getSupportActionBar() en onActivityCreated() (ou à tout moment ultérieur de son cycle de vie) au lieu de onAttach() .

Longue réponse :

La raison en est que si un ActionBarActivity est recréé après une rotation, il restaurera tous les Fragments avant créer effectivement le ActionBar objet.

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    mImpl = ActionBarActivityDelegate.createDelegate(this);
    super.onCreate(savedInstanceState);
    mImpl.onCreate(savedInstanceState);
}
  • ActionBarActivityDelegate.createDelegate() crée le mImpl en fonction de la version d'Android.
  • super.onCreate() est FragmentActivity.onCreate() qui rétablit tous les fragments précédents après une rotation ( FragmentManagerImpl.dispatchCreate() , &c).
  • mImpl.onCreate(savedInstanceState) est ActionBarActivityDelegate.onCreate() qui lit le mHasActionBar de la variable de style de la fenêtre.
  • Avant mHasActionBar est vrai, 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;
}

29voto

Amir Points 18

Si quelqu'un utilise com.Android.support:appcompat-v7 : et AppCompatActivity comme activité, alors ceci fonctionnera

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

7voto

GzDevs Points 118

Pour ceux qui utilisent kotlin,

(activity as AppCompatActivity).supportActionBar.setSubtitle(R.string.subtitle)

6voto

Dasser Basyouni Points 1108

Comme une réponse mise à jour pour la réponse de Pierre-Antoine LaFayette

L'ActionBarActivity est obsolète ; utilisez la fonction AppCompatActivity au lieu de

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X