导航抽屉中的项目保持选定状态 Android

16

我的导航抽屉一直显示最后选择的项目。有没有办法去掉它?我希望如果用户在主页,导航抽屉中的项目应该不突出显示。

我已经尝试过

drawer.setSelected(false);

在onResume()中。但这并没有起到帮助作用。

请参考附图,它将有助于理解。

查看设置选项即使我从设置活动返回也会被突出显示


如果您点击它,抽屉是否关闭?您能分享您的XML和代码吗? - Nikhil
你是否已经为这些项目设置了点击操作? - RamithDR
12个回答

27

除了上述解决方案外,如果你的drawer_view.xml文件中的group元素包含以下属性:

android:checkableBehavior="single"

就像下面的示例所示:

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

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

以上解决方案均未生效。因此,请确保您不使用该属性,如果您不想使用高亮功能。


这个方法有妙用。我粘贴了代码,甚至没有看到它。 - FirstOne
android:checkable也能胜任: <item android:title="我的可点击但不可选择的选项" android:checkable="false" ...> - Grzegorz Dev
3
在使用这些属性之前,开发人员应该首先学习它们。最好将像“设置”、“评价应用”、“分享应用”之类的项目与 android:checkableBehavior="none" 一起放在同一组中。其他项目(例如用于选择片段的项目)应该与 android:checkableBehavior="single" 放在同一组中。因此,对于应该被选择的项目,请使用“single”,对于不应被选择的项目,请使用“none”。 - user25

12

我使用

@Override
protected void onResume() {
    super.onResume();
    for (int i = 0; i < navigationView.getMenu().size(); i++) {
        navigationView.getMenu().getItem(i).setChecked(false);
    }
}
如果不起作用,还需添加:itemOfMenu.setChecked(false);onNavigationItemSelected 的覆盖方法的末尾。

对于 Kotlin navigationView.menu.iterator().forEach { it.isChecked = false } - user25
虽然我不明白为什么有人需要它。如果您根本不想选择您的项目,则只需将所有项目包装在组中,并设置android:checkableBehavior="none",永远不要调用items.checked = true - user25

6
请使用下面的代码:
navigationView.getMenu().getItem(0).setChecked(false);

在调用setNavDrawer();方法之后调用此方法。 getItem(int index)方法获取MenuItem,然后您可以在该MenuItem上调用setChecked(true);,您只需要找到默认元素索引是什么,并将0替换为该索引即可。
您可以通过调用以下方式选择(突出显示)项目:
onNavigationItemSelected(navigationView.getMenu().getItem(0));

注意:对于Nexus 4,支持库版本为24.0.0。我建议使用navigationView.setCheckedItem(id);

基本上,您需要循环遍历所有项并调用 setChecked(false);。这看起来很丑。 - user25
4
最好将“设置”项目放在带有android:checkableBehavior="none"属性的组中。其他项目应该放在带有android:checkableBehavior="single"属性的组中。 - user25
@user25 navigationView.setCheckedItem(id) 不难看;它接受一个导航id,而不是索引。 - Zhiyong

4
在你的菜单资源文件中,将android:checkableBehavior设置为none。 android:checkableBehavior="none" enter image description here

4
请使用以下内容:
navigationView.getCheckedItem().setChecked(false);

1
迭代每个菜单项相比,更加高效。 - Oush

3
我认为最好的方式是在navigationView中使用以下代码选项:
menuItem.setCheckable( false );

navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) {
                        menuItem.setCheckable( false );
                        mDrawerLayout.closeDrawers();
                        return true;
                        }
                    });

最佳答案,完全符合我所寻找的。 - Absar Alam

3

如果您正在使用 Kotlin,这就是答案:

menuItem.isCheckable = false

1

@Zakir的回答基础上,如果像我一样你的NavigationView中包含子菜单,则上述代码不会影响任何包含在子菜单中的项目。

为了解决这个问题,我实现了下面的递归方法来清除所有项目:

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);
        }
    }
}

0
如果你看一下谷歌应用的工作方式,你会发现它们是通过触摸选择的。 为了做到这一点,我们需要在抽屉关闭事件中取消选择最后一个选定的项目(或者取消所有选定的项目)。
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
您可以使用此方法除了用户单击的项目,删除所有项目上的setChecked。
在@Zakir的答案中添加了一个方法,该方法会删除先前选定的项目,并且setChecked(true)仅适用于单击的项目,您只需要在item onClickListener中调用此方法,并需要传递一个需要项目索引的参数。
 private void setItemChecked(int itemIndex) {
    for (int i = 0; i < navigationView.getMenu().size(); i++) {
        navigationView.getMenu().getItem(i).setChecked(false);
    }
    navigationView.getMenu().getItem(itemIndex).setChecked(true);
}

例如,如果您像这样调用该方法setItemChecked(2),那么它将为除了第二个索引项(即您传递的参数)之外的所有项设置为未选中状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接