ナビゲーションドロワー:選択したアイテムを起動時に設定するにはどうすればよいですか?


229

私のコードは完全に機能します。ナビゲーションドロワーのアイテムがクリックされるたびに、アイテムが選択されます。

もちろん、デフォルトのフラグメント(ホーム)でアプリを起動したいのですが、ナビゲーションドロワーでアイテムが選択されていません。プログラムでそのアイテムを選択するにはどうすればよいですか?

public class BaseApp extends AppCompatActivity {

    //Defining Variables
    protected String LOGTAG = "LOGDEBUG";
    protected Toolbar toolbar;
    protected NavigationView navigationView;
    protected DrawerLayout drawerLayout;

    private DateManager db = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.base_layout);

        navigationView = (NavigationView) findViewById(R.id.navigation_view);


        // set the home/dashboard at startup

        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.frame, new DashboardFragment());
        fragmentTransaction.commit();

        setNavDrawer();
    }

    private void setNavDrawer(){

        // Initializing Toolbar and setting it as the actionbar
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //Initializing NavigationView

        //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

            // This method will trigger on item Click of navigation menu
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {


                //Checking if the item is in checked state or not, if not make it in checked state

                // I THINK THAT I NEED EDIT HERE...

                if (menuItem.isChecked()) menuItem.setChecked(false);
                else menuItem.setChecked(true);

                //Closing drawer on item click
                drawerLayout.closeDrawers();


                //Check to see which item was being clicked and perform appropriate action
                switch (menuItem.getItemId()) {    

                    //Replacing the main content with ContentFragment 

                    case R.id.home:

                        DashboardFragment dashboardFragment = new DashboardFragment();
                        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.frame, dashboardFragment,"DASHBOARD_FRAGMENT");
                        fragmentTransaction.commit();
                        return true;
[...]

ここで編集する必要があると思います:

if (menuItem.isChecked()) menuItem.setChecked(false);
                    else menuItem.setChecked(true);

または、onCreateFragmentTransactionを使用したアプリの起動時に。

ご協力ありがとうございます。


onNavigationItemSelected選択したIDのアクションをトリガーする回答はありますか?
Prabs 2017

回答:


478

以下のコードを使用してください:

navigationView.getMenu().getItem(0).setChecked(true);

呼び出した後にこのメソッドを呼び出します setNavDrawer();

getItem(int index)この方法は、取得しMenuItem、あなたが呼び出すことができるsetChecked(true);ようにMenuItem、あなたが行うことに残っているすべてのデフォルトはどの要素のインデックスを持っていない見つけると、そのインデックスを0に置き換えることです。

を呼び出すことでアイテムを選択(ハイライト)できます

onNavigationItemSelected(navigationView.getMenu().getItem(0));

ここに参照リンクがあります:http : //thegeekyland.blogspot.com/2015/11/navigation-drawer-how-set-selected-item.html

編集 ネクサス4、サポートライブラリリビジョン24.0.0では機能しませんでした。使用をお勧めします

navigationView.setCheckedItem(R.id.nav_item);

以下の@kingstonが回答しました。


65
Androidサポートライブラリv23が追加されましたsetCheckedItem (int id)
Markus Rubey

1
@MarkusRubey setCheckedItemを設定した後でも、選択したアイテムを強調表示できません。考えられる理由を教えてください。
Dexto

3
私のために働いていません! ナビゲーションメニュードロワーの他のオプションに対してメソッドonNavigationItemSelectedが呼び出されると、「チェック済み」と呼ばれる最初のアイテムは常にその状態を維持します。「navigationView.setCheckedItem(id);」を使用する場合 完璧に働いた!その後、メソッド 'navigationView.getMenu()performIdentifierAction(R.id.nav_market、0);'を呼び出す必要があります。目的のアイテムの選択を実行します。
GFPF、2015年

3
言及された方法のどちらも、何らかの理由で私にとってうまくいきませんでした。しかしnavigationView.post(new Runnable() { navigationView.setCheckedItem(...) })-働いた。
dimsuz

1
チェックアイテムをメインスレッドとは別のスレッドから変更しようとしている可能性があります:)
Arlind

105

以下を呼び出すこともできます。

navigationView.setCheckedItem(id);

このメソッドはAPI 23.0.0で導入されました

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      tools:ignore="UnusedIds">

    <group
        android:id="@+id/group"
        android:checkableBehavior="single">
        <item
            android:id="@+id/menu_nav_home"
            android:icon="@drawable/ic_home_black_24dp"
            android:title="@string/menu_nav_home" />
    </group>
</menu>

注意: android:checkableBehavior="single"

参照してください。これを


1
setCheckedItemを設定した後でも、選択したアイテムを強調表示できません。考えられる理由を教えてください。
Dexto

3
@DeepeshDoshi確認可能な動作があることを確認してください。
Jared Burrows

1
ホームメニューを選択するには、navigationView.setCheckedItem(R.id.menu_nav_home)である必要があります
jaga

個別のアイテムのandroid:checkable="true"場合は、他のアイテムを追加するだけで、それ自体はチェックされません。
sud007

またnavItemSelecteListener、このメソッドが返された後にitemが選択されているため、withからこのメソッドを呼び出さないようにしてください。
マラディン

47

私にとってこれらの方法はどちらもうまくいきませんでした:

  • navigationView.getMenu().getItem(0).setChecked(true);
  • navigationView.setCheckedItem(id);

これを試してみてください、それは私のために働きます。

onNavigationItemSelected(navigationView.getMenu().findItem(R.id.nav_profile));


2
このヒントをありがとう。上記のメソッドは実際には問題ありませんが、問題が異なります。これらを使用すると、onNavigationItemSelectedが呼び出されず、メニュー項目のみがチェックされます。したがって、両方のメソッドを呼び出す必要があります。
user1209216

2
onNavigationItemSelected(navView.getMenu()。getItem(0)); またはonNavigationItemSelected(navView.getMenu()。getItem(R.id.nav_profile)); どちらも私のために働いた、finditemの代わりにgetitem。
Harsh Dalwadi 2017

30

例(NavigationView.OnNavigationItemSelectedListener):

private void setFirstItemNavigationView() {
        navigationView.setCheckedItem(R.id.custom_id);
        navigationView.getMenu().performIdentifierAction(R.id.custom_id, 0);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setFirstItemNavigationView();
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    FragmentManager fragmentManager = getFragmentManager();

    switch (item.getItemId()) {
        case R.id.custom_id:
            Fragment frag = new CustomFragment();

            // update the main content by replacing fragments
            fragmentManager.beginTransaction()
                    .replace(R.id.viewholder_container, frag)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .addToBackStack(null)
                    .commit();
            break;
    }

Tks


2
これはそのための1つの方法です。ただし、コードのみの回答はお勧めできません。答えを編集して、コードを少し説明します。なぜ使用するのperformIdentifierActionか、何が起こっているのかなどですonNavigationItemSelected。あなたにはそれは簡単に思えるかもしれませんが、新しい開発者はあなたのコードを理解するのに問題があるかもしれません。
AdamMc331 2015年

@ McAdam331もちろん自由です。今日はここまで来ていないので、詳しく説明する時間はありませんでした。
GFPF 2015年

25

Googleの「ああ、とても素晴らしい」サポートライブラリには常に問題があります。サポートライブラリのバージョンをダウングレードせずにアイテムをチェックする場合は、チェック状態を設定する前にチェック可能に設定します。

MenuItem item = drawer.getMenu().findItem(R.id.action_something);
item.setCheckable(true);
item.setChecked(true);

メニューのxmlファイルでチェック可能に設定した場合にも機能する可能性があります



9

API 23は次のメソッドを提供します:

navigationView.setCheckedItem(R.id.nav_item_id);

ただし、何らかの理由で、この関数はナビゲーション項目の背後にあるコードを実行させませんでした。このメソッドは確かにナビゲーションドロワーで項目を強調表示するか、「チェック」しOnNavigationItemSelectedListenerますが、起動画面がナビゲーションドロワーの選択に依存している場合、起動時に空白の画面が表示されるとは思われません。リスナーを手動で呼び出すことは可能ですが、ハックのようです:

if (savedInstanceState == null) this.onNavigationItemSelected(navigationView.getMenu().getItem(0));

上記のコードは、次のことを前提としています。

  1. あなたはNavigationView.OnNavigationItemSelectedListenerあなたの活動に実装し ました
  2. あなたはすでに電話しました:
    navigationView.setNavigationItemSelectedListener(this);
  3. 選択するアイテムは位置0にあります

6

これには2つの関数を呼び出す必要があります。

まずonNavigationItemSelectedリスナーに実装したコマンドを実行するために:

onNavigationItemSelected(navigationView.getMenu().getItem(R.id.nav_camera));

2番目:ナビゲーションドロワーメニュー項目の状態を選択済み(またはチェック済み)に変更するには:

navigationView.setCheckedItem(R.id.nav_camera);

両方の関数を呼び出しましたが、うまくいきました。


5

次のコードでは、メニュー項目のみが選択されます。

navigationView.setCheckedItem(id);

メニュー項目を選択して開くには、上記の行の後に次のコードを追加します。

onNavigationItemSelected(navigationView.getMenu().getItem(0));


4

これは私の解決策で、非常に簡単です。

ここに私のmenu.xmlファイルがあります:

<group
    android:id="@+id/grp1"
    android:checkableBehavior="single">
    <item
        android:id="@+id/nav_all_deals"
        android:checked="true"
        android:icon="@drawable/ic_all_deals"
        android:title="@string/all_deals" />
    <item
        android:id="@+id/nav_news_and_events"
        android:icon="@drawable/ic_news"
        android:title="@string/news_and_events" />
    <item
        android:id="@+id/nav_histories"
        android:icon="@drawable/ic_histories"
        android:title="@string/histories" />
</group>

上記のメニューでは、最初のメニュー項目が強調表示されます。下の行は何かをします(例:最初のフラグメントを表示するなど)。注:「ドロワーコードの設定」の後に書き込みます

onNavigationItemSelected(mNavigationView.getMenu().getItem(0));

4

最も簡単な方法は、次のようにxmlから選択することです。

<menu>
   <group android:checkableBehavior="single">
         <item
              android:checked="true"
              android:id="@+id/nav_home"
              android:icon="@drawable/nav_home"
              android:title="@string/main_screen_title_home" />

行に注意してください android:checked="true"


1
私の見解では、原因はAndroidが提供するデフォルトのロジックを使用しています。メニューがレイアウトを使用していて、メニューxmlファイルではなくアダプターによって生成されている場合は、ベストとしてのみ投票された方が優れています。
Andris

1
これが最良の答えです
Ganesh Chowdhary Sadanala

2

まず、選択したアイテムの色を作成します。ここhttps://stackoverflow.com/a/30594875/1462969良い例です。アイコンの色を変更するのに役立ちます。選択したすべてのアイテムの背景を変更するには、values \ style.xmlファイルにこれを追加します

  <item name="selectableItemBackground">@drawable/selectable_item_background</item>

selectable_item_backgroundがdrawable / selectable_item_background.xmlで宣言されている場所

  <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/accent_translucent"
      android:state_pressed="true" />
    <item android:drawable="@android:color/transparent" />
   </selector>

style.xmlで色を宣言できる場所

 <color name="accent_translucent">#80FFEB3B</color>

そしてこの後

   // The main navigation menu with user-specific actions
        mainNavigationMenu_ = (NavigationView) findViewById(R.id.main_drawer);
        mainNavigationMenu_.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                mainNavigationMenu_.getMenu().findItem(itemId).setChecked(true);
                return true;
            }
        });

ご覧のとおり、この mainNavigationMenu_.getMenu()。findItem(itemId).setChecked(true);を使用しました。 選択した項目を設定します。ここnavigationView

 <android.support.design.widget.NavigationView
        android:id="@+id/main_drawer"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/header_main_navigation_menu"
        app:itemIconTint="@color/state_list"
        app:itemTextColor="@color/primary"
        app:menu="@menu/main_menu_drawer"/>

私はこの方法が好きで、現在自分のプロジェクトで使用しています。@color/state_list回答にコードを含めると役立つ場合があります。好奇心から、変数名の最後にアンダースコアを付けるための命名規則をどこで入手しましたか?私はそのアプローチを見たことがありません。
AdamMc331 2015年

多分あなたはmenuItem.getItemId()代わりに欲しいと思うitemId
クレイグ・ラッセル

2

使用している場合BottomNavigationViewなど、他の回答をnavigationView.getMenu().getItem(0).setChecked(true);して navigationView.setCheckedItem(id);呼び出して動作しませんsetSelectedItemId作品:

    BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation_view);

    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
            // TODO: 10-Aug-19 your code here 
        }
    });

    bottomNavigationView.setSelectedItemId(R.id.myitem);

0

Nav Drawerの個別アイテムのセレクターを作成する

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/darkBlue" android:state_pressed="true"/>
    <item android:drawable="@color/darkBlue" android:state_checked="true"/>
    <item android:drawable="@color/textBlue" />
</selector>

NavigationViewにいくつかの変更を加えます

<android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:itemBackground="@drawable/drawer_item"
        android:background="@color/textBlue"
        app:itemIconTint="@color/white"
        app:itemTextColor="@color/white"
        app:menu="@menu/activity_main_drawer"
        />

0

あなたの活動(引き出しの後ろ):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar,
               R.string.navigation_drawer_open,
               R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
    navigationView.setCheckedItem(R.id.nav_portfolio);
    onNavigationItemSelected(navigationView.getMenu().getItem(0));
}

そして

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    Fragment fragment = null;

    if (id == R.id.nav_test1) {
        fragment = new Test1Fragment();
        displaySelectedFragment(fragment);
    } else if (id == R.id.nav_test2) {
        fragment = new Test2Fragment();
        displaySelectedFragment(fragment);
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

そしてあなたのメニューで:

<group android:checkableBehavior="single">

    <item
        android:id="@+id/nav_test1"
        android:title="@string/test1" />

    <item
        android:id="@+id/nav_test2"
        android:title="@string/test2" />

  </group>

その最初のメニューがあり、ハイライトショーデフォルトメニューとして。


0

以下のコードを使用して、最初の項目選択し、メニューで選択した最初の項目強調表示します。

onNavigationItemSelected(mNavigationView.getMenu().getItem(0).setChecked(true));

このonNavigationItemSelectedにアクセスできる方法と場所を教えてください。より完全なコード例を提供してください。
キロカーン2018


-1

何らかの理由で、IDを使用してMenuItemを見つけることが望ましいです。

drawer.getMenu().findItem(R.id.action_something).setChecked(true);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.