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.

sineverba
sumber
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.

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

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

Raja Jawahar
sumber
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

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

Daniel B
sumber
12

Anda dapat menyorot dan memilih item dengan 1-liner berikut:

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

Sumber: https://stackoverflow.com/a/31044917/383761

Hugh Jeffner
sumber
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
John P.
sumber
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.

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

Nikhil Misal
sumber
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));
Na Pro
sumber
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"

Parinda Rajapaksha
sumber
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"/>
Waran-
sumber
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);
Roshna Omer
sumber
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"
        />
Ritesh
sumber
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.

M.Namjo
sumber
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));
Bhavana hegde
sumber
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)

Zakir Hussain
sumber
-1

Untuk beberapa alasan lebih baik menemukan MenuItem menggunakan ID.

drawer.getMenu().findItem(R.id.action_something).setChecked(true);
Enzokie
sumber