setCheckedItem()
を呼び出してナビゲーションビューアイテムを強調表示するか、onNavigationItemSelected
にtrue値を返して選択したアイテムとしてアイテムを表示することは可能ですが、ナビゲーションのチェック済みアイテムのチェックを外す方法はありますか見る?
これはアイテムのチェックを外します:
int size = mNavigationView.getMenu().size();
for (int i = 0; i < size; i++) {
mNavigationView.getMenu().getItem(i).setCheckable(false);
}
私は@arsentソリューションを見て試してみましたが、それは実際にあなたが望むことをします、つまりすべてのアイテムを選択解除することです...しかし、私は次のシナリオで問題を抱えていました:
NavigationView#setCheckedItem
)NavigationView#setCheckedItem
)このシナリオでは、アイテム1はチェック済みとしてマークされません。これは、内部的にナビゲーションビューが手順1で以前に選択したアイテムセットを追跡し、手順2で変更されず、以前に選択したアイテムが現在選択しているアイテムと同じであるため、手順3をスキップするためです。
これを回避するための私の提案(および代替ソリューション)は、ダミーの不可視のアイテムを用意し、NavigationView#setCheckedItem
すべての選択を解除するときはいつでもそのアイテムを選択します。
<item
Android:id="@+id/menu_none"
Android:title=""
Android:visible="false"/>
すべての選択を解除するには
mNavigationView.setCheckedItem(R.id.menu_none);
MenuItems
アイテムを含むすべてのSubMenu
のチェックを外すには、再帰を使用する必要があります-
private void unCheckAllMenuItems(@NonNull final Menu menu) {
int size = menu.size();
for (int i = 0; i < size; i++) {
final MenuItem item = menu.getItem(i);
if(item.hasSubMenu()) {
// Un check sub menu items
unCheckAllMenuItems(item.getSubMenu());
} else {
item.setChecked(false);
}
}
}
上記のメソッドを呼び出して、以下のようにすべてのアイテムのチェックを外します-
unCheckAllMenuItems(navigationView.getMenu());
アイテムをチェック不可にするだけです
<item
Android:id="@+id/profile_item"
Android:checkable="false"
Android:title="@string/profile"/>
@Codeversedを引用すると、「オーバーヘッドを追加してメニュー項目をループする必要はありません!」があります。ただし、複数のグループを作成する必要はありません(この場合、彼は@+id/grp1
および@+id/grp2
を作成しています)。
次のように、Android:checkableBehavior
を使用して、すべての要素に単一のグループを簡単に追加できます。
<group Android:checkableBehavior="single">
<item
Android:id="@+id/id1"
Android:checked="true"
Android:icon="@drawable/drawable1"
Android:title="@string/string1" />
<item
Android:id="@+id/id2"
Android:icon="@drawable/drawable2"
Android:title="@string/string2" />
</group>
NavigationItemSelectedListener
内でチェックを外すには、(UIスレッドへの)postを使用する必要がありました。
_App.getHandler().post(() -> menuItem.setChecked(false));
_
完全な例:
_ NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(
menuItem -> {
menuItem.setChecked(true);
mDrawerLayout.closeDrawers();
switch (menuItem.getItemId()) {
...
}
App.getHandler().post(() -> menuItem.setChecked(false));
return true;
});
_
追伸私の場合、App.getHandler()
はUI Thread LopperのHandler
インスタンスを返します
Joaoのソリューションは、まったく期待どおりに機能しませんでした。これにより、ナビゲーションの未チェックのアイテムビューに空白ができます。
必ず、表示を「なし」に設定してください:
<item
Android:id="@+id/your_menu_item_id_to_hide"
Android:title=""
Android:visible="false"/>
bottomNavigationView.getMenu().findItem(R.id.your_menu_item_id_to_hide).setChecked(true);
bottomNavigationView.findViewById(R.id.your_menu_item_id_to_hide).setVisibility(View.GONE);
この場合、解決策は不要です。
私のような人がこのような方法を使っていると思います
_public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.nav_today:
break;
case R.id.nav_calendar:
navigationView.getMenu().performIdentifierAction(R.id.nav_today, 0);
navigationView.getMenu().getItem(0).setChecked(true);//or
navigationView.setCheckedItem(R.id.nav_today);//or
drawerLayout.closeDrawers();
break;
}
return true;
}
_
_R.id.nav_today
_をクリックした後に_R.id.nav_calendar
_を確認しようとすると(残念ながら_checkableBehavior="single"
_)、残念ながら機能しません。
これは、コードnavigationView.setCheckedItem(R.id.nav_today)
が呼び出された後、_R.id.nav_today
_がすぐにチェックされますが、その後、_R.id.nav_calendar
_をクリックすると自動的にチェックされるためです。
そのため、使用する方法がまったく機能しないようです。それは仕事ですが、すぐにオーバーライドする必要があります。
@arsentと@Rahulの回答を組み合わせて、次のコードを記述します。
private void NavigationView_NavigationItemSelected(object sender, NavigationView.NavigationItemSelectedEventArgs e)
{
var size = navigationView.Menu.Size();
for (int i = 0; i < size; i++)
{
var item= navigationView.Menu.GetItem(i).SetChecked(false);
if (item.HasSubMenu)
{
for (int j = 0; j < item.SubMenu.Size(); j++)
{
item.SubMenu.GetItem(j).SetChecked(false);
}
}
}
e.MenuItem.SetChecked(true);
drawerLayout.CloseDrawers();
}
上記のコードはxamarin c#用で動作しますが、uは簡単にJavaに変換できます
ここで説明したすべてのソリューションを組み合わせて使用する必要がありました。私の場合、アイテムがクリックされたときにURLインテントを開きます(ブラウザーを開きます)。クリックしたアイテムは、クリック後にチェックされず、前のアイテムにリセットされます。重要なのは、クリックリスナイベント中にアイテムのチェックを外すことはできないことを理解することです。チェックされた状態は後で処理されるためです。これがKotlinの私のソリューションです:
val item = navigationView.menu.findItem(R.id.menu_item)
item.setOnMenuItemClickListener {
val oldItem = navigationView.checkedItem
rootView.postDelayed({ // you can use here any View to post a Runnable with a delay
navigationView.setCheckedItem(oldItem?.itemId ?: R.id.default_item)
}, 500)
browseURL("https://www.example.com")
true
}
Navigation Drawer を Jetpack Navigation と組み合わせて使用します。
必要なことは、次のようにグループを囲むことです。
<group>
<group
Android:id="@+id/grp1">
<item
Android:id="@+id/nav_profile"
Android:icon="@drawable/ic_account_circle_24dp"
Android:title="@string/profile" />
</group>
<group
Android:id="@+id/grp2">
<item
Android:id="@+id/nav_settings"
Android:icon="@drawable/ic_settings_24dp"
Android:title="@string/settings" />
<item
Android:id="@+id/nav_help"
Android:icon="@drawable/topic_help"
Android:title="@string/help_feedback" />
</group>
</group>
追加のオーバーヘッドでメニュー項目をループする必要はありません!