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.
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);
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
.
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)
.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
}
});
Avec la nouvelle AppCompatActivity, vous devriez l'appeler au lieu d'ActionBarActivity:
((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
Vous pouvez ajouter une barre d’outils dans Fragments en utilisant ceci
((YOUR_ACTIVITY) getActivity()).getDelegate().setSupportActionBar(toolbar);
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