如何在每次显示 Android NavigationView 时以编程方式禁用和启用项目
How to programatically disable and enable items every time an Android NavigationView is displayed
我正在将一些菜单项从选项菜单移动到导航菜单。我的应用程序使用由菜单填充的 NavigationView,如 https://developer.android.com/reference/android/support/design/widget/NavigationView.html
中所述
其中一项在 activity 的 WebView
上调用 webView.goBack()
。当它被放置在选项菜单中时,它仅在 webView.canGoBack()
时启用。否则,它被禁用(变灰)。为此,onPrepareOptionsMenu()
包含命令:
back.setEnabled(webView.canGoBack());
因为每次要显示选项菜单时都会调用 onPrepareOptionsMenu()
,这会更新菜单项的状态以正确反映 WebView
的状态。
但是,我无法使用 NavigationView 复制此行为。是否有类似于onPrepareOptionsMenu()
的方法或class每次准备NavigationView时都会调用?
PS。解决过类似问题的其他人总是提到使用 ListView,这是一种填充导航抽屉的较旧方法。这个问题具体涉及使用带有菜单的 NavigationView。
NavigationView 使用 getMenu() 公开其底层菜单。您可以使用它来查找菜单项并对其进行更改。
这个问题的答案是添加一个DrawerListener
并覆盖onDrawerStateChanged
。
// Create the navigation drawer.
drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
// The `DrawerTitle` identifies the drawer in accessibility mode.
drawerLayout.setDrawerTitle(GravityCompat.START, getString(R.string.navigation_drawer));
// Listen for touches on the navigation menu.
final NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView);
navigationView.setNavigationItemSelectedListener(this);
// Get handles for `navigationMenu` and the back and forward menu items. The menu is zero-based, so item 1 and 2 and the second and third items in the menu.
final Menu navigationMenu = navigationView.getMenu();
final MenuItem navigationBackMenuItem = navigationMenu.getItem(1);
final MenuItem navigationForwardMenuItem = navigationMenu.getItem(2);
// The `DrawerListener` allows us to update the Navigation Menu.
drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerStateChanged(int newState) {
// Update the back and forward menu items every time the drawer opens.
navigationBackMenuItem.setEnabled(webView.canGoBack());
navigationForwardMenuItem.setEnabled(webView.canGoForward());
}
});
我正在将一些菜单项从选项菜单移动到导航菜单。我的应用程序使用由菜单填充的 NavigationView,如 https://developer.android.com/reference/android/support/design/widget/NavigationView.html
中所述其中一项在 activity 的 WebView
上调用 webView.goBack()
。当它被放置在选项菜单中时,它仅在 webView.canGoBack()
时启用。否则,它被禁用(变灰)。为此,onPrepareOptionsMenu()
包含命令:
back.setEnabled(webView.canGoBack());
因为每次要显示选项菜单时都会调用 onPrepareOptionsMenu()
,这会更新菜单项的状态以正确反映 WebView
的状态。
但是,我无法使用 NavigationView 复制此行为。是否有类似于onPrepareOptionsMenu()
的方法或class每次准备NavigationView时都会调用?
PS。解决过类似问题的其他人总是提到使用 ListView,这是一种填充导航抽屉的较旧方法。这个问题具体涉及使用带有菜单的 NavigationView。
NavigationView 使用 getMenu() 公开其底层菜单。您可以使用它来查找菜单项并对其进行更改。
这个问题的答案是添加一个DrawerListener
并覆盖onDrawerStateChanged
。
// Create the navigation drawer.
drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
// The `DrawerTitle` identifies the drawer in accessibility mode.
drawerLayout.setDrawerTitle(GravityCompat.START, getString(R.string.navigation_drawer));
// Listen for touches on the navigation menu.
final NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView);
navigationView.setNavigationItemSelectedListener(this);
// Get handles for `navigationMenu` and the back and forward menu items. The menu is zero-based, so item 1 and 2 and the second and third items in the menu.
final Menu navigationMenu = navigationView.getMenu();
final MenuItem navigationBackMenuItem = navigationMenu.getItem(1);
final MenuItem navigationForwardMenuItem = navigationMenu.getItem(2);
// The `DrawerListener` allows us to update the Navigation Menu.
drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerStateChanged(int newState) {
// Update the back and forward menu items every time the drawer opens.
navigationBackMenuItem.setEnabled(webView.canGoBack());
navigationForwardMenuItem.setEnabled(webView.canGoForward());
}
});