Laci Navigasi: Bagaimana cara mengatur item yang dipilih saat startup?


229

Kode saya berfungsi dengan baik: setiap kali item di Navigasi Drawer diklik item dipilih.

Tentu saja saya ingin memulai aplikasi dengan fragmen default (home), tetapi Navigasi Drawer tidak memiliki item yang dipilih. Bagaimana saya bisa memilih item itu secara terprogram?

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;
[...]

Saya pikir saya perlu mengedit di sini:

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

Atau di onCreate Startup aplikasi dengan FragmentTransaction.

Terima kasih atas dukungan Anda.


Apakah ada jawaban yang memicu onNavigationItemSelectedtindakan untuk id yang dipilih?
Prab

Jawaban:


478

Gunakan kode di bawah ini:

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

Panggil metode ini setelah Anda menelepon setNavDrawer();

The getItem(int index)Metode mendapatkan MenuItemmaka Anda dapat memanggil setChecked(true);pada ituMenuItem , semua Anda yang tersisa untuk dilakukan adalah untuk mengetahui indeks elemen tidak default memiliki, dan mengganti 0 dengan indeks itu.

Anda dapat memilih (menyorot) item dengan menelepon

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

Berikut ini tautan referensi: http://thegeekyland.blogspot.com/2015/11/navigation-drawer-how-set-selected-item.html

EDIT Tidak berfungsi pada nexus 4, mendukung revisi perpustakaan 24.0.0. Saya merekomendasikan penggunaan

navigationView.setCheckedItem(R.id.nav_item);

dijawab oleh @kingston di bawah ini.


65
Perpustakaan Dukungan Android v23 ditambahkan setCheckedItem (int id).
Markus Rubey

1
@MarkusRubey bahkan setelah pengaturan setCheckedItem saya tidak dapat menyorot item yang dipilih. Bisakah Anda memberi tahu alasan yang memungkinkan?
Dexto

3
Tidak bekerja untukku! Ketika metode onNavigationItemSelected dipanggil untuk opsi lain di laci menu navigasi, item awal yang disebut "dicentang" adalah mempertahankan statusnya selalu. Ketika saya menggunakan 'navigationView.setCheckedItem (id);' bekerja dengan sempurna! Setelah itu harus memanggil metode 'navigationView.getMenu () performIdentifierAction (R.id.nav_market, 0);' untuk melakukan pemilihan item yang diinginkan.
GFPF

3
Tak satu pun dari metode yang disebutkan bekerja untuk saya karena alasan tertentu. Tapi melakukan navigationView.post(new Runnable() { navigationView.setCheckedItem(...) })- bekerja.
dimsuz

1
Anda mungkin mencoba mengubah item yang dicentang dari utas berbeda dari utas utama :)
Arlind

105

Anda juga dapat menghubungi:

navigationView.setCheckedItem(id);

Metode ini diperkenalkan di API 23.0.0

Contoh

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

catatan: android:checkableBehavior="single"

Lihat juga ini


1
bahkan setelah mengatur setCheckedItem saya tidak dapat menyorot item yang dipilih. Bisakah Anda memberi tahu alasan yang memungkinkan?
Dexto

3
@DeepeshDoshi Pastikan Anda memiliki perilaku yang dapat diperiksa.
Jared Burrows

1
itu harus ia navigasiView.setCheckedItem (R.id.menu_nav_home) untuk memilih menu rumah
jaga

untuk setiap item tambahkan saja yang android:checkable="true"lain itu tidak akan diperiksa sendiri.
sud007

Pastikan juga Anda tidak memanggil metode ini navItemSelecteListenerkarena item dipilih setelah metode ini kembali.
mallaudin

47

Bagi saya kedua metode ini tidak berhasil:

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

Coba yang ini, ini bekerja untuk saya.

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


2
Terima kasih atas tip ini. Metode di atas sebenarnya ok, tetapi masalahnya berbeda: jika Anda menggunakannya, onNavigationItemSelected tidak akan dipanggil, hanya item menu yang akan diperiksa. Jadi kita perlu memanggil kedua metode itu.
user1209216

2
onNavigationItemSelected (navView.getMenu (). getItem (0)); atau onNavigationItemSelected (navView.getMenu (). getItem (R.id.nav_profile)); keduanya bekerja untuk saya, getitem bukannya finditem.
Harsh Dalwadi

30

Contoh ( 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
Ini adalah salah satu cara untuk melakukannya, saya menyukainya. Namun, jawaban khusus kode sering tidak dianjurkan. Saya akan mengedit jawaban Anda untuk menjelaskan kode sedikit, seperti mengapa Anda menggunakan performIdentifierActiondan apa yang terjadi di onNavigationItemSelected. Bagi Anda itu mungkin kelihatannya lurus ke depan, tetapi pengembang yang lebih baru mungkin mengalami kesulitan memahami kode Anda.
AdamMc331

@ McAdam331 Tentu saja merasa bebas, sudah setengah jadi di sini hari ini dan tidak punya waktu untuk menulis lebih terinci.
GFPF

25

Selalu ada masalah dengan lib dukungan Googles "oh begitu hebat". Jika Anda ingin memeriksa item tanpa menurunkan versi libs dukungan Anda, cukup setel periksa sebelum menyetel keadaan dicentang.

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

Ini juga bisa berfungsi jika Anda mengatur checkable di menu xml file



9

API 23 menyediakan metode berikut:

navigationView.setCheckedItem(R.id.nav_item_id);

Namun, karena alasan tertentu fungsi ini tidak menyebabkan kode di belakang item navigasi untuk berjalan. Metode ini tentu menyoroti item dalam laci navigasi, atau 'memeriksanya', tetapi sepertinya tidak memanggil yang OnNavigationItemSelectedListenermenghasilkan layar kosong saat start-up jika layar start-up Anda bergantung pada pilihan laci navigasi. Dimungkinkan untuk secara manual memanggil pendengar, tetapi tampaknya tidak jelas:

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

Kode di atas mengasumsikan:

  1. Anda telah menerapkan NavigationView.OnNavigationItemSelectedListenerdalam aktivitas Anda
  2. Anda sudah menelepon:
    navigationView.setNavigationItemSelectedListener(this);
  3. Item yang ingin Anda pilih terletak di posisi 0

6

Anda harus memanggil 2 fungsi untuk ini:

Pertama: untuk mengecualikan perintah yang telah Anda implementasikan di onNavigationItemSelectedpendengar:

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

Kedua: untuk mengubah status item menu laci navigasi menjadi yang dipilih (atau dicentang):

navigationView.setCheckedItem(R.id.nav_camera);

Saya memanggil kedua fungsi dan itu berhasil untuk saya.


5

Kode berikut hanya akan membuat item menu dipilih:

navigationView.setCheckedItem(id);

Untuk memilih dan membuka item menu, tambahkan kode berikut setelah baris di atas.

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


4

Ini solusi saya, sangat sederhana.

Ini file menu.xml saya:

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

Menu di atas akan menyorot item menu pertama. Baris di bawah ini akan melakukan sesuatu (misalnya: tampilkan fragmen pertama, dll). CATATAN: tulis setelah 'konfigurasikan kode laci Anda'

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

4

Cara termudah adalah memilihnya dari xml sebagai berikut,

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

Perhatikan barisnya android:checked="true"


1
Menurut pendapat saya, jawaban terbaik, sebab menggunakan logika bawaan Android yang disediakan. Memilih yang terbaik hanya lebih baik, jika menu menggunakan tata letak dan dihasilkan oleh adaptor bukan file menu xml.
Andris

1
Ini adalah jawaban terbaik
Ganesh Chowdhary Sadanala

2

Pertama-tama buat warna untuk item yang dipilih. Di sini https://stackoverflow.com/a/30594875/1462969 contoh yang baik. Ini membantu Anda untuk mengubah warna ikon. Untuk mengubah latar belakang semua item yang dipilih, tambahkan file nilai \ style.xml Anda ini

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

Di mana selectable_item_background harus dinyatakan dalam 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>

Di mana warna dapat dideklarasikan di style.xml

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

Dan setelah ini

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

Seperti yang Anda lihat, saya menggunakan mainNavigationMenu_.getMenu ini (). FindItem (itemId) .setChecked (true); untuk mengatur item yang dipilih. Sini navigasinya

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

Saya suka metode ini, saya saat ini menggunakannya dalam proyek saya sendiri. Mungkin membantu memasukkan @color/state_listkode dalam jawaban Anda. Karena penasaran, dari mana Anda mendapatkan konvensi penamaan untuk meletakkan garis bawah di akhir nama variabel? Saya belum pernah melihat pendekatan itu.
AdamMc331

Saya pikir mungkin Anda ingin menuItem.getItemId()bukannyaitemId
Craig Russell

2

Saat menggunakan BottomNavigationViewjawaban lain seperti navigationView.getMenu().getItem(0).setChecked(true);dan navigationView.setCheckedItem(id);tidak akan berfungsi, panggilan setSelectedItemIdberfungsi:

    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

Buat pemilih untuk item Individaual dari 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>

Buat beberapa perubahan di NavigationView Anda

<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

pada aktivitas Anda (di belakang laci):

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

dan

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

dan di menu Anda:

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

jadi menu pertama adalah highlight dan tampil sebagai menu default.


0

Kode di bawah ini digunakan untuk memilih item pertama dan menyorot item pertama yang dipilih dalam menu.

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

Bisakah Anda memberi tahu saya bagaimana dan di mana onNavigationItemSelected ini dapat diakses? Berikan contoh kode yang lebih lengkap.
kilokahn

0

kamu bisa melakukan ini, nav_view.getMenu().findItem(R.id.menutem).setChecked(true)


-1

Untuk beberapa alasan lebih baik menemukan MenuItem menggunakan ID.

drawer.getMenu().findItem(R.id.action_something).setChecked(true);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.