নেভিগেশন ড্রয়ার: আমি নির্বাচিত আইটেমটি শুরুতে কীভাবে সেট করব?


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

বা onCreateফ্র্যাগমেন্টট্রান্সঅ্যাকশন সহ অ্যাপ স্টার্টআপ এ।

আপনার সমর্থনের জন্য ধন্যবাদ.


উত্তরের onNavigationItemSelectedকোনওটি কি নির্বাচিত আইডির জন্য ক্রিয়া শুরু করে?
প্রবস

উত্তর:


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/navication-drawer-how-set-selected-item.html

সম্পাদনা নেক্সাস 4 এ কাজ করেনি, লাইব্রেরি সংশোধন 24.0.0 সমর্থন করে। আমি ব্যবহারের পরামর্শ দিচ্ছি

navigationView.setCheckedItem(R.id.nav_item);

নীচে @kingston দ্বারা উত্তর।


65
অ্যান্ড্রয়েড সাপোর্ট লাইব্রেরি ভি 23 যুক্ত হয়েছে setCheckedItem (int id)
মার্কাস রুবে

1
@MarkusRubey সেট চেকড আইটেম সেট করার পরেও আমি নির্বাচিত আইটেমটি হাইলাইট করতে পারছি না। আপনি সম্ভাব্য কারণ বলতে পারেন?
ডেক্সটো

3
আমার জন্য কাজ হয়নি! নেভিগেশন আইটেমসলেক্টড পদ্ধতিতে যখন নেভিগেশন মেনু ড্রয়ারের অন্যান্য বিকল্পগুলির জন্য ডাকা হয়, তখন প্রাথমিকভাবে "পরীক্ষিত" হিসাবে উল্লেখ করা আইটেমটি সর্বদা তাদের রাজ্য বজায় রাখে। যখন আমি 'নেভিগেশনভিউ.সেটচেকড আইটেম (আইডি) ব্যবহার করি;' পুরোপুরি কাজ! তারপরে অবশ্যই এটিকে কল করতে হবে 'নেভিগেশনভিউ.জেটমেনু () পারফর্মআইডেন্টিফায়ার অ্যাকশন (আর। আইডন.এনভ_মার্কেট, 0);' পছন্দসই আইটেম নির্বাচন সম্পাদন করতে।
জিএফপিএফ

3
উল্লিখিত দুটি পদ্ধতিই কোনও কারণে আমার পক্ষে কাজ করে নি। কিন্তু করছেন navigationView.post(new Runnable() { navigationView.setCheckedItem(...) })- কাজ করেছেন।
ডিমসুজ

1
আপনি সম্ভবত প্রধান থ্রেডের চেয়ে আলাদা থ্রেড থেকে চেক করা আইটেমটি পরিবর্তন করার চেষ্টা করছেন :)
আর্লিন্ড

105

আপনি কল করতে পারেন:

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"

আরও দেখুন এই


1
এমনকি সেটচেকড আইটেম সেট করার পরেও আমি নির্বাচিত আইটেমটি হাইলাইট করতে অক্ষম। আপনি সম্ভাব্য কারণ বলতে পারেন?
ডেক্সটো

3
@ প্রদীপদোশি দয়া করে নিশ্চিত হন যে আপনার চেক করার মতো আচরণ রয়েছে।
জ্যারেড বুরোজ

1
সে navigationView.setCheckedItem (R.id.menu_nav_home) বাড়িতে মেনুটি নির্বাচন করা উচিত
Jaga

স্বতন্ত্র আইটেমের জন্য কেবল যোগ করুন android:checkable="true"অন্যথায় এটি স্ব দ্বারা পরীক্ষা করা হবে না।
Sud007

এছাড়াও নিশ্চিত navItemSelecteListenerহয়ে নিন যে এই পদ্ধতিটি ফেরার পরে আইটেমটি নির্বাচিত হওয়ার সাথে আপনি এই পদ্ধতিটিকে কল করবেন না ।
মল্লাউদ্দিন

47

আমার জন্য এই দুটি পদ্ধতি কার্যকর হয়নি:

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

এটি চেষ্টা করে দেখুন, এটি আমার পক্ষে কাজ করে।

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


2
এই টিপ জন্য ধন্যবাদ। উপরের পদ্ধতিগুলি আসলে ঠিক আছে তবে সমস্যাটি ভিন্ন: আপনি যদি এগুলি ব্যবহার করেন তবে নেভিগেশন আইটেমসিলেক্ট বলা হবে না, কেবল মেনু আইটেমটি চেক করা হবে। সুতরাং আমাদের উভয় পদ্ধতি কল করতে হবে।
ব্যবহারকারী1209216

2
onNavigationItemSelected (navView.getMenu () getItem (0)।); বা নেভিগেশনআইটেমসিলিগ্রেটেড (নাভিভিউ.জেটমেনু ()। গেট আইটেম (আর.আইডি.নাভ_প্রোফাইল)); দু'জনেই আমার জন্য কাজ করেছেন, ফাইটাইটেমের পরিবর্তে গেটাইটেম।
হর্ষ ডালওয়াদি

30

উদাহরণ ( নেভিগেশনভিউ.অন নেভিগেশন আইটেমসিলেক্টডলাইজনার ):

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
এটি করার একটি উপায় এটি আমার পছন্দ হয়। কোড-কেবলমাত্র উত্তরগুলি প্রায়শই নিরুৎসাহিত করা হয়। কোডটি কিছুটা ব্যাখ্যা করার জন্য আমি আপনার উত্তরটি সম্পাদনা করব, যেমন আপনি কেন ব্যবহার করছেন performIdentifierActionএবং কী হচ্ছে onNavigationItemSelected। আপনার কাছে এটি সরাসরি সোজা মনে হতে পারে তবে নতুন কোডটিকে আপনার কোড বুঝতে সমস্যা হতে পারে।
অ্যাডামএমসি 331

@ ম্যাকএডাম 331 অবশ্যই নির্দ্বিধায় মনে হয়, আজ এটি অর্ধেক হয়ে গেছে এবং আরও বিশদে লেখার সময় পাননি।
জিএফপিএফ

25

গুগলস "ওহ তাই দুর্দান্ত" সমর্থন লিবসের সাথে সর্বদা সমস্যা থাকে। আপনি যদি আপনার সমর্থন লাইবস সংস্করণটি ডাউনগ্রেড না করে কোনও আইটেম চেক করতে চান তবে চেকড স্টেটটি সেট করার আগে চেক করতে সক্ষম করুন।

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

আপনি মেনু এক্সএমএল ফাইলগুলিতে চেকযোগ্য সেট করে রাখলে এটিও কাজ করতে পারে



9

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 এ অবস্থিত

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

এটি আমার সমাধান, খুব সাধারণ।

এখানে আমার মেনু.এক্সএমএল ফাইলটি রয়েছে:

<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

এক্সএমএল থেকে নীচে এটি নির্বাচন করা সবচেয়ে সহজ উপায়,

<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
আমার মতে সেরা উত্তর, কারণ ডিফল্ট অ্যান্ড্রয়েড সরবরাহিত যুক্তি ব্যবহার করে। মেনু বিন্যাসটি ব্যবহার করে মেনু এক্সএমএল ফাইল নয়, তবে অ্যাডাপ্টারের মাধ্যমে উত্পন্ন হলে, কেবলমাত্র সেরা হিসাবে ভোট দেওয়া ভাল।
অ্যান্ডিস

1
এটি সেরা উত্তর
গণেশ চৌধারী সদনালা

2

সবার আগে নির্বাচিত আইটেমের জন্য রঙ তৈরি করুন। এখানে https://stackoverflow.com/a/30594875/1462969 ভাল উদাহরণ। এটি আপনাকে আইকনের রঙ পরিবর্তন করতে সহায়তা করে। সমস্ত নির্বাচিত আইটেমের পটভূমি পরিবর্তনের জন্য আপনার মানগুলিতে যুক্ত করুন \ স্টাইল.এক্সএমএল ফাইল করুন

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

যেখানে নির্বাচনযোগ্য_সীম_ব্যাকগ্রাউন্ডটি অঙ্কনযোগ্য / নির্বাচনযোগ্য_ইটিম_ব্যাকগ্রাউন্ড.এক্সএমএলে ঘোষণা করা উচিত

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

যেখানে রঙ স্টাইল.এক্সএমএল হিসাবে ঘোষণা করা যেতে পারে

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

আপনি দেখতে পান যে আমি এই প্রধান নেভিগেশনমেনু_.সেটমেনু ()। ফাইন্ড আইটেম (আইটেম আইডি)। সেটচেকড (সত্য); নির্বাচিত আইটেম সেট করতে। এখানে নেভিগেশন ভিউ

 <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

নাভি ড্রয়ারের স্বতন্ত্র আইটেমের জন্য একটি নির্বাচনকারী করুন

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

আপনি কী আমাকে এই ন্যাভিগেশন আইটেমটিলেক্টড অ্যাক্সেসযোগ্য এবং কোথায় বলতে পারেন? একটি পূর্ণ কোড উদাহরণ প্রদান করুন।
কিলোকাহ্ন


-1

কোনও কারণে আইডি ব্যবহার করে মেনু আইটেমটি পাওয়া ভাল।

drawer.getMenu().findItem(R.id.action_something).setChecked(true);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.