这个话题说明了一切。我应该如何使用 NavigationView 检索 onClick 侦听器上的项目位置?另外,为什么没有 getHeader 方法?最后我以编程方式做所有事情,但标题仍然是可点击的。有什么想法吗?
谢谢!
这个话题说明了一切。我应该如何使用 NavigationView 检索 onClick 侦听器上的项目位置?另外,为什么没有 getHeader 方法?最后我以编程方式做所有事情,但标题仍然是可点击的。有什么想法吗?
谢谢!
我找到了一个简单的解决方案。您可以使用 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;
}
});
更新
您可以使用此技巧获得位置
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;
}
});
如果您为菜单项指定“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
}
如果您正在使用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;
}
});
就我而言,我使用
第一次测试这个..
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;
}