web-dev-qa-db-fra.com

Utiliser la barre d'outils avec des fragments

j'essaie de créer un viewpager qui parcourt 3 fragments différents, chacun avec une barre d'outils différente. J'ai déjà implémenté la nouvelle barre d'outils dans une activité et je l'ai obtenu mais je tente de le faire fonctionner avec des fragments

Voici le code de fragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout resource that'll be returned
    View rootView = inflater.inflate(R.layout.fragment_home, container, false);


    mToolbar = (Toolbar) rootView.findViewById(R.id.toolbar_home);
    if (mToolbar != null) {
        setSupportActionBar(mToolbar);
    }
    mToolbar.setTitle(null);

    return rootView;
}

J'étends mon fragment avec Fragment, mais je reçois l'erreur

Cannot resolve method setSupportActionBar

Je ne sais pas comment résoudre ce problème. Si je supprime le code setSupportActionBar, est-ce qu'il ne fonctionnera plus avec certains périphériques? Merci.

25
Al Hennessey

Les fragments n'ont pas cette méthode setSupportActionBar(). ActionBar est une propriété de Activity. Par conséquent, pour définir votre barre d'outils en tant que actionBar, votre activité doit s'étendre à partir d'ActionBarActivity. Vous pouvez ensuite appeler votre fragment:

 ((ActionBarActivity)getActivity()).setSupportActionBar(mToolbar);

METTRE À JOUR

Si vous utilisez AppCompatActivity :

 ((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar);
59
vinitius

J'ai vu beaucoup de réponses mentionner setSupportActionBar pour la barre d'outils dans Fragment, mais cette approche peut mal tourner si vous rencontrez une barre d'outils dans Activity et une Toolbar dans Fragment

  1. Lorsque vous passez de setSupportActionBar de la barre d’outils de Activity à la barre d’outils de Fragment, vous risquez de subir une duplication de MenuItem même si vous essayez de remplacer par setHasOptionsMenu(true).
  2. Deuxièmement, si vous souhaitez mettre à jour la barre d’outils d’Activity, vos modifications ne sont pas reflétées à cause de setSupportActionBar dans votre fragment.

Donc, pour éviter cela, je recommande d’utiliser des méthodes de barre d’outils comme celle-ci à l’intérieur de fragment pour gonfler le menu et utiliser 

 toolbar = (Toolbar) view.findViewById(R.id.toolbar_frag);
    toolbar.inflateMenu(R.menu.frag_menu_items);
    Menu menu = toolbar.getMenu();

et utilisez l'interface Toolbar.OnMenuItemClickListener pour recevoir avec les événements de clic de menuItems.

Edit (Section copiée à partir de MrEngineer13 answer )

et si vous vous inquiétez du bouton de retour, vous pouvez le définir comme ceci

toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       //What to do on back clicked
   }
});
24
Faisal Naseer

Avec la nouvelle AppCompatActivity, vous devriez l'appeler au lieu d'ActionBarActivity:

((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
8
muruthi

Vous pouvez ajouter une barre d’outils dans Fragments en utilisant ceci

 ((YOUR_ACTIVITY) getActivity()).getDelegate().setSupportActionBar(toolbar);
2
H.T

Base sur la réponse de @Faisal Naseer. Voici l'exemple complet (avec quelques notes) d'utilisation de Toolbar Avec navigation et menu dans Fragment

fragment_home.xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"">

    ...
    <androidx.appcompat.widget.Toolbar
            Android:id="@+id/toolbar_home"
            Android:layout_width="match_parent"
            Android:layout_height="?attr/actionBarSize"
            app:title="Home" /> 

</androidx.constraintlayout.widget.ConstraintLayout>

HomeFragment.kt

class HomeFragment : BaseFragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        // setHasOptionsMenu(true): don't need this anymore
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_home, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        toolbar_home.setNavigationIcon(R.drawable.ic_back) // need to set the icon here to have a navigation icon. You can simple create an vector image by "Vector Asset" and using here
        toolbar_home.setNavigationOnClickListener {
            // do something when click navigation
        }

        toolbar_home.inflateMenu(R.menu.menu_home)
        toolbar_home.setOnMenuItemClickListener {
            when (it.itemId) {
                R.id.action_add -> {
                    // do something
                    true
                }
                R.id.action_update -> {
                    // do something
                    true
                }
                else -> {
                    super.onOptionsItemSelected(it)
                }
            }
        }
    }
}

menu_home.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">

    <item
        Android:id="@+id/action_add"
        Android:title="@string/add_device"
        app:showAsAction="never" />

    <item
        Android:id="@+id/action_update_room"
        Android:title="@string/update_room"
        app:showAsAction="never" />

</menu>

J'espère que ça aide

 enter image description here

0
Linh