web-dev-qa-db-ja.com

ナビゲーションパネル:起動時に選択した項目を設定する方法

私のコードは完璧に動作します:Navigation Drawer内の項目がクリックされるたびにその項目が選択されます。

もちろん、デフォルトのフラグメント(ホーム)でアプリを起動したいのですが、Navigation Drawerではアイテムが選択されていません。プログラムでその項目を選択する方法

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

またはFragmentTransactionを使用したApp起動時のonCreate内。

ご支援いただきありがとうございます。

200
sineverba

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

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

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

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

あなたが呼び出すことによって項目を選択(強調表示)することができます

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

これは参照リンクです: http://thegeekyland.blogspot.com/2015/11/navigation-drawer-how-set-selected-item.html

_ edit _ nexus 4では動作しませんでした。ライブラリリビジョン24.0.0をサポートします。使用をお勧めします

navigationView.setCheckedItem(R.id.nav_item);

下記の@Kingstonが回答しました。

436
Arlind

あなたはまた呼び出すことができます:

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"

this も参照してください。

98
kingston

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

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

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

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

47
Raja Jawahar

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

28
GFPF

Googlesには「おお、すごい」サポートライブラリに関する問題が常にあります。サポートライブラリのバージョンを下げずに項目をチェックしたい場合は、チェック状態を設定する前に単にチェック可能を設定してください。

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

メニューのxmlファイルでチェック可能に設定してもうまくいくかもしれません

24
Daniel B

次の1ライナーのアイテムを強調表示して選択することができます。

navigationView.getMenu().performIdentifierAction(R.id.posts, 0);

ソース: https://stackoverflow.com/a/31044917/383761

12
Hugh Jeffner

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にあります。
8
John P.

これには2つの関数を呼び出さなければなりません。

まず: onNavigationItemSelectedリスナに実装したコマンドを削除します。

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

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

navigationView.setCheckedItem(R.id.nav_camera);

私は両方の機能を呼び出しました、そしてそれは私のために働きました。

6
MBH

次のコードはメニュー項目を選択するだけです。

navigationView.setCheckedItem(id);

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

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

5
Nikhil Misal

これは私の解決策で、とても簡単です。

これが私の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));
3
Na Pro

まず最初に選択したアイテムの色を作ります。ここで 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"/>
2
Waran-

最も簡単な方法は、次のように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"という行に注意してください

2

あなたの活動について(引き出しの後ろ):

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

最初のメニューはデフォルトのメニューとして highlight show です。

0
M.Namjo

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
Ritesh

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

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

0
Bhavana hegde

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