我试图在我的一个项目中使用NavigationView来实现侧面菜单。该应用有两种类型的用户:管理员和用户。
我创建了登录活动,我以用户或管理员身份登录。我将名称,电子邮件通过intent(putExtra)传递给我的NavigationActivity。
由于我有两种类型的用户,我创建了两种类型的菜单(管理员有更多菜单选项)。
我从意图中检查传递的值的内容,并相应地膨胀导航视图菜单。
我的问题是我不知道如何在听众中分离两种类型的菜单。我应该在每个案例中为我的if else创建两个听众吗?什么是正确的方法?我这样做的方式不能正常工作,在我的旁边菜单中,我有用户菜单中的前两项,然后是管理菜单中的重新项目。
这里是代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_navigation);
Bundle extras = getIntent().getExtras();
String name = extras.getString("name");
String email = extras.getString("email");
toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);
navigationView = (NavigationView) findViewById(R.id.navigation_view);
if(name.equals("admin")){
// listener for admin here?
navigationView.inflateMenu(R.menu.admin_drawer);
}else{
// listener for user here?
navigationView.inflateMenu(R.menu.user_drawer);
}
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
// questionable part here, doesn't work correctly
@Override
public boolean onNavigationItemSelected(MenuItem item) {
if(item.isChecked())
item.setChecked(false);
drawerLayout.closeDrawers();
switch (item.getItemId()){
// this is for user
case R.id.test:
Toast.makeText(getApplicationContext(), "Test Selected", Toast.LENGTH_SHORT).show();
TestFragment testFragment = new TestFragment();
android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frameholder, testFragment);
fragmentTransaction.commit();
return true;
// this is for user
case R.id.practice:
Toast.makeText(getApplicationContext(),"Practice Selected",Toast.LENGTH_SHORT).show();
break;
// this is for admin
case R.id.existing_questions:
Toast.makeText(getApplicationContext(),"Questions Selected",Toast.LENGTH_SHORT).show();
break;
// this is for admin
case R.id.new_questions:
Toast.makeText(getApplicationContext(),"New questions Selected",Toast.LENGTH_SHORT).show();
break;
// this is for admin
case R.id.settings:
Toast.makeText(getApplicationContext(),"Settings Selected",Toast.LENGTH_SHORT).show();
break;
// this is for admin
case R.id.users_data:
Toast.makeText(getApplicationContext(),"User data Selected",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
});
编辑:
这里有我使用的两个菜单: admin_drawer.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/existing_questions"
android:checked="false"
android:icon="@drawable/ic_existq"
android:title="Questions" />
<item
android:id="@+id/new_questions"
android:checked="false"
android:icon="@drawable/ic_addq"
android:title="Add question" />
<item
android:id="@+id/settings"
android:checked="false"
android:icon="@drawable/ic_settings"
android:title="Settings" />
<item
android:id="@+id/users_data"
android:checked="false"
android:icon="@drawable/ic_statistics"
android:title="Statistics" />
</group>
</menu>
user_drawer.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/test"
android:checked="false"
android:icon="@drawable/ic_test"
android:title="Test" />
<item
android:id="@+id/practice"
android:checked="false"
android:icon="@drawable/ic_practice"
android:title="Practice" />
</group>
</menu>
答案 0 :(得分:0)
谢谢cylon。这个错误是我做的。我在xml中膨胀导航视图,然后从代码膨胀到。
答案 1 :(得分:0)
一个好的方法是在同一菜单中使用两个具有不同ID的组。然后你可以使用 .setGroupVisible()轻松地在它们之间切换:
if(name.equals("admin")){
navigationView.menu.setGroupVisible(R.id.menu_group_admin, true);
navigationView.menu.setGroupVisible(R.id.menu_group_user, false);
}
else{
navigationView.menu.setGroupVisible(R.id.menu_group_admin, false);
navigationView.menu.setGroupVisible(R.id.menu_group_user, true);
}
这无缝地工作