如何在 BottomNavigationView 中动态隐藏菜单项?

Posted

技术标签:

【中文标题】如何在 BottomNavigationView 中动态隐藏菜单项?【英文标题】:How to dynamically hide a menu item in BottomNavigationView? 【发布时间】:2017-12-16 12:07:23 【问题描述】:

我想根据某些条件动态隐藏一个BottomNavigationView的菜单项。我尝试了以下方法,但它不起作用。

mBottomNavigationView.getMenu()
            .findItem(R.id.item_name)
            .setVisible(false);

mBottomNavigationView.invalidate();

【问题讨论】:

您的代码应该可以按预期工作。你也可以试试 postInvalidate() 也尝试过 postInvalidate。它不工作。正如我在下面回答的那样,我使用 removeItem 方法来实现相同的目的。 @santalu 你是认真的吗?它抛出IndexOutOfBoundsException 试试这个 navView.getMenu().findItem(R.id.navigation_close).setVisible(true); navView.getMenu().findItem(R.id.navigation_back).setVisible(false); 【参考方案1】:
mBottomNavigationView.getMenu().removeItem(R.id.item_name);

removeItem 可以解决问题。不知道为什么 setVisible 方法不起作用。

【讨论】:

很高兴您找到了解决方案。我删除了我的答案,因为没有帮助,投了你的票。难道 setVisibility 不是 BottomNavigationView 的方法或其任何继承方法,而它确实使用菜单资源文件,因此可以使用包括 removeItem 的菜单的公共方法?developer.android.com/reference/android/support/design/widget/… 有什么方法可以动态设置可见 @JinsonPaul 我认为 add() 方法会起作用,因为 removeItem 用于删除。但如果有人能解释为什么 setVisible() 方法不起作用,那就太好了。 这对我有用,但如果我的菜单项少于 5 个,则底部导航项的间距不均匀。我认为这可能与“换档模式”有关?在一个完美的世界中,导航会均匀分布任意数量的菜单项...... 嗨@Dan 我也有同样的问题,当我删除一个项目时,它不会均匀分布其余的项目【参考方案2】:

您可以通过在 Kotlin 中使用建议的属性 isVisibleisVisible 设置为 false 来隐藏菜单项。但这会使您的菜单项从 Android 9 上的 BottomNavigationView 中删除,这是我的观察结果。

bottomNavigation.menu.findItem(R.id.menu_item).isVisible = false

如果您为底部导航视图的背景使用单一颜色,您可以使用类似的方法将菜单项保存在适当的位置。例如右边缘的那个。

// 0x000000 is black as an example
bottomNavigation.menu.findItem(R.id.menu_item).icon = ColorDrawable(0x000000)
// and disable for the actions
bottomNavigation.menu.findItem(R.id.menu_item).isEnabled = false

【讨论】:

【参考方案3】:

我尝试了大多数解决方案,但这对我有用,

动态隐藏项目: bottomNavigationView.findViewById(R.id.xyz).setVisibility(View.GONE);

为了使项目可见: bottomNavigationView.findViewById(R.id.xyz).setVisibility(View.VISIBLE);

【讨论】:

对我来说.setVisibility() 给出了一个未解决的参考。 这对我来说非常适合 - 我需要根据用户条件显示和隐藏项目,这比删除和添加更容易。【参考方案4】:

试试这个:

navView.getMenu().findItem(R.id.your_menu_item_id).setVisible(true);
navView.getMenu().findItem(R.id.your_menu_item_id).setVisible(false);

【讨论】:

【参考方案5】:

setVisibility 应该适合你。仅供参考,下面的例子是在 kotlin 中。

bottomNavigationView.menu.findItem(R.id.navigation_item_two).isVisible = false

【讨论】:

你的方法对我不起作用,但 navigation.findViewById<View>(R.id.postEvent).visibility=View.GONE 在 kotlin 中工作。【参考方案6】:

在 Kotlin 中你可以使用这行代码:

 mainActivitbinding.bottomNav.menu.removeItem(R.id.watch_list_tab)

【讨论】:

还有添加项目的方法吗?! LIKE menu.addItem()????【参考方案7】:

当项目被隐藏时,removeItem 会替换栏中的菜单项。我找到了一个稍微好一点的方法。创建一组您想要隐藏菜单 xml 的菜单项。

在你的 bottom_menu.xml 中

<menu...>
    <group android:id="@+id/hiddenmenu">
        <item.../>
        <item.../>
    </group>
    <item.../>
</menu>

在你的activity.cs中

Menu menu = mbottomNavigation.getMenu();  
menu.setGroupEnabled(R.id.hiddenmenu, false);

尽管使用此设置,当所有菜单项都可见时,菜单项的选中更改状态会失控。 还尝试以编程方式将菜单项添加到空组,但该组停止响应 GroupDisable...

【讨论】:

【参考方案8】:

它在 kotlin 中对我有用:

bottomNavigationView.rootView.findViewById<View>(R.id.nav_nearestRestaurant).visibility = View.GONE

但问题是,如果您单击另一个项目,隐藏的项目会再次出现,因为底栏在向您显示活动项目时会重新加载其外观(因此,如果在您的 xml 菜单中,它的可见性会再次出现(我想想,对我来说就是这样))

【讨论】:

【参考方案9】:

在我的例子中,我想在授权片段中隐藏工具栏文本和 BottomNavigationView 项目的图标/标题,它处理我的应用程序的初始加载。当它确定用户已通过身份验证并从数据库中获取他们的个人资料时,我加载提要片段,该片段从数据库中获取数据并将其显示给用户。我所做的是将以下方法添加到创建布局元素并从其片段中调用它的活动中,传入一个布尔值以确定项目的可见性。

public void setBottomNavigationViewItemsVisibility(boolean value) 
    if (this.bottomNavigationView != null) 
        this.bottomNavigationView.setVisibility(View.VISIBLE);
        Menu menu = this.bottomNavigationView.getMenu();
        if (value) 
            int[] icons = R.drawable.ic_event_white_24dp, R.drawable.ic_explore,
                    R.drawable.ic_store_white_24dp, R.drawable.ic_notifications_white_24dp;
            int[] titles = R.string.feed, R.string.explore, R.string.finder, R.string.notifications;
            for (int i = 0; i < menu.size(); i++) 
                menu.getItem(i).setIcon(icons[i]);
                menu.getItem(i).setTitle(titles[i]);
                menu.getItem(i).setEnabled(true);
            
         else 
            for (int i = 0; i < menu.size(); i++) 
                menu.getItem(i).setIcon(R.drawable.ic_empty);
                menu.getItem(i).setTitle(R.string.title_empty);
                menu.getItem(i).setEnabled(false);
            
        
    

我们声明了一个可绘制 ID 数组和一个标题 ID 数组,以匹配我们在菜单 XML 文件中声明的内容。如果为真,我们遍历菜单项并将它们的图标、标题和状态设置为默认值。如果为 false,我们将图标设置为透明图标(移除图标会影响其大小),将工具栏标题设置为空字符串,然后禁用它。

底部导航视图菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/bottom_navigation_view_home">

    <item
        android:id="@+id/action_feed"
        android:enabled="true"
        android:icon="@drawable/ic_event_white_24dp"
        android:title="@string/feed"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_explore"
        android:enabled="true"
        android:icon="@drawable/ic_explore"
        android:title="@string/explore"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_finder"
        android:enabled="true"
        android:icon="@drawable/ic_store_white_24dp"
        android:title="@string/finder"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_notifications"
        android:enabled="true"
        android:icon="@drawable/ic_notifications_white_24dp"
        android:title="@string/notifications"
        app:showAsAction="ifRoom" />
</menu>

空图标 (ic_empty.xml):

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:
    android:
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <path
        android:fillColor="#00FFFFFF"
        android:pathData="M8" />
</vector>

空标题(title_empty):

<string name="title_empty" />

【讨论】:

以上是关于如何在 BottomNavigationView 中动态隐藏菜单项?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BottomNavigationView 中动态隐藏菜单项?

如何禁用 BottomNavigationView 移位模式?

如何在 BottomNavigationView 中设置指标? [复制]

如何在没有 ActionBar 的 AndroidX 中设置 BottomNavigationView

如何通过 Xamarin MvvmCross 中的 BottomNavigationView 在视图模型之间导航

BottomNavigationView - 如何获取选定的菜单项?