android - 如何在每次显示 Android NavigationView 时以编程方式禁用和启用项目

标签 android navigationview android-navigationview

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

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

back.setEnabled(webView.canGoBack());

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

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

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());
    }
});

关于android - 如何在每次显示 Android NavigationView 时以编程方式禁用和启用项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36488090/

相关文章:

android - 异常 java.lang.SecurityException : reading . .MediaDocumentsProvider ... 需要 android.permission.MANAGE_DOCUMENTS,或 grantUriPermission()

android - 在 Android 中,如何对 Kinvey 数据存储进行不区分大小写的查询?

swiftui - NavigationView swiftui 不是全屏

xcode - SwiftUI NavigationView/Stack(如果可用)iOS 15/16

Android:导航组件不能同时使用:<navigation> 和 NavigationItemSelectedListener

android - 如何更改 NavigationView 中的分隔符颜色?

android - 在抽屉导航菜单中以编程方式添加项目

android - 在android应用程序中合并两个手势原始文件

Android SeekBar 拇指被剪断/切断

java - Android更改NavigationView中单个项目的背景颜色