11

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

谢谢!

4

5 回答 5

11

我找到了一个简单的解决方案。您可以使用 Menu 的方法分配订单add(...)。然后您可以使用 MenuItems 的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;
    }
});
于 2016-02-23T07:20:44.277 回答
9

更新

您可以使用此技巧获得位置

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;
    }
});
于 2015-08-07T07:36:37.340 回答
3

如果您为菜单项指定“android:orderInCategory”属性,您就可以接受它的订单:

<?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
}
于 2020-11-16T08:16:53.230 回答
1

如果您正在使用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;
    }
});
于 2017-02-26T00:34:36.293 回答
0

就我而言,我使用

第一次测试这个..

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;
}
于 2016-07-11T14:41:05.497 回答