【问题标题】:How to programatically disable and enable items every time an Android NavigationView is displayed每次显示 Android NavigationView 时如何以编程方式禁用和启用项目
【发布时间】:2016-04-07 22:08:45
【问题描述】:

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

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

back.setEnabled(webView.canGoBack());

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

但是,我无法使用 NavigationView 复制此行为。是否有类似onPrepareOptionsMenu() 的方法或类在每次准备 NavigationView 时调用?

附言。其他解决过类似问题的人总是提到使用 ListView,这是一种较旧的填充导航抽屉的方法。这个问题特别涉及使用带有菜单的 NavigationView。

【问题讨论】:

    标签: android navigationview android-navigationview


    【解决方案1】:

    这个问题的答案是添加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());
        }
    });
    

    【讨论】:

      【解决方案2】:

      NavigationView 使用getMenu() 公开其底层菜单。您可以使用它来查找菜单项并对其进行更改。

      【讨论】:

      • 是的,我知道。但是每次显示 NavigationView 时,你重写什么方法来更新菜单项的状态?
      猜你喜欢
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2011-01-26
      相关资源
      最近更新 更多