如何在 android 中的导航抽屉内添加可折叠菜单项?
How to add a collapsible menu item inside navigation drawer in android?
我有一个 DrawerLayout
包含一个 NavigationView
并且此布局 activity 用作我应用程序中所有活动的通用导航抽屉。我在导航视图中为 app:menu
提供菜单资源。我有一些菜单项,但我希望其中一个菜单项是 collapsible/expandable,这样当我单击它时,它会展开以显示两个子菜单,并在第二次单击时再次折叠。
我已经通过在 <item>
中添加另一个 <menu>
添加了子菜单,但无法做到 collapsible/expandable。
此外,我不想将 ExpandableListView
用于我的目的。相反,我只需要在菜单资源文件中做一些调整。请给我指出正确的方向。我搜索 Google 只是为了找到使用 ExpandableListView
的可折叠列表项的代码、博客和示例,但我需要它与设计支持库中的 NavigationView
设计小部件一起使用。
这是我的菜单文件代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_aboutus"
android:title="About Us" />
<item
android:id="@+id/nav_faq"
android:title="FAQs" />
<item
android:id="@+id/nav_share"
android:title="Share" />
<item
android:id="@+id/nav_myaccount"
android:title="My Account" />
<item
android:id="@+id/nav_legal"
android:title="Legal" >
<menu>
<item
android:id="@+id/nav_tnc"
android:title="Terms and Conditions" />
<item
android:id="@+id/nav_pp"
android:title="Privacy Policy" />
</group>
</menu>
</item>
</menu>
我希望 Legal 菜单项可以扩展为具有两个子菜单项 'Terms and Conditions'、'Privacy Policy'。
您可以在导航抽屉内使用可扩展列表视图,我不明白您为什么不想使用它们。可以在此处找到更多相关信息 http://developer.android.com/reference/android/widget/ExpandableListView.html
如果您坚持不使用 expandableListView,则另一种方法是使用菜单的 OnSelect 为特定项目自行设计扩展。虽然我真的不知道你为什么想要这个,但你只是在重新实现轮子。
有一个技巧可以在不使用 ExpandableListView.Add 通常在菜单布局文件中的那些菜单项和 hide/show 在您想要在其下显示它们的菜单项的项目单击时使用它们:
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
NavigationView nv= (NavigationView) findViewById(R.id.nav_view);
Menu m=nv.getMenu();
int id = item.getItemId();
if (id == R.id.nav_posts) {
boolean b=!m.findItem(R.id.nav_class).isVisible();
//setting submenus visible state
m.findItem(R.id.nav_class).setVisible(b);
m.findItem(R.id.nav_dept).setVisible(b);
m.findItem(R.id.nav_batch).setVisible(b);
m.findItem(R.id.nav_campus).setVisible(b);
return true;
} else if (id == R.id.nav_walls) {
boolean b=!m.findItem(R.id.nav_wall_events).isVisible();
//setting submenus visible state
m.findItem(R.id.nav_wall_events).setVisible(b);
m.findItem(R.id.nav_wall_fun).setVisible(b);
m.findItem(R.id.nav_wall_hadith).setVisible(b);
m.findItem(R.id.nav_wall_news).setVisible(b);
m.findItem(R.id.nav_wall_Poetry).setVisible(b);
return true;
} else if (id == R.id.nav_com) {
m.findItem(R.id.nav_share).setVisible(false);
m.findItem(R.id.nav_send).setVisible(false);
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
菜单布局文件是:
<?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/nav_posts"
android:icon="@drawable/ic_menu_camera"
android:title="Posts" />
<item
android:id="@+id/nav_class"
android:title="Class"
android:visible="false" />
<item
android:id="@+id/nav_dept"
android:title="Department"
android:visible="false" />
<item
android:id="@+id/nav_batch"
android:title="Batch"
android:visible="false" />
<item
android:id="@+id/nav_campus"
android:title="Campus"
android:visible="false" />
<item
android:id="@+id/nav_walls"
android:icon="@drawable/ic_menu_gallery"
android:title="Walls" />
<item
android:id="@+id/nav_wall_news"
android:title="News"
android:visible="false" />
<item
android:id="@+id/nav_wall_events"
android:title="Events"
android:visible="false" />
<item
android:id="@+id/nav_wall_fun"
android:title="Fun"
android:visible="false" />
<item
android:id="@+id/nav_wall_hadith"
android:title="Hadith"
android:visible="false" />
<item
android:id="@+id/nav_wall_Poetry"
android:title="Poetry"
android:visible="false" />
</group>
<item
android:id="@+id/nav_com"
android:title="Communicate">
<menu>
<item
android:id="@+id/nav_share"
android:icon="@drawable/ic_menu_share"
android:title="Share" />
<item
android:id="@+id/nav_send"
android:icon="@drawable/ic_menu_send"
android:title="Send" />
</menu>
</item>
</menu>
在菜单布局文件中:
<item
android:title="Setup"
android:id="@+id/SetupGr"
android:icon="@drawable/setup"
/>
<group
android:checkableBehavior="none"
android:id="@+id/SetupGroup">
<item
android:id="@+id/setupOutdoor"
android:icon="@drawable/outdoor"
android:title="Outdoor" />
<item
android:id="@+id/setupClocks"
android:icon="@drawable/ic_launcher"
android:title="Clocks" />
<item
android:id="@+id/selectMaps"
android:icon="@drawable/map"
android:title="Select map" />
</group>
在 MyActivity.java - 加载所需的菜单:
public void LoadNavMenu(int iMenu){
navigationView.getMenu().clear();
navigationView.inflateMenu(iMenu);
navigationView.getMenu().setGroupVisible(R.id.HelpGroup,false);
navigationView.getMenu().setGroupVisible(R.id.SetupGroup,false);
}
和 OnNavigationItemSelected:
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
navigationView.getMenu().setGroupVisible(R.id.HelpGroup,false);
navigationView.getMenu().setGroupVisible(R.id.SetupGroup,false);
switch (item.getItemId()){
case R.id.HelpGr:
navigationView.getMenu().setGroupVisible(R.id.HelpGroup,true);
navigationView.getMenu().setGroupVisible(R.id.SetupGroup,false);
return true;
case R.id.SetupGr:
navigationView.getMenu().setGroupVisible(R.id.SetupGroup,true);
navigationView.getMenu().setGroupVisible(R.id.HelpGroup,false);
return true;
}
base.closeDrawer(GravityCompat.START);
return true;
}
我有 1 个项目 - 设置 - 当用户 select 它时 - 我设置了带有 id 的组 - SetupGroup - 可见并且 return 没有关闭抽屉。否则 - 我将所有组设置为不可见。
除了@Stoyan Mihaylov 和@arslan 的回答之外,不要在 onNavigationItemSelected() 中实现可见性!菜单不会刷新。延迟执行,例如:
if (id == R.id.nav_settingsMenu) {
//expandable submenu
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//Menu will refresh if toggled with delay
boolean b=!navigationView.getMenu().findItem(R.id.nav_1).isVisible();
navigationView.getMenu().findItem(R.id.nav_1).setVisible(b); //to keep state
navigationView.getMenu().setGroupVisible(R.id.nav_settingSubmenu,b);
}
},50);
return true;
}
我有一个 DrawerLayout
包含一个 NavigationView
并且此布局 activity 用作我应用程序中所有活动的通用导航抽屉。我在导航视图中为 app:menu
提供菜单资源。我有一些菜单项,但我希望其中一个菜单项是 collapsible/expandable,这样当我单击它时,它会展开以显示两个子菜单,并在第二次单击时再次折叠。
我已经通过在 <item>
中添加另一个 <menu>
添加了子菜单,但无法做到 collapsible/expandable。
此外,我不想将 ExpandableListView
用于我的目的。相反,我只需要在菜单资源文件中做一些调整。请给我指出正确的方向。我搜索 Google 只是为了找到使用 ExpandableListView
的可折叠列表项的代码、博客和示例,但我需要它与设计支持库中的 NavigationView
设计小部件一起使用。
这是我的菜单文件代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_aboutus"
android:title="About Us" />
<item
android:id="@+id/nav_faq"
android:title="FAQs" />
<item
android:id="@+id/nav_share"
android:title="Share" />
<item
android:id="@+id/nav_myaccount"
android:title="My Account" />
<item
android:id="@+id/nav_legal"
android:title="Legal" >
<menu>
<item
android:id="@+id/nav_tnc"
android:title="Terms and Conditions" />
<item
android:id="@+id/nav_pp"
android:title="Privacy Policy" />
</group>
</menu>
</item>
</menu>
我希望 Legal 菜单项可以扩展为具有两个子菜单项 'Terms and Conditions'、'Privacy Policy'。
您可以在导航抽屉内使用可扩展列表视图,我不明白您为什么不想使用它们。可以在此处找到更多相关信息 http://developer.android.com/reference/android/widget/ExpandableListView.html
如果您坚持不使用 expandableListView,则另一种方法是使用菜单的 OnSelect 为特定项目自行设计扩展。虽然我真的不知道你为什么想要这个,但你只是在重新实现轮子。
有一个技巧可以在不使用 ExpandableListView.Add 通常在菜单布局文件中的那些菜单项和 hide/show 在您想要在其下显示它们的菜单项的项目单击时使用它们:
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
NavigationView nv= (NavigationView) findViewById(R.id.nav_view);
Menu m=nv.getMenu();
int id = item.getItemId();
if (id == R.id.nav_posts) {
boolean b=!m.findItem(R.id.nav_class).isVisible();
//setting submenus visible state
m.findItem(R.id.nav_class).setVisible(b);
m.findItem(R.id.nav_dept).setVisible(b);
m.findItem(R.id.nav_batch).setVisible(b);
m.findItem(R.id.nav_campus).setVisible(b);
return true;
} else if (id == R.id.nav_walls) {
boolean b=!m.findItem(R.id.nav_wall_events).isVisible();
//setting submenus visible state
m.findItem(R.id.nav_wall_events).setVisible(b);
m.findItem(R.id.nav_wall_fun).setVisible(b);
m.findItem(R.id.nav_wall_hadith).setVisible(b);
m.findItem(R.id.nav_wall_news).setVisible(b);
m.findItem(R.id.nav_wall_Poetry).setVisible(b);
return true;
} else if (id == R.id.nav_com) {
m.findItem(R.id.nav_share).setVisible(false);
m.findItem(R.id.nav_send).setVisible(false);
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
菜单布局文件是:
<?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/nav_posts"
android:icon="@drawable/ic_menu_camera"
android:title="Posts" />
<item
android:id="@+id/nav_class"
android:title="Class"
android:visible="false" />
<item
android:id="@+id/nav_dept"
android:title="Department"
android:visible="false" />
<item
android:id="@+id/nav_batch"
android:title="Batch"
android:visible="false" />
<item
android:id="@+id/nav_campus"
android:title="Campus"
android:visible="false" />
<item
android:id="@+id/nav_walls"
android:icon="@drawable/ic_menu_gallery"
android:title="Walls" />
<item
android:id="@+id/nav_wall_news"
android:title="News"
android:visible="false" />
<item
android:id="@+id/nav_wall_events"
android:title="Events"
android:visible="false" />
<item
android:id="@+id/nav_wall_fun"
android:title="Fun"
android:visible="false" />
<item
android:id="@+id/nav_wall_hadith"
android:title="Hadith"
android:visible="false" />
<item
android:id="@+id/nav_wall_Poetry"
android:title="Poetry"
android:visible="false" />
</group>
<item
android:id="@+id/nav_com"
android:title="Communicate">
<menu>
<item
android:id="@+id/nav_share"
android:icon="@drawable/ic_menu_share"
android:title="Share" />
<item
android:id="@+id/nav_send"
android:icon="@drawable/ic_menu_send"
android:title="Send" />
</menu>
</item>
</menu>
在菜单布局文件中:
<item
android:title="Setup"
android:id="@+id/SetupGr"
android:icon="@drawable/setup"
/>
<group
android:checkableBehavior="none"
android:id="@+id/SetupGroup">
<item
android:id="@+id/setupOutdoor"
android:icon="@drawable/outdoor"
android:title="Outdoor" />
<item
android:id="@+id/setupClocks"
android:icon="@drawable/ic_launcher"
android:title="Clocks" />
<item
android:id="@+id/selectMaps"
android:icon="@drawable/map"
android:title="Select map" />
</group>
在 MyActivity.java - 加载所需的菜单:
public void LoadNavMenu(int iMenu){
navigationView.getMenu().clear();
navigationView.inflateMenu(iMenu);
navigationView.getMenu().setGroupVisible(R.id.HelpGroup,false);
navigationView.getMenu().setGroupVisible(R.id.SetupGroup,false);
}
和 OnNavigationItemSelected:
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
navigationView.getMenu().setGroupVisible(R.id.HelpGroup,false);
navigationView.getMenu().setGroupVisible(R.id.SetupGroup,false);
switch (item.getItemId()){
case R.id.HelpGr:
navigationView.getMenu().setGroupVisible(R.id.HelpGroup,true);
navigationView.getMenu().setGroupVisible(R.id.SetupGroup,false);
return true;
case R.id.SetupGr:
navigationView.getMenu().setGroupVisible(R.id.SetupGroup,true);
navigationView.getMenu().setGroupVisible(R.id.HelpGroup,false);
return true;
}
base.closeDrawer(GravityCompat.START);
return true;
}
我有 1 个项目 - 设置 - 当用户 select 它时 - 我设置了带有 id 的组 - SetupGroup - 可见并且 return 没有关闭抽屉。否则 - 我将所有组设置为不可见。
除了@Stoyan Mihaylov 和@arslan 的回答之外,不要在 onNavigationItemSelected() 中实现可见性!菜单不会刷新。延迟执行,例如:
if (id == R.id.nav_settingsMenu) {
//expandable submenu
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//Menu will refresh if toggled with delay
boolean b=!navigationView.getMenu().findItem(R.id.nav_1).isVisible();
navigationView.getMenu().findItem(R.id.nav_1).setVisible(b); //to keep state
navigationView.getMenu().setGroupVisible(R.id.nav_settingSubmenu,b);
}
},50);
return true;
}