नेविगेशन दराज: मैं स्टार्टअप पर चयनित आइटम कैसे सेट करूं?


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चयनित आईडी के लिए कार्रवाई को ट्रिगर करता है ?
Prabs

जवाबों:


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

EDIT नेक्सस 4 पर काम नहीं किया, समर्थन पुस्तकालय संशोधन 24.0.0। मैं उपयोग की सलाह देता हूं

navigationView.setCheckedItem(R.id.nav_item);

नीचे दिए गए @kingston द्वारा उत्तर दिया गया।


65
Android समर्थन लाइब्रेरी v23 जोड़ा गया setCheckedItem (int id)
मार्कस रूबे

1
@MarkusRubey सेट करने के बाद भी चेक किया गया है। मैं चयनित आइटम को हाइलाइट करने में असमर्थ हूं। क्या आप इसका संभावित कारण बता सकते हैं?
डेक्स्टो सेप

3
मेरे लिए काम नहीं किया! जब onNavigationItemSelected पद्धति को नेविगेशन मेनू दराज में अन्य विकल्पों के लिए कहा जाता है, तो प्रारंभिक आइटम को "चेक" के रूप में संदर्भित किया जाता है जो उनके राज्य को हमेशा बनाए रखता है। जब मैं 'navigationView.setCheckedItem (id) का उपयोग करता हूं?' पूरी तरह से काम किया! इसके बाद इसे 'नेविगेशन व्यू.गेटमेनू () परफॉरमेंसफायरएशन (R.id.nav_market, 0);' वांछित आइटम का चयन करने के लिए।
GFPF

3
न तो उल्लिखित तरीकों ने मेरे लिए किसी कारण से काम किया। लेकिन कर navigationView.post(new Runnable() { navigationView.setCheckedItem(...) })- काम किया।
dimsuz

1
आप शायद मुख्य थ्रेड की तुलना में एक अलग थ्रेड से चेक किए गए आइटम को बदलने की कोशिश कर रहे हैं :)
Arlind

105

आप भी कॉल कर सकते हैं:

navigationView.setCheckedItem(id);

यह विधि एपीआई 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
सेटचेक किए जाने के बाद भी मैं चयनित आइटम को हाइलाइट करने में असमर्थ हूं। क्या आप इसका संभावित कारण बता सकते हैं?
डेक्सो

3
@DeepeshDoshi कृपया सुनिश्चित करें कि आपके पास एक जाँच योग्य व्यवहार है।
जारेड बुरो

1
उसे घर के मेन्यू का चयन करने के लिए नेविगेशन व्यू.सेटकिटेड इटम (R.id.menu_nav_home) करना चाहिए
jaga

अलग-अलग आइटम के लिए बस android:checkable="true"इसे और जोड़ें इसे स्वयं द्वारा चेक नहीं किया जाएगा।
सूद

यह भी सुनिश्चित करें कि आप इस विधि से कॉल नहीं करते हैं navItemSelecteListenerक्योंकि इस पद्धति के वापस आने के बाद आइटम का चयन किया जाता है।
मल्लाउद्दीन

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)); दोनों ने मेरे लिए काम किया, खोज की जगह गेटिटेम।
हर्ष दलवाड़ी

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

टी.के.एस


2
यह ऐसा करने का एक तरीका है, मुझे यह पसंद है। कोड-केवल उत्तर अक्सर हतोत्साहित होते हैं, हालांकि। मैं आपके उत्तर को कोड को थोड़ा समझाने के लिए संपादित करूंगा, जैसे कि आप क्यों उपयोग करते हैं performIdentifierActionऔर इसमें क्या हो रहा है onNavigationItemSelected। आप के लिए यह सीधे आगे लग सकता है, लेकिन एक नए देव को आपके कोड को समझने में परेशानी हो सकती है।
एडम मैक 331

@ McAdam331 निश्चित रूप से स्वतंत्र महसूस करता है, यह आज यहां से आधा हो गया है और अधिक विस्तार से लिखने का समय नहीं है।
GFPF

25

हमेशा Googles के साथ समस्याएं होती हैं "ओह इतनी बड़ी" समर्थन लिबास। यदि आप अपने समर्थन लिबास संस्करण को अपग्रेड किए बिना किसी आइटम की जांच करना चाहते हैं, तो चेक किए गए राज्य को सेट करने से पहले चेक करने योग्य सेट करें।

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

यदि आप मेनू xml फ़ाइलों में चेक करने योग्य सेट करते हैं तो यह भी काम कर सकता है



9

एपीआई 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));

दूसरा: नेविगेशन ड्रावर मेनू आइटम की स्थिति को चयनित (या जाँच) में बदलने के लिए:

navigationView.setCheckedItem(R.id.nav_camera);

मैंने दोनों कार्यों को बुलाया और यह मेरे लिए काम किया।


5

निम्नलिखित कोड केवल मेनू आइटम का चयन करेगा:

navigationView.setCheckedItem(id);

मेनू आइटम को चुनने और खोलने के लिए, उपरोक्त पंक्ति के बाद निम्न कोड जोड़ें।

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


4

यह मेरा समाधान है, बहुत सरल है।

यहाँ मेरा मेनू है। 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 फ़ाइल द्वारा जनरेट किया गया है, तो केवल सबसे बेहतर है।
एंडिस

1
यह सबसे अच्छा उत्तर है
गणेश चौधरी सदनला

2

सबसे पहले चयनित आइटम के लिए रंग बनाएं। यहाँ https://stackoverflow.com/a/30594875/1462969 अच्छा उदाहरण है। यह आपको आइकन का रंग बदलने में मदद करता है। सभी चयनित आइटम की पृष्ठभूमि बदलने के लिए अपने मानों को जोड़ें

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

जहां शैली में रंग घोषित किया जा सकता है। 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 () का उपयोग किया है । itItem (itemId) .setChecked (true); चयनित आइटम सेट करने के लिए। यहां नेविगेशन व्यू

 <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आपके उत्तर में कोड को शामिल करने में मदद कर सकता है । जिज्ञासा से बाहर, चर नाम के अंत में अंडरस्कोर लगाने के लिए आपको नामकरण सम्मेलन कहां मिला? मैंने वह तरीका कभी नहीं देखा है।
एडममुक 331

मुझे लगता है कि शायद आप 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

नव दराज के Individaual आइटम के लिए एक चयनकर्ता बनाओ

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

अपने नेविगेशन दृश्य में कुछ बदलाव करें

<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 कैसे और कहाँ सुलभ है? कृपया एक फुलर कोड उदाहरण प्रदान करें।
किलोकाहन


-1

किसी कारण से यह आईडी के उपयोग से MenuItem को खोजने के लिए बेहतर है।

drawer.getMenu().findItem(R.id.action_something).setChecked(true);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.