web-dev-qa-db-fra.com

Comment obtenir la barre d'outils de fragment?

J'ai ActionBarActivity avec NavigationDrawer et utilise support_v7 Toolbar comme ActionBar. Dans l'un de mes fragments, la barre d'outils a une vue personnalisée. Dans d'autres fragments, Toolbar devrait indiquer le titre.

Comment obtenir l'instance Toolbar pour la personnalisation à partir de fragments? Je peux obtenir ActionBar avec getActivity().getActionBar(), mais si j'appelle setTitle() pour cette instance, ActionBar ne fait rien.

UPD:

Dans mon cas 

((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();

(comme MrEngineer13 l'a dit) ne fonctionne pas à la création de premier fragment car je l'appelle de onHiddenChanged (). Maintenant, j'en ajoute plusieurs à onCreateView () et cela fonctionne bien.

89
anisart

Vous devez convertir votre activité de getActivity() à AppCompatActivity en premier. Voici un exemple:

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

La raison pour laquelle vous devez le lancer est parce que getActivity() renvoie FragmentActivity et que vous avez besoin de AppCompatActivity

168
MrEngineer13

Si les fragments doivent avoir une vue personnalisée de la barre d'outils, vous pouvez implémenter la barre d'outils séparément pour chaque fragment.

ajoute la barre d'outils dans fragment_layout:

<Android.support.v7.widget.Toolbar
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="?attr/colorPrimaryDark"/>

trouvez-le en fragment:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment, container, false);
        Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);

        //set toolbar appearance
        toolbar.setBackground(R.color.material_blue_grey_800);

        //for crate home button
        AppCompatActivity activity = (AppCompatActivity) getActivity();
        activity.setSupportActionBar(toolbar);
        activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

le programme d'écoute de menu peut être créé de deux manières:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case Android.R.id.home:
            getActivity().onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

ou définir un écouteur pour la barre d’outils lors de sa création dans onCreateView ():

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                return false;
            }
        });
71
Flinbor

Vous avez deux choix pour obtenir la barre d'outils dans le fragment

Premier 

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);

et le second

Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;
39
Bhargav Pandit
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
7
Danial

Vous pouvez créer une méthode pour cela sur votre classe d'activité:

public void setToolbarTitle(String title) {
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setTitle(title);
}

Et vous pouvez utiliser comme ceci:

setToolbarTitle("Hello World");
1
Mete

Peut-être devrez-vous essayer getActivity().getSupportActionBar().setTitle() si vous utilisez support_v7.

1
Wang

Pour les utilisateurs de Kotlin (activity as AppCompatActivity).supportActionBar!!.show()

1
Muhamed Riyas M

À partir de votre fragment: (obtenir la barre d'outils de fragment?)

// get toolbar
((MainAcivity)this.getActivity()).getToolbar();  // getToolbar will be method in Activity that returns Toolbar!!  don't use getSupportActionBar for getting toolbar!!
// get action bar
this.getActivity().getSupportActionBar();

ceci est très utile lorsque vous utilisez spinner dans la barre d'outils et appelez le spinner ou le personnalisé vues dans la barre d'outils à partir d'un fragment!

De votre activité:

// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();
1
LOG_TAG

Je l'ai fait en utilisant ces étapes.

  1. Définissez Title en utilisant le code ci-dessous dans onCreateView du fragment principal.
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");

  1. Pour permuter entre les fragments, j'utilise la barre de navigation inférieure qui est implémentée sur MainActivity (Activité parentale) du fragment. Même si vous utilisez un bouton ou un élément de menu, vous pouvez modifier le titre de onSelectedItemClickListener, comme je l’ai fait dans mon cas.
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        switch (menuItem.getItemId()){
            case R.id.menu_dashboard:
                getSupportActionBar().setTitle("Dashboard");
                fm.beginTransaction().hide(active).show(dashboardFragment).commit();
                active = dashboardFragment;
                return true;
            case R.id.menu_workshop:
                getSupportActionBar().setTitle("Workshops");
                fm.beginTransaction().hide(active).show(workshopFragment).commit();
                active = workshopFragment;
                return true;
         }
         return false;
    }
    
0
Deepak Kaushik