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

时间:2017-07-12 07:37:49

标签: android bottomnavigationview

我想根据某些条件动态隐藏BottomNavigationView的菜单项。我试过以下但是没有用。

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

mBottomNavigationView.invalidate();

9 个答案:

答案 0 :(得分:41)

mBottomNavigationView.getMenu().removeItem(R.id.item_name);

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

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

在你的bottom_menu.xml

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

在您的activity.cs

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

尽管如此,通过此设置,当所有菜单项都可见时,菜单项的已检查更改状态将不再显示。 还尝试以编程方式将菜单项添加到空组,但该组停止响应GroupDisable ...

答案 3 :(得分:1)

setVisibility应该适合您。仅供参考,下面的例子是在科特林。

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

答案 4 :(得分:1)

您可以使用 Kotlin 中的建议属性isVisiblefalse设置为isVisible来隐藏菜单项。但这会使您的菜单项从 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

答案 5 :(得分:0)

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

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文件中声明的内容。如果为true,我们将遍历菜单项并将其图标,标题及其状态设置为默认值。如果为false,则将图标设置为透明图标(删除图标会影响其大小),将工具栏标题设置为空字符串,然后将其禁用。

BottomNavigationView菜单:

<?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:width="24dp"
    android:height="24dp"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <path
        android:fillColor="#00FFFFFF"
        android:pathData="M8" />
</vector>

空标题(title_empty):

<string name="title_empty" />

答案 6 :(得分:0)

它在Kotlin中对我有效,如下所示:

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

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

答案 7 :(得分:0)

尝试

navView.getMenu()。findItem()。setVisible(true); navView.getMenu()。findItem()。setVisible(false);

答案 8 :(得分:0)

在Kotlin中,您可以使用以下代码行:

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