如何使用新的 NavigationView 在侦听器中获取 MenuItem 位置

How to get MenuItem position in the listener using the new NavigationView

题目说明了一切。我应该如何使用 NavigationView 检索 onClick 侦听器上的项目位置?另外,为什么没有 getHeader 方法?最后,我以编程方式完成所有操作,但 header 仍然可点击。有什么想法吗?

谢谢!

更新

你可以使用这个技巧获得位置

final List<MenuItem> items = new ArrayList<>();
Menu menu;

NavigationView navigationView = (NavigationView) findViewById(R.id.navigation);.
menu = navigationView.getMenu();

for(int i = 0; i < menu.size(); i++){
    items.add(menu.getItem(i));
}

navigationView.setNavigationItemSelectedListener(new  NavigationView.OnNavigationItemSelectedListener(){
    @Override
    public boolean onNavigationItemSelected(final MenuItem menuItem) {
        // update highlighted item in the navigation menu
        menuItem.setChecked(true);
        int position = items.indexOf(menuItem);

        return true;
    }
});

我找到了一个简单的解决方案。您可以使用菜单的 add(...) method. Then you can retrieve the order using MenuItems's getOrder(...) 方法分配订单。如果您正在使用 xml,则可以使用 android:orderInCategory="..."

NavigationView navigationView = (NavigationView) findViewById(R.id.navigation);.
Menu menu = navigationView.getMenu();

for(int i=0; i < menu.size(); i++){
    items.add(Menu.NONE, Menu.NONE, i, menu.getItem(i));
}

navigationView.setNavigationItemSelectedListener(new  NavigationView.OnNavigationItemSelectedListener(){
    @Override
    public boolean onNavigationItemSelected(final MenuItem menuItem) {
        // update highlighted item in the navigation menu
        menuItem.setChecked(true);
        int position=items.getOrder();
        return true;
    }
});

就我而言,我使用

首先用这个测试..

Log.d(TAG, navigationView.getMenu().getItem(0).isChecked());
Log.d(TAG, navigationView.getMenu().getItem(1).isChecked());
Log.d(TAG, navigationView.getMenu().getItem(2).isChecked());

接下来这个...

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {
        if(navigationView.getMenu().getItem(0).isChecked()) {
            cerrarSesion();
        }else {
            navigationView.getMenu().getItem(0).setChecked(true);
            seleccionarItem(navigationView.getMenu().getItem(0));
        }
    }
    return false;
}

如果您使用 menu_drawer.xml,您只需在项目中添加一个 id,如下所示:

<item
    android:id="@+id/nav_top_stories"
    android:title="@string/txt.menu.item1"
/>

有了这个你只需要在 menuItm.getId():

上测试
 navigationView.setNavigationItemSelectedListener(new  NavigationView.OnNavigationItemSelectedListener(){
    @Override
    public boolean onNavigationItemSelected(final MenuItem menuItem) {
        // update highlighted item in the navigation menu
        menuItem.setChecked(true);

        switch(menuItem.getId()){
           case R.id.txt_menu_item1 : //do what you want to do;
           break;
           case R.id.txt_menu_item2 : // etc,
        }
        return true;
    }
});

如果您使用的是动态菜单,只需使用此方法向您的导航抽屉添加一个项目:

NavigationView.getMenu().add(int groupId, int itemId, int order, CharSequence title)

然后按顺序测试:

navigationView.setNavigationItemSelectedListener(new  NavigationView.OnNavigationItemSelectedListener(){
    @Override
    public boolean onNavigationItemSelected(final MenuItem menuItem) {
        // update highlighted item in the navigation menu
        menuItem.setChecked(true);

        switch(menuItem.getOrder()){
           case 0 : //do what you want to do;
           break;
           case 1 : // etc,
           default : //do whatever you want ;
        }
       return true;
    }
});

如果您为菜单项指定“android:orderInCategory”属性,您可以直接使用它的 order:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:orderInCategory="0"
        android:title="@string/news" />
    <item
        android:orderInCategory="1"
        android:title="@string/search" />
</menu>
val navigationView = findViewById<NavigationView>(R.id.navigation)

navigationView.setNavigationItemSelectedListener { menuItem ->
    val menuItemOrder = menuItem.order

    true
}

或者,如果您不想手动指定订单,请使用此选项:

val navigationView = findViewById<NavigationView>(R.id.navigation)

navigationView.setNavigationItemSelectedListener { menuItem ->
    val menuItemIndex = bottomNavigation.menu.children.indexOf(menuItem)

    true
}