web-dev-qa-db-fra.com

L'élément du tiroir de navigation reste sélectionné Android

Mon tiroir de navigation affiche toujours le dernier élément sélectionné. Existe-t-il un moyen de le supprimer? Je veux que si l'utilisateur est sur la page d'accueil, les éléments du tiroir de navigation ne soient pas mis en surbrillance.

J'ai essayé

drawer.setSelected(false);

dans onResume (). Mais ça n'aide pas.

Veuillez vous référer à la capture d'écran ci-jointe, elle vous aidera à comprendre.

See the seetings options is highlighted even when I have come back from Settings activity

14
The Bat

Utilisez le code ci-dessous:

navigationView.getMenu().getItem(0).setChecked(false);

Appelez cette méthode après avoir appelé setNavDrawer();

La méthode getItem(int index) obtient le MenuItem alors vous pouvez appeler la setChecked(true); sur ce MenuItem, tout ce qu'il vous reste à faire est de trouver quel élément l'index a la valeur par défaut et remplacez le 0 par cet index.

Vous pouvez sélectionner (mettre en surbrillance) l'élément en appelant:

onNavigationItemSelected(navigationView.getMenu().getItem(0));

Remarque: Pour nexus 4, prenez en charge la révision de la bibliothèque 24.0.0. Je recommande d'utiliser navigationView.setCheckedItem(id);

3
Chirag Arora

En plus des solutions ci-dessus, si l'élément de groupe dans votre fichier tiroir_view.xml inclut l'attribut ci-dessous,

Android:checkableBehavior="single"

comme le montre l'exemple ci-dessous:

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

    <group Android:checkableBehavior="single" > 
        <item
            ... />
        <item
          ... />
    </group>
</menu>

aucune des solutions ci-dessus ne fonctionne. Assurez-vous donc que vous n'utilisez pas cet attribut si vous ne souhaitez pas cette fonction de surbrillance.

20
oiyio

J'utilise

@Override
protected void onResume() {
    super.onResume();
    for (int i = 0; i < navigationView.getMenu().size(); i++) {
        navigationView.getMenu().getItem(i).setChecked(false);
    }
}

si cela n'a pas fonctionné, ajoutez également:

itemOfMenu.setChecked(false);

à la fin de la substitution de onNavigationItemSelected.

8
Zakir

Utilisez ceci:

navigationView.getCheckedItem().setChecked(false);
3
masoomyf

Ajoutant à la réponse de @ Zakir , si comme moi vous avez des sous-menus contenus dans votre NavigationView, le code ci-dessus n'affecte aucun élément contenu dans lesdits sous-menus.

Pour résoudre ce problème, j'ai implémenté la méthode récursive ci-dessous pour effacer tous les éléments:

private void clearCheckedItems(Menu menu){
    for (int i = 0; i < menu.size(); i++) {
        MenuItem item = menu.getItem(i);
        if(item.hasSubMenu()){
            clearMenuChecked(item.getSubMenu());
        }else{
            item.setChecked(false);
        }
    }
}
1
David Passmore

définissez Android: checkableBehavior sur none dans votre fichier de ressources de menu Android:checkableBehavior="none"enter image description here

1
Koorosh Ghorbani

Si vous utilisez Kotlin, voici la réponse:

menuItem.isCheckable = false
1
foroogh.Varmazyar

Si vous regardez comment fonctionnent les applications Google, vous verrez la sélection au toucher. Pour ce faire, nous devons désélectionner le dernier élément sélectionné (ou tout simplement tous) lors de l'événement de fermeture du tiroir.

private int _selectedItemID = -1;

ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
{
    public void onDrawerClosed(View view)
    {
        super.onDrawerClosed(view);

        NavigationView navigationView = (NavigationView)view;

        Menu menu = navigationView.getMenu();

        MenuItem menuItem = menu.findItem(_selectedItemID);

        if(menuItem != null)
        {
            menuItem.setChecked(false);
        }
    }

    public void onDrawerOpened(View drawerView)
    {
        super.onDrawerOpened(drawerView);
    }
};

public boolean onNavigationItemSelected(MenuItem item)
{
    // Handle navigation view item clicks here.
    _selectedItemID  = item.getItemId();
}
0
Rusty Labs