149 votes

Définir l'élément sélectionné dans Android BottomNavigationView

J'utilise les nouveaux 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 modifiée pour revenir au premier élément, après la rotation de l'écran. Bien sûr, il serait également utile, si quelqu'un me le dise, comment "enregistrer" l'état actuel de BottomNavigationView dans la fonction onPause et comment le restaurer dans onResume .

Merci!

213voto

Ricardo Points 3750

À partir de l'API 25.3.0 il a été introduit la méthode de setSelectedItemId(int id) qui vous permet de marquer un point sélectionné comme si c'était exploité.

De docs:

Réglez l'élément de menu sélectionné ID. Le comportement est le même que l'appui sur un élément.

Exemple de Code:

BottomNavigationView bottomNavigationView;
bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNavigationView);
bottomNavigationView.setOnNavigationItemSelectedListener(myNavigationItemListener);
bottomNavigationView.setSelectedItemId(R.id.my_menu_item_id);

IMPORTANT

Vous DEVEZ déjà avoir ajouté tous les éléments dans le menu et réglez l'Auditeur avant d'appeler setSelectedItemId de sorte que le BottomNavigationView pouvez exécuter le code correspondant à son comportement. Si vous appelez setSelectedItemId avant d'ajouter les éléments de menu et le réglage de l'auditeur ne se passera rien.

74voto

karenms Points 1098

Pour programmer par programme l’élément BottomNavigationBar dont vous avez besoin, utilisez:

 View view = bottomNavigationView.findViewById(R.id.menu_action_item);
view.performClick();
 

Cela arrange correctement tous les articles avec leurs étiquettes.

50voto

Vyacheslav Points 1478

Pour ceux qui utilisent encore SupportLibrary < 25.3.0

Je ne suis pas sûr de savoir si c'est une réponse complète à cette question, mais mon problème est très similaire - j'ai du processus d' back appuyez sur le bouton et amener l'utilisateur à l'onglet précédent où il était. Donc, peut-être que ma solution sera utile pour quelqu'un:

private void updateNavigationBarState(int actionId){
    Menu menu = bottomNavigationView.getMenu();

    for (int i = 0, size = menu.size(); i < size; i++) {
        MenuItem item = menu.getItem(i);
        item.setChecked(item.getItemId() == actionId);
    }
}

S'il vous plaît, gardez à l'esprit que si l'utilisateur presse de navigation de l'onglet BottomNavigationView de ne pas effacer l'élément sélectionné, de sorte que vous devez appeler cette méthode dans votre onNavigationItemSelected après le traitement de l'action de navigation:

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
        case R.id.some_id_1:
            // process action
            break;
        case R.id.some_id_2:
            // process action
            break;
        ...
        default:
            return false;
    }

    updateNavigationBarState(item.getItemId());

    return true;
}

Quant à la sauvegarde de l'état de l'instance, je pense que vous pourriez jouer avec le même action id de la navigation à vue et trouver une solution adaptée.

9voto

Boy Points 385

Depuis la version 25.3.0, il est désormais possible d'appeler setSelectedItemId() \ o /

4voto

cpienovi Points 280

Ce sera probablement ajouté dans les prochaines mises à jour. Mais en attendant, vous pouvez utiliser la réflexion.

Créez une vue personnalisée s'étendant de BottomNavigationView et accédez à certains de ses champs.

 public class SelectableBottomNavigationView extends BottomNavigationView {

    public SelectableBottomNavigationView(Context context) {
        super(context);
    }

    public SelectableBottomNavigationView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SelectableBottomNavigationView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void setSelected(int index) {
        try {
            Field f = BottomNavigationView.class.getDeclaredField("mMenuView");
            f.setAccessible(true);
            BottomNavigationMenuView menuView = (BottomNavigationMenuView) f.get(this);

            try {
                Method method = menuView.getClass().getDeclaredMethod("activateNewButton", Integer.TYPE);
                method.setAccessible(true);
                method.invoke(menuView, index);
            } catch (SecurityException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

}
 

Et utilisez-le ensuite dans votre fichier de mise en page XML.

 <com.your.app.SelectableBottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:itemBackground="@color/primary"
        app:itemIconTint="@drawable/nav_item_color_state"
        app:itemTextColor="@drawable/nav_item_color_state"
        app:menu="@menu/bottom_navigation_menu"/>
 

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