web-dev-qa-db-ja.com

ナビゲーションビューでチェックされたアイテムのチェックを外す方法

setCheckedItem()を呼び出してナビゲーションビューアイテムを強調表示するか、onNavigationItemSelectedにtrue値を返して選択したアイテムとしてアイテムを表示することは可能ですが、ナビゲーションのチェック済みアイテムのチェックを外す方法はありますか見る?

31
Hafez Divandari

これはアイテムのチェックを外します:

    int size = mNavigationView.getMenu().size();
    for (int i = 0; i < size; i++) {
        mNavigationView.getMenu().getItem(i).setCheckable(false);
    }
50
arsent

私は@arsentソリューションを見て試してみましたが、それは実際にあなたが望むことをします、つまりすべてのアイテムを選択解除することです...しかし、私は次のシナリオで問題を抱えていました:

  1. メニュー項目1を選択します(NavigationView#setCheckedItem
  2. @arsentのソリューションに従ってすべてのアイテムの選択を解除します
  3. メニュー項目1をもう一度選択します(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);
30
Joao Sousa

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());
18
Rahul

アイテムをチェック不可にするだけです

<item
    Android:id="@+id/profile_item"
    Android:checkable="false"
    Android:title="@string/profile"/>
6
Jack

@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>
2
Filipe Brito

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インスタンスを返します

1
user924

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);

この場合、解決策は不要です。

1

私のような人がこのような方法を使っていると思います

_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_をクリックすると自動的にチェックされるためです。

そのため、使用する方法がまったく機能しないようです。それは仕事ですが、すぐにオーバーライドする必要があります。

1
KDLin

@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に変換できます

0
arman

ここで説明したすべてのソリューションを組み合わせて使用​​する必要がありました。私の場合、アイテムがクリックされたときに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 DrawerJetpack Navigation と組み合わせて使用​​します。

0
Spipau

必要なことは、次のようにグループを囲むことです。

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

追加のオーバーヘッドでメニュー項目をループする必要はありません!

0
Codeversed