J'utilise le nouveau android.support.design.widget.BottomNavigationView
de la bibliothèque de support. Comment puis-je définir la sélection actuelle à partir du code? Je me suis rendu compte que la sélection est revenue au premier élément, après avoir fait pivoter l'écran. Bien sûr, cela aiderait également, si quelqu'un pouvait me dire, comment "enregistrer" l'état actuel de BottomNavigationView
la onPause
fonction dans la fonction et comment le restaurer dans onResume
.
Merci!
android
bottomnavigationview
Michael
la source
la source
BottomNavigationView
ne fait aucune sauvegarde interne de l'état. Attendez-vous probablement à ce que cela soit inclus dans une future mise à jour. Dupliquer (avec quelques informations supplémentaires) ici: stackoverflow.com/questions/40236786/…Réponses:
À partir de l'API 25.3.0, il a été introduit la méthode
setSelectedItemId(int id)
qui vous permet de marquer un élément comme sélectionné comme s'il avait été tapé.À partir de la documentation:
Exemple de code:
IMPORTANT
Vous DEVEZ avoir déjà ajouté tous les éléments au menu (au cas où vous le feriez par programme) et définissez l'écouteur avant d'appeler setSelectedItemId (je crois que vous voulez que le code de votre écouteur s'exécute lorsque vous appelez cette méthode). Si vous appelez setSelectedItemId avant d'ajouter les éléments de menu et de définir l'écouteur, rien ne se passera.
la source
onTabSelected
évidemment, cela ne fera rien. Lisez la documentation -> Définissez l'ID de l'élément de menu sélectionné. Cela se comporte comme un appui sur un élément. C'est de développeurs AndroidPour cliquer par programme sur l'élément BottomNavigationBar, vous devez utiliser:
Cela organise correctement tous les éléments avec leurs étiquettes.
la source
Pour ceux qui utilisent encore SupportLibrary <25.3.0
Je ne suis pas sûr que ce soit une réponse complète à cette question, mais mon problème était très similaire - j'ai dû traiter la
back
pression sur un bouton et amener l'utilisateur à l'onglet précédent où il se trouvait. Alors, peut-être que ma solution sera utile à quelqu'un:Veuillez garder à l'esprit que si l'utilisateur appuie sur un autre onglet de navigation n'effacera
BottomNavigationView
pas l'élément actuellement sélectionné, vous devez donc appeler cette méthode dans votreonNavigationItemSelected
après le traitement de l'action de navigation:En ce qui concerne la sauvegarde de l'état de l'instance, je pense que vous pouvez jouer avec la même
action id
vue de navigation et trouver une solution appropriée.la source
Menu menu = bottomNavigationView.getMenu();
renvoie pas une copie du menu, donc l'bottomNavigationView
objet n'est pas affecté?où
action_item1
est l'ID de l'élément de menu.la source
la source
Il est désormais possible depuis la version 25.3.0 d'appeler
setSelectedItemId()
\ o /la source
Ajouter
android:enabled="true"
aux éléments de BottomNavigationMenu.Et puis définissez
bottomNavigationView.setOnNavigationItemSelectedListener(mListener)
et définissez-le comme sélectionné en faisantbottomNavigationView.selectedItemId = R.id.your_menu_id
la source
Cela sera probablement ajouté dans les prochaines mises à jour. Mais en attendant, pour ce faire, vous pouvez utiliser la réflexion.
Créez une vue personnalisée à partir de BottomNavigationView et accédez à certains de ses champs.
Et puis utilisez-le dans votre fichier de mise en page xml.
la source
Il suffit d'ajouter une autre façon d'effectuer une sélection par programme - c'est probablement ce qui était l'intention en premier lieu ou peut-être que cela a été ajouté plus tard.
Le
performIdentifierAction
prend unMenu
identifiant d'élément et un indicateur.Consultez la documentation pour plus d'informations.
la source
Semble être corrigé dans SupportLibrary 25.1.0 :) Edit: Il semble être fixe, que l'état de la sélection est sauvegardé, lors de la rotation de l'écran.
la source
Au-dessus de l'API 25, vous pouvez utiliser setSelectedItemId (menu_item_id) mais sous l'API 25, vous devez faire différemment, le menu utilisateur pour obtenir la poignée, puis définirChecked sur l'élément spécifique vérifié
la source
Utilisez ceci pour définir l'élément de menu de navigation inférieur sélectionné par identifiant de menu
la source
Je ne veux pas modifier votre code. Si tel est le cas, je vous ai recommandé d'essayer BottomNavigationViewEx。
Vous avez juste besoin de remplacer, d'appeler une méthode
setCurrentItem(index);
etgetCurrentItem()
。la source
utilisation
la source
J'ai fait un bug à Google sur le fait qu'il n'y a pas de moyen fiable de sélectionner la page sur un BottomNavigationView: https://code.google.com/p/android/issues/detail?id=233697
NavigationView avait apparemment un problème similaire, qu'ils ont résolu en ajoutant une nouvelle méthode setCheckedItem ().
la source
Vous pouvez essayer la méthode performClick:
la source
La réflexion est une mauvaise idée.
Dirigez-vous vers cet essentiel . Il existe une méthode qui effectue la sélection mais invoque également le rappel:
la source
callOnClick()
place deperformClick()
, de cette façon je n'ai pas besoin de désactiver le son, qui ne fonctionnait pas deperformClick()
toute façon.Le seul «moins» de la solution est l'utilisation
MenuItemImpl
, qui est «interne» à la bibliothèque (bien que publique).la source
SI VOUS AVEZ BESOIN DE PASSER DYNAMIQUEMENT DES ARGUMENTS DE FRAGMENT, FAITES CELA
Il y a beaucoup de réponses (pour la plupart répétées ou obsolètes) ici mais aucune d'elles ne répond à un besoin très courant: passer dynamiquement différents arguments au fragment chargé dans un onglet .
Vous ne pouvez pas passer dynamiquement différents arguments au fragment chargé en utilisant
setSelectedItemId(R.id.second_tab)
, ce qui finit par appeler le staticOnNavigationItemSelectedListener
. Pour surmonter cette limitation, j'ai fini par faire cela dans monMainActivity
qui contient les onglets:La
ArticleFragment.newInstance()
méthode est implémentée comme d'habitude:la source
J'espère que ça aide
Il s'agit plus de déterminer le fragment par défaut chargé en même temps avec l'élément de menu de navigation inférieur correspondant. Vous pouvez inclure la même chose dans vos rappels OnResume
la source
Cette méthode fonctionne pour moi.
la source