如何在每次显示Android NavigationView时通过程序禁用和启用项目



我正在将一些菜单项从选项菜单移动到导航菜单。我的应用程序使用由菜单填充的NavigationView,如中所述https://developer.android.com/reference/android/support/design/widget/NavigationView.html

其中一个项在主活动的WebView上调用webView.goBack()。当它被放置在选项菜单中时,只有当webView.canGoBack()时,它才被启用。否则,它将被禁用(灰显)。为此,onPrepareOptionsMenu()包含以下命令:

back.setEnabled(webView.canGoBack());

由于每次显示选项菜单时都会调用onPrepareOptionsMenu(),这将更新菜单项的状态,以正确反映WebView的状态。

但是,我还不能用NavigationView复制这种行为。是否有类似于onPrepareOptionsMenu()的方法或类在每次准备NavigationView时被调用?

PS。其他解决过类似问题的人总是提到使用ListView,这是一种旧的填充导航抽屉的方法。此问题特别涉及将NavigationView与菜单一起使用。

这个问题的答案是添加一个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通过getMenu()公开其底层Menu。您可以使用它来查找菜单项并对其进行更改。

最新更新