いくつかの条件に基づいて、BottomNavigationViewのメニュー項目を動的に非表示にします。以下を試してみましたが、うまくいきません。
mBottomNavigationView.getMenu()
.findItem(R.id.item_name)
.setVisible(false);
mBottomNavigationView.invalidate();
mBottomNavigationView.getMenu().removeItem(R.id.item_name);
removeItemはトリックを行います。 setVisibleメソッドが機能しない理由がわかりません。
私はほとんどの解決策を試しましたが、これは私のために働いた、
アイテムを動的に非表示にする場合:bottomNavigationView.findViewById(R.id.xyz).setVisibility(View.GONE);
アイテムを表示するには:bottomNavigationView.findViewById(R.id.xyz).setVisibility(View.VISIBLE);
Kotlinの推奨プロパティisVisible
を使用してfalse
として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
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への応答を停止しました...
setVisibilityが機能するはずです。参考までに、下の例はkotlinにあります。
bottomNavigationView.menu.findItem(R.id.navigation_item_two).isVisible = false
私の場合、ツールバーのテキストと、アプリケーションの初期読み込みを処理する承認フラグメントの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" />
Kotlinでは次のように動作します:
bottomNavigationView.rootView.findViewById<View>(R.id.nav_nearestRestaurant).visibility = View.GONE
しかし、別のアイテムをクリックすると、非表示のアイテムが再び表示されます。アクティブなアイテムを表示すると下部バーがその外観をリロードするためです(そのため、xmlメニューで表示される場合、私はそのように起こります))