在导航抽屉中获取所选菜单项的索引值

15

我已经实现了导航抽屉,它运行良好。唯一的问题是当导航抽屉关闭时,我必须取消选择选定的项目。我想知道如何获取所选菜单项的索引值。

navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
  @Override
  public boolean onNavigationItemSelected(MenuItem menuItem) {
      menuItem.setChecked(false);
   }
)}

请问您能提供一份代码示例吗? - casillas
请检查我的回答,希望对你有所帮助。 - Chintan Bawa
6个回答

16

一种方法是将菜单项ID存储在变量中,例如 checkedItemID

navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
  @Override
  public boolean onNavigationItemSelected(MenuItem menuItem) {
      menuItemID=menuItem.getItemId();
   }
)}

然后实施

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {

        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            // Do whatever you want here

         navigationView.getMenu().findItem(menuItemID).setChecked(false);
        }

        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            // Do whatever you want here
        }
    };
// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);

5

声明一个数据类型为int的变量position。首先将其值设为0,在onNavigationItemSelected事件中将其值更改为menuItem的索引(如0或1或2等)。现在,这个position变量将为您提供所选menuItem索引

int position = 0;
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(MenuItem menuItem) {
        switch (menuItem.getItemId()) {
           case R.id.first:
                position = 0;
                break;
           case R.id.second:
                position = 1;
                break;
           case R.id.third:
                position = 2;
                break;
        }
        return true;
    }
});

1
如果您更改菜单项的顺序会发生什么?您必须记得更新case语句。 - wal

3
尝试这个方法来获取位置0的导航项:getItem(index)将给您所需的项。
navigationView.getMenu().getItem(selectedposition).setChecked(false);

还可以使用以下链接作为参考,获取所选项目http://thegeekyland.blogspot.in/2015/11/navigation-drawer-how-set-selected-item.html

使用下面的代码获取所选位置

int selectedposition= 0;

    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {
            switch (menuItem.getItemId()) {
               case R.id.firstitemid:
                    selectedposition= 0;
                    break;
               case R.id.seconditemid:
                    selectedposition= 1;
                    break;
               case R.id.thirditemid:
                    selectedposition= 2;
                    break;
            }
            return true;
        }
    });

但是我需要知道所点击的菜单项索引。 - casillas
我需要知道所选项的索引号 navigationView.getMenu().getItem(selectedMenuItemIndex).setChecked(false); - casillas

1
另一个对我有效的简单方法。
public boolean onNavigationItemSelected(MenuItem item) {
    int index = (item.getItemId() % item.getGroupId())-1;
    ....
}

我认为,这比使用 For 循环或 Switch 语句要高效得多。
如果您仍然有问题,我的建议是在 Log-cat 中检查您的项目 ID 和组 ID,以便更好地了解您正在处理的内容。

1
这就是你所需要的,它可以取消选择并选择新的。
navigationView.setCheckedItem(item.getItemId());

请将其放置在onNavigationItemSelected的底部。

为了更清晰,这里有一个示例:

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.nav_home:
            controller.setFragment(new HomeFragment());
            break;
        case R.id.nav_settings:
            controller.setFragment(new SettingsFragment());
            break;
        case R.id.nav_logout:
            Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
            intent.putExtra(autoLogin, false);
            startActivity(intent);
            break;
    }
    navigationView.setCheckedItem(item.getItemId());
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return false;
}

0

首先将您的navigationMenu分配给一个类字段

private NavigationView navigationView;
private int currentPosition;
...
navigationView = (NavigationView) findViewById(R.id.nav_view);

现在在菜单回调函数中,你可以循环遍历菜单项:

public boolean onNavigationItemSelected(MenuItem item) {
    for (int i=0;i<navigationView.getMenu().size();i++){
        if(item==navigationView.getMenu().getItem(i)){
            currentPosition=i;
            break;
        }
    }
 ....
}

您可以更改菜单项的顺序而不会破坏任何内容


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