我已经实现了导航抽屉,它工作正常。当导航器关闭时,我必须使所选项目取消选择的唯一问题。我想知道如何才能获得所选菜单项的索引值。
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
menuItem.setChecked(false);
}
)}
答案 0 :(得分:15)
一种方法是将菜单项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);
答案 1 :(得分:4)
使int
数据类型的变量位置。首先将其值设置为0并且onNavigationItemSelected将其值更改为menuItem
索引(如0或1或2,依此类推)。现在,位置将为您提供索引精选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;
}
});
答案 2 :(得分: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;
}
});
答案 3 :(得分:2)
这就是你所需要的,它取消选择并选择新的
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;
}
答案 4 :(得分: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;
}
}
....
}
您可以更改菜单项的顺序而不会破坏任何内容
答案 5 :(得分:0)
另一种对我有用的简单方法
public boolean onNavigationItemSelected(MenuItem item) {
int index = (item.getItemId() % item.getGroupId())-1;
....
}
我认为,这比使用For loop或Switch案例更有效。
如果您仍然遇到问题,那么我的建议是检查Log-cat中的项目ID和组ID,以便您更好地了解您正在处理的内容。