নেভিগেশন ড্রয়ারে একটি চেক মেনু আইটেমের রঙ পরিবর্তন করুন


103

আমি আমার অ্যাপ্লিকেশনটিতে একটি নেভিগেশন ড্রয়ার প্রয়োগ করতে নতুন অ্যান্ড্রয়েড ডিজাইন সমর্থন লাইব্রেরি ব্যবহার করছি।

আমি কীভাবে নির্বাচিত আইটেমটির রঙ পরিবর্তন করব তা বুঝতে পারি না!

মেনুটির এক্সএমএল এখানে:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
    <item
        android:id="@+id/navigation_item_1"
        android:icon="@drawable/ic_1"
        android:title="@string/navigation_item_1"/>

    <item
        android:id="@+id/navigation_item_2"
        android:icon="@drawable/ic_2"
        android:title="@string/navigation_item_2"/>
</group>

এবং এখানে নেভিগেশন ভিউ এক্সএমএল যা একটি এর ভিতরে স্থাপন করা হয়েছে android.support.v4.widget.DrawerLayout:

<android.support.design.widget.NavigationView
    android:id="@+id/activity_main_navigationview"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/drawer_header"
    app:itemIconTint="@color/black"
    app:itemTextColor="@color/primary_text"
    app:menu="@menu/menu_drawer">

    <TextView
        android:id="@+id/main_activity_version"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_marginBottom="@dimen/activity_vertical_margin"
        android:layout_marginLeft="@dimen/activity_horizontal_margin"
        android:textColor="@color/primary_text" />

</android.support.design.widget.NavigationView>

আপনার সাহায্যের জন্য ধন্যবাদ !

[সম্পাদনা] আমি ইতিমধ্যে এর সমাধানগুলির জন্য ইতিমধ্যে দেখেছি: অ্যান্ড্রয়েড মেনুটির ব্যাকগ্রাউন্ড রঙ পরিবর্তন করুন

এটি বেশ হ্যাক বলে মনে হচ্ছে এবং আমি ভেবেছিলাম যে নতুন ডিজাইন সমর্থন লাইব্রেরি দিয়ে ক্লিনারটি কিছু চালু করা হয়েছে?


উত্তর:


244

ভাল আপনি রঙ স্টেট রিসোর্স ব্যবহার করে এটি অর্জন করতে পারেন । আপনি যদি নিজের ভিতরে খেয়াল করেন NavigationViewযে আপনি ব্যবহার করছেন

app:itemIconTint="@color/black"
app:itemTextColor="@color/primary_text"

এখানে ব্যবহার @color/blackবা পরিবর্তে @color/primary_testএকটি ব্যবহার করুন Color State List Resource। তার জন্য, প্রথমে ডিরেক্টরিটির xmlভিতরে একটি নতুন (উদাহরণস্বরূপ drawer_item.xML) তৈরি করুন color(যা ডিরেক্টরিতে থাকা উচিত res)) যদি আপনার colorইতিমধ্যে নামের ডিরেক্টরি না থাকে তবে একটি তৈরি করুন।

এখন ভিতরে drawer_item.xmlকিছু এই মত

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="checked state color" android:state_checked="true" />
    <item android:color="your default color" />
</selector>

চূড়ান্ত পদক্ষেপটি আপনার পরিবর্তন করা হবে NavigationView

<android.support.design.widget.NavigationView
    android:id="@+id/activity_main_navigationview"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/drawer_header"
    app:itemIconTint="@color/drawer_item"  // notice here
    app:itemTextColor="@color/drawer_item" // and here
    app:itemBackground="@android:color/transparent"// and here for setting the background color to tranparent
    app:menu="@menu/menu_drawer">

এটির মত আপনি জন্য পৃথক রঙ রাষ্ট্র তালিকা সম্পদ ব্যবহার করতে পারেন IconTint, ItemTextColor, ItemBackground

এখন আপনি যখন কোনও আইটেমটি চেকড হিসাবে সেট করেছেন (হয় xmlবা প্রোগ্রামায়িতভাবে), নির্দিষ্ট আইটেমটি চেক করা না হওয়াগুলির চেয়ে আলাদা রঙের হবে।


মনে রাখবেন যে চাপ দেওয়ার জন্য আপনাকে এন্ড্রয়েড থেকে পরিবর্তন করতে হবে: state_ চেকড অ্যান্ড্রয়েডে: রাষ্ট্র_প্রেসিত।
প্রোগ্রামিস্ট

32
আইটেমব্যাকগ্রাউন্ডের জন্য আপনাকে রঙের পরিবর্তে একটি অঙ্কনযোগ্য ব্যবহার করতে হবে কারণ আপনি রঙের সংস্থান ব্যবহার করে কোনও পটভূমি সংজ্ঞায়িত করতে পারবেন না।
sirFunkenstine

@ সাশ যদি আমরা নির্বাচিত নেভিগেশন আইটেমে আইকন চিত্রটি পরিবর্তন করতে চাই তবে আমরা এটি কীভাবে করব?
মোহিত

@ sirFunkenstine আপনি যদি রঙ নির্বাচনকারী ব্যবহার করছেন তবে আপনি এটি আপনার রেজ ফোল্ডারে রঙ ফোল্ডারে রাখতে পারেন।
কিশান বাঘেলা 12

@ কিশনবাঘেলা আপনার পরামর্শ অনুসারে কাজটি করার ফলে এই ত্রুটিটি তৈরি হয়: বাইনারি এক্সএমএল ফাইল লাইন # 3: <item> ট্যাগের জন্য একটি 'অঙ্কনযোগ্য' বৈশিষ্ট্য বা চাইল্ড ট্যাগের একটি অঙ্কনীয়কে সংজ্ঞায়িত করতে প্রয়োজন
আইওএসএন্ড্রয়েড উইন্ডোজমোবাইল অ্যাপসদেব

66

আমি বিশ্বাস করি app:itemBackgroundএকটি আকর্ষণীয় প্রত্যাশা। সুতরাং নীচের পদক্ষেপগুলি অনুসরণ করুন:

highlight_color.xmlনিম্নলিখিত বিষয়বস্তু সহ একটি অঙ্কনযোগ্য ফাইল করুন :

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
     <solid android:color="YOUR HIGHLIGHT COLOR"/>
</shape>

nav_item_drawable.xmlনিম্নলিখিত বিষয়বস্তুগুলির সাথে অন্য একটি অঙ্কনযোগ্য ফাইল করুন :

<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/highlight_color" android:state_checked="true"/>
</selector>

পরিশেষে app:itemBackgroundনাভিভিউতে ট্যাগ যুক্ত করুন :

<android.support.design.widget.NavigationView
android:id="@+id/activity_main_navigationview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:itemIconTint="@color/black"
app:itemTextColor="@color/primary_text"
app:itemBackground="@drawable/nav_item_drawable"
app:menu="@menu/menu_drawer">

এখানে হাইলাইট_ক্লোর.এক্সএমএল ফাইল ব্যাকগ্রাউন্ডের জন্য একটি শক্ত রঙ অঙ্কনযোগ্য সংজ্ঞা দেয় def পরে এই রঙের অঙ্কনযোগ্যকে nav_item_drawable.xML নির্বাচককে বরাদ্দ করা হয়েছে।

এটি আমার পক্ষে কাজ করেছে। আশা করি এটি সাহায্য করবে।

******************************************** আপডেট *** *******************************************

যদিও উপরে উল্লিখিত উত্তরটি আপনাকে কয়েকটি বৈশিষ্ট্যের উপর সূক্ষ্ম নিয়ন্ত্রণ দেয় তবে আমি যেভাবে বর্ণনা করতে চলেছি তা আরও সলড অনুভূত হয় এবং এটি কিছুটা শীতল

তাই কি আপনি কি করতে পারেন, আপনি একটি বর্ণনা করতে পারেন ThemeOverlay মধ্যে styles.xmlভালো NavigationView জন্য:

    <style name="ThemeOverlay.AppCompat.navTheme">

        <!-- Color of text and icon when SELECTED -->
        <item name="colorPrimary">@color/color_of_your_choice</item> 

        <!-- Background color when SELECTED -->
        <item name="colorControlHighlight">@color/color_of_your_choice</item> 

    </style>

এখন app:themeনেভিগেশনভিউ এর বৈশিষ্ট্য হিসাবে এই থিম ওভারলে প্রয়োগ করুন :

<android.support.design.widget.NavigationView
android:id="@+id/activity_main_navigationview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:theme="@style/ThemeOverlay.AppCompat.navTheme"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/menu_drawer">

আমি আশা করি এটি সাহায্য করবে


1
এছাড়াও, এই পদ্ধতিটি android:background="@drawable/nav_item_drawable"অন্যান্য উইজেট যেমন রেডিওবটন, চেকবক্স, বোতাম ইত্যাদি হিসাবে ব্যবহার করা যেতে পারে setOnCheckedChangeListenerকেবল রঙ হাইলাইটিংয়ের জন্য হ্যান্ডলিংয়ের জন্য ব্লাটওয়্যার প্রোগ্রামিং হ্রাস করে ।
রুপিন্দরজিট

@ অঙ্কুশ এটি কাজ করে তবে পাঠ্য এবং আইকন অদৃশ্য হয়ে যায়, আমি আইটেমের রঙের রঙটি খুব সেট করে ফেলেছি তবে এটি কার্যকর হয় না। কীভাবে এটি করা যায় আমাকে দয়া করে পরামর্শ দিতে পারেন
ব্যবহারকারী

1
@ ব্যবহারকারী আপনার কোডটিতে কী ভুল হয়েছে তা আমি জানি না, তবে আমি উত্তরটিতে যুক্ত করেছি। কম চেষ্টা করে একই জিনিস অর্জনের সম্পূর্ণ ভিন্ন উপায়। আপনি এটি পরীক্ষা করে দেখতে পারেন।
অঙ্কুশ

1
এটি একটি উত্তর হিসাবে গ্রহণ করা উচিত! আপনাকে অনেক ধন্যবাদ, খুব সহায়ক !!!
স্বেতলানা রোজকোভা

4

NavigateItemআইটেমটি যখনই NavigateViewক্লিক করা হয় তখন একটিতে সত্য পরীক্ষা করা দরকার

//listen for navigation events
NavigationView navigationView = (NavigationView)findViewById(R.id.navigation);
navigationView.setNavigationItemSelectedListener(this);
// select the correct nav menu item
navigationView.getMenu().findItem(mNavItemId).setChecked(true);

যোগ NavigationItemSelectedListenerকরুনNavigationView

  @Override
  public boolean onNavigationItemSelected(final MenuItem menuItem) {
    // update highlighted item in the navigation menu
    menuItem.setChecked(true);
    mNavItemId = menuItem.getItemId();

    // allow some time after closing the drawer before performing real navigation
    // so the user can see what is happening
    mDrawerLayout.closeDrawer(GravityCompat.START);
    mDrawerActionHandler.postDelayed(new Runnable() {
      @Override
      public void run() {
        navigate(menuItem.getItemId());
      }
    }, DRAWER_CLOSE_DELAY_MS);
    return true;
  }

আপনার সহায়তার জন্য ভিকল্পকে ধন্যবাদ, তবে আমি ইতিমধ্যে এটি করছি ( setChecked(true))। আমি চেক করা আইটেমটির রঙ পরিবর্তন করতে দেখতে পাচ্ছি তবে আমি নিজে এটিকে সংশোধন করতে পারি না, রঙটি সর্বদা নেভিগাটিভিউ ব্যাকগ্রাউন্ডের হালকা সংস্করণ।
গ্রেগ

@Greg করে ডিফল্ট setChecked(true)উপর Viewথীম আপনি যে ডিভাইসটি ব্যবহার পর্যন্ত পরিবর্তন পটভূমির রঙ। আপনি যদি আইটেমের ব্যাকগ্রাউন্ড অন্য কোনও রঙে পরিবর্তন করতে চান তবে আপনার নিজের লেআউটটি স্ফূরণ করতে হবে DrawerLayoutবা NavigationViewআপনার নিজেরাই পরিচালনা করতে হবে।
বিকাল প্যাটেল

আবারও ধন্যবাদ, আপনি আমাকে যা বলেছিলেন তা করার চেষ্টা করেছি কিন্তু সাফল্য না থাকলে কীভাবে দয়া করে তা বোঝানোর জন্য আপনার একটি লিঙ্ক থাকবে?
গ্রেগ

2

এটি অর্জনের অন্য উপায়টি এখানে:

public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            item.setEnabled(true);
            item.setTitle(Html.fromHtml("<font color='#ff3824'>Settings</font>"));
            return false;
            }
        });


    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

}


আমার দোবত কি ছিল যদি আমি পপআপ মেনুতে নির্বাচিত আইটেমের রঙ পরিবর্তন করতে চাই তবে আপনাকে ধন্যবাদ যে আমি নির্বাচিত মেনু আইটেমটির রঙ পরিবর্তন করার জন্য আপনার সমাধানটি থেকে একটি দুর্দান্ত ধারণা পেয়েছি ... তাই আপনাকে ভোট দিয়েছি !!! এবং চারপাশের কাজটি হ'ল: আইটেম.সেটিটেল (Html.fromHtml ("<ফন্টের রঙ = '# ff3824'> সেটিংস </ font>"));
তারিত রে

1

আপনার ক্রিয়াকলাপের অনক্রিট পদ্ধতিতে আপনি এটি কীভাবে করতে পারেন তা এখানে:

NavigationView navigationView = findViewById(R.id.nav_view);
ColorStateList csl = new ColorStateList(
    new int[][] {
        new int[] {-android.R.attr.state_checked}, // unchecked
        new int[] { android.R.attr.state_checked}  // checked
    },
    new int[] {
        Color.BLACK,
        Color.RED
    }
);
navigationView.setItemTextColor(csl);
navigationView.setItemIconTintList(csl);

1

পদক্ষেপ 1: একটি চেক / চেক না করা নির্বাচনকারী নির্বাচন করুন:

selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/yellow" android:state_checked="true" />
    <item android:color="@color/white" android:state_checked="false" />
</selector>

পদক্ষেপ 2: পাঠ্যের রঙ নির্বাচনের জন্য উইজেটের app:itemTextColorমধ্যে এক্সএমএল বৈশিষ্ট্যটি ব্যবহার করুন NavigationView

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/navigation_header_layout"
    app:itemTextColor="@drawable/selector"
    app:menu="@menu/navigation_menu" />

পদক্ষেপ 3:
কোনও কারণে আপনি NavigationViewমেনু থেকে কোনও আইটেমটি আঘাত করলে , এটি এটিকে বোতামের চেক হিসাবে বিবেচনা করে না। সুতরাং আপনাকে নির্বাচিত আইটেমটি ম্যানুয়ালি পরীক্ষা করতে হবে এবং পূর্বে নির্বাচিত আইটেমটি সাফ করতে হবে। এটি করতে নীচের শ্রোতাদের ব্যবহার করুন

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {

    int id = item.getItemId();

    // remove all colors of the items to the `unchecked` state of the selector
    removeColor(mNavigationView);

    // check the selected item to change its color set by the `checked` state of the selector
    item.setChecked(true);

    switch (item.getItemId()) {
      case R.id.dashboard:
          ...
    }

    drawerLayout.closeDrawer(GravityCompat.START);
    return true;
}

private void removeColor(NavigationView view) {
    for (int i = 0; i < view.getMenu().size(); i++) {
        MenuItem item = view.getMenu().getItem(i);
        item.setChecked(false);
    }
}

পদক্ষেপ 4:
আইকনের রঙ পরিবর্তন করতে, মেনু আইটেমগুলিতে app:iconTintবৈশিষ্ট্যটি ব্যবহার করুন NavigationViewএবং একই নির্বাচককে সেট করুন।

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/nav_account"
        android:checked="true"
        android:icon="@drawable/ic_person_black_24dp"
        android:title="My Account"
        app:iconTint="@drawable/selector" />
    <item
        android:id="@+id/nav_settings"
        android:icon="@drawable/ic_settings_black_24dp"
        android:title="Settings"
        app:iconTint="@drawable/selector" />

    <item
        android:id="@+id/nav_logout"
        android:icon="@drawable/logout"
        android:title="Log Out"
        app:iconTint="@drawable/selector" />
</menu>

ফলাফল:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.