Gezinme çekmecesi: Seçilen öğeyi başlangıçta nasıl ayarlarım?


229

Kodum mükemmel çalışıyor: Gezinme Çekmecesi'ndeki bir öğeye her tıklandığında öğe seçilir.

Tabii ki uygulamayı varsayılan bir fragmanla (ana sayfa) başlatmak istiyorum, ancak Gezinme Çekmecesi öğeyi seçmedi. Bu öğeyi programlı olarak nasıl seçebilirim?

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

Burada düzenlemem gerektiğini düşünüyorum:

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

Veya onCreateFragmentTransaction ile Uygulama başlangıcında.

Desteğin için teşekkürler.


Yanıtlardan herhangi biri onNavigationItemSelectedseçilen kimlik için işlemi tetikliyor mu?
Prabs

Yanıtlar:


478

Aşağıdaki kodu kullanın:

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

Aradıktan sonra bu yöntemi çağırın setNavDrawer();

getItem(int index)Yöntem alır MenuItemo zaman arayabilirsin setChecked(true);bu konuda MenuItemyapmanız bırakılır tüm eleman endeksi sahip varsayılan yapar olduğunu öğrenmek ve bu indeksi 0 değiştirmektir.

Öğeyi arayarak seçebilir (vurgulayabilirsiniz)

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

İşte bir referans bağlantısı: http://thegeekyland.blogspot.com/2015/11/navigation-drawer-how-set-selected-item.html

EDIT nexus 4 üzerinde çalışmadı, 24.0.0 kütüphane revizyonunu destekledi. Kullanmanızı tavsiye ederim

navigationView.setCheckedItem(R.id.nav_item);

Aşağıdaki @ kingston tarafından cevaplandı.


65
Android Destek Kitaplıkları v23 eklendi setCheckedItem (int id).
Markus Rubey

1
@MarkusRubey setCheckedItem ayarladıktan sonra bile Seçilen öğeyi vurgulayamıyorum. Olası nedeni söyleyebilir misiniz?
Dexto

3
Benim için çalışmadı! Gezinme menüsü çekmecesindeki diğer seçenekler için onNavigationItemSelected yöntemi çağrıldığında , "işaretli" olarak adlandırılan ilk öğe her zaman durumlarını korur. 'NavigationView.setCheckedItem (id);' i kullandığımda mükemmel çalıştı! Bundan sonra 'navigationView.getMenu () performIdentifierAction (R.id.nav_market, 0);' yöntemini çağırmalıdır. İstediğiniz öğenin seçimini yapmak için.
GFPF

3
Bahsedilen yöntemlerin hiçbiri bir nedenden dolayı benim için işe yaramadı. Ama yapıyor navigationView.post(new Runnable() { navigationView.setCheckedItem(...) })- çalıştı.
dimsuz

1
Muhtemelen kontrol edilen öğeyi ana iş parçacığından farklı bir iş parçacığından değiştirmeye çalışıyorsunuz :)
Arlind

105

Ayrıca şunları da arayabilirsiniz:

navigationView.setCheckedItem(id);

Bu yöntem API 23.0.0'da tanıtıldı

Misal

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

Not: android:checkableBehavior="single"

Ayrıca bkz bu


1
setCheckedItem ayarladıktan sonra bile Seçilen öğeyi vurgulayamıyorum. Olası nedeni söyleyebilir misiniz?
Dexto

3
@DeepeshDoshi Lütfen kontrol edilebilir bir davranışa sahip olduğunuzdan emin olun.
Jared Burrows

1
Ana menüyü seçmek için navigationView.setCheckedItem (R.id.menu_nav_home)
jaga

bireysel öğe için sadece android:checkable="true"başka eklemek kendiniz tarafından kontrol olmayacak.
sud007

Ayrıca navItemSelecteListener, bu yöntem döndükten sonra öğe seçildiği için bu yöntemi ile aramamaya dikkat edin.
mallaudin

47

Benim için her iki yöntem de işe yaramadı:

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

Bunu deneyin, benim için çalışıyor.

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


2
Bu ipucu için teşekkürler. Yukarıdaki yöntemler aslında tamam, ancak sorun farklı: bunları kullanırsanız, onNavigationItemSelected çağrılmaz, yalnızca menü öğesi kontrol edilir. Bu yüzden her iki yöntemi de çağırmalıyız.
user1209216

2
onNavigationItemSelected (navView.getMenu () getItem (0).); veya onNavigationItemSelected (navView.getMenu (). getItem (R.id.nav_profile)); ikisi de benim için çalıştı, finditem yerine getitem.
Harsh Dalwadi

30

Örnek ( 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
Bunu yapmanın bir yolu bu, hoşuma gitti. Bununla birlikte, yalnızca kod yanıtları genellikle önerilmez. Cevabınızı, neden kullandığınız performIdentifierActionve neler olduğu gibi biraz açıklamak için düzenlerim onNavigationItemSelected. Size doğrudan gelebilir, ancak daha yeni bir geliştirici kodunuzu anlamada sorun yaşayabilir.
AdamMc331

@ McAdam331 Elbette çekinmeyin, bugün buraya geldi ve daha ayrıntılı yazmak için zamanım olmadı.
GFPF

25

Google'ın "oh so great" destek kütüphanelerinde her zaman sorun vardır. Destek kütüphanesi sürümünüzü düşürmeden bir öğeyi kontrol etmek istiyorsanız, işaretli durumu ayarlamadan önce kontrol edilebilir olarak ayarlayın.

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

Menü xml dosyalarında kontrol edilebilir ayarlarsanız da işe yarayabilir



9

API 23 aşağıdaki yöntemi sağlar:

navigationView.setCheckedItem(R.id.nav_item_id);

Ancak, bazı nedenlerden dolayı bu işlev, gezinti öğesinin arkasındaki kodun çalışmasına neden olmamıştır. Yöntem kesinlikle gezinme çekmecesindeki öğeyi vurgular veya 'kontrol eder', ancak OnNavigationItemSelectedListenerbaşlangıç ​​ekranınız gezinme çekmecesi seçimlerine bağlıysa, başlangıçta boş bir ekranda görünmüyor gibi görünüyor . Dinleyiciyi manuel olarak aramak mümkündür, ancak hacky gibi görünüyor:

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

Yukarıdaki kod varsayar:

  1. NavigationView.OnNavigationItemSelectedListenerFaaliyetinize uyguladınız
  2. Zaten aradınız:
    navigationView.setNavigationItemSelectedListener(this);
  3. Seçmek istediğiniz öğe 0 konumunda bulunuyor

6

Bunun için 2 fonksiyon çağırmalısınız:

İlk olarak:onNavigationItemSelected dinleyiciye uyguladığınız komutları çıkarmak için :

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

İkincisi: Gezinme çekmecesi menü öğesinin durumunu seçilen (veya işaretli) olarak değiştirmek için:

navigationView.setCheckedItem(R.id.nav_camera);

Her iki işlevi de aradım ve benim için çalıştı.


5

Aşağıdaki kod yalnızca menü öğesinin seçilmesini sağlar:

navigationView.setCheckedItem(id);

Menü öğesini seçmek ve açmak için yukarıdaki satırdan sonra aşağıdaki kodu ekleyin.

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


4

Bu benim çözümüm, çok basit.

Menu.xml dosyam:

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

Menünün üstünde ilk menü öğesi vurgulanacaktır. Aşağıdaki satır bir şey yapacaktır (örneğin: ilk parçayı göster, vb.). NOT: 'çekmece kodunuzu yapılandırın' yazdıktan sonra

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

4

En kolay yol xml'den aşağıdaki gibi seçmektir,

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

Çizgiyi not edin android:checked="true"


1
Bence en iyi cevap, neden varsayılan Android tarafından sağlanan mantığı kullanır. Menü düzeni kullanıyorsa ve menü xml dosyası değil adaptör tarafından oluşturulmuşsa, yalnızca en iyi olarak oy verilir.
Andris

1
Bu en iyi cevap
Ganesh Chowdhary Sadanala

2

Her şeyden önce seçilen öğe için renkler oluşturun. İşte https://stackoverflow.com/a/30594875/1462969 iyi örnek. Simgenin rengini değiştirmenize yardımcı olur. Seçilen öğenin arka planını değiştirmek için değerleri \ style.xml dosyanıza ekleyin

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

Selectable_item_background çekilebilir / selectable_item_background.xml dosyasında bildirilmelidir

  <?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 dosyasında renk nerede bildirilebilir?

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

Ve bundan sonra

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

Gördüğünüz gibi bu mainNavigationMenu_.getMenu (). FindItem (itemId) .setChecked (true); seçilen öğeyi ayarlamak için. Burada navigasyon

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

Bu yöntemi seviyorum, şu anda kendi projemde kullanıyorum. @color/state_listKodu cevabınıza eklemek yardımcı olabilir . Meraktan, değişken isminin sonuna alt çizgi koymak için adlandırma kuralını nereden aldınız? Bu yaklaşımı hiç görmedim.
AdamMc331

Sanırım belki de menuItem.getItemId()yerine istiyorsunitemId
Craig Russell

2

BottomNavigationViewGibi diğer cevapları kullanırken navigationView.getMenu().getItem(0).setChecked(true);ve navigationView.setCheckedItem(id);işe yaramazsa arama setSelectedItemIdçalışır:

    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

Gezinme Çekmecesinin Bireysel öğesi için bir seçici yapın

<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 cihazınızda birkaç değişiklik yapın

<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

etkinliğinizde (çekmecenin arkasında):

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

ve

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

ve menünüzde:

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

bu yüzden ilk menü vurgulanır ve varsayılan menü olarak gösterilir .


0

Kodun altında seçilen kullanılır ilk öğeye ve seçilen ilk öğeyi vurgulamak menüde.

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

Lütfen bu onNavigationItemSelected öğesinin nasıl ve nerede erişilebilir olduğunu söyleyebilir misiniz? Lütfen daha dolgun bir kod örneği verin.
kilokahn

0

Bunu yapabilirsiniz, nav_view.getMenu().findItem(R.id.menutem).setChecked(true)


-1

Nedense ID'leri kullanarak MenuItem bulmak tercih edilir.

drawer.getMenu().findItem(R.id.action_something).setChecked(true);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.