web-dev-qa-db-ja.com

BottomNavigationViewでメニュー項目を動的に非表示にする方法は?

いくつかの条件に基づいて、BottomNavigationViewのメニュー項目を動的に非表示にします。以下を試してみましたが、うまくいきません。

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

mBottomNavigationView.invalidate();
23
Ram
mBottomNavigationView.getMenu().removeItem(R.id.item_name);

removeItemはトリックを行います。 setVisibleメソッドが機能しない理由がわかりません。

47
Ram

私はほとんどの解決策を試しましたが、これは私のために働いた、

アイテムを動的に非表示にする場合:bottomNavigationView.findViewById(R.id.xyz).setVisibility(View.GONE);

アイテムを表示するには:bottomNavigationView.findViewById(R.id.xyz).setVisibility(View.VISIBLE);

5

Kotlinの推奨プロパティisVisibleを使用してfalseとしてisVisibleを設定すると、メニュー項目を非表示にできます。しかし、これにより、Android 9BottomNavigationViewからメニュー項目が削除されます。

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
4
abdullahselek

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への応答を停止しました...

2
Bilal Kazi

setVisibilityが機能するはずです。参考までに、下の例はkotlinにあります。

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

私の場合、ツールバーのテキストと、アプリケーションの初期読み込みを処理する承認フラグメントの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);
            }
        }
    }
}

メニューXMLファイルで宣言したものと一致するように、ドロアブルIDの配列とタイトルIDの配列を宣言します。 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" />
0
Taylor Venissat

Kotlinでは次のように動作します:

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

しかし、別のアイテムをクリックすると、非表示のアイテムが再び表示されます。アクティブなアイテムを表示すると下部バーがその外観をリロードするためです(そのため、xmlメニューで表示される場合、私はそのように起こります))