অ্যান্ড্রয়েডে মেনু আইটেমের পাঠ্য রঙটি কীভাবে পরিবর্তন করবেন?


175

আমি কি অ্যান্ড্রয়েডে মেনু আইটেমের পটভূমি রঙ পরিবর্তন করতে পারি?

কারও কাছে এর কোনও সমাধান আছে কিনা দয়া করে আমাকে জানান। শেষ বিকল্পটি অবশ্যই এটি কাস্টমাইজ করার জন্য হবে তবে পাঠ্য রঙটি কাস্টমাইজ না করে পরিবর্তন করার কোনও উপায় আছে।


এমন কেউ আছে যে আমাকে এর সমাধান জানাতে পারে?
সুনীল

3
আপনি কি পাঠ্যের রঙ, পাঠ্য দর্শনের পটভূমির রঙ পরিবর্তন করতে চান? অথবা উভয়? দুটোই আলাদা জিনিস। দয়া করে প্রশ্নটি আবার ফ্রেম করুন।
অভিনব সাক্সেনা

উত্তর:


335

আপনার থিমের একটি সহজ লাইন :)

<item name="android:actionMenuTextColor">@color/your_color</item>

19
দ্রষ্টব্য: এটি অবশ্যই আপনার অ্যাপ্লিকেশনটির মূল থিম সংজ্ঞাতে চলেছে actionBarStyle, উদাহরণের মধ্যে নয় । এটি actionBarStyleযৌক্তিক বলে মনে হলেও এটি এর মধ্যে কাজ করবে না !
কলিন এম। 18

47
নিম্ন এপিআই সংস্করণগুলি সমর্থন <item name="actionMenuTextColor">@color/your_color</item>করতে অ্যান্ড্রয়েড নেমস্পেস ব্যবহার করবেন না
alex.p

5
@ColinM। এটি একটি থিম মধ্যে যেতে হবে । আপনি যদি themeনিজের সরঞ্জামদণ্ডে কোনও বৈশিষ্ট্য সেট করেন তবে এটি কাজ করে।
দারিয়াসএল

2
অ্যান্ড্রয়েড বা নাম ছাড়া আমার পক্ষে কাজ করছিল না: নামস্থান sp এটি মূল অ্যাপ্লিকেশন থিমে যুক্ত হয়েছিল।
র্যাকস

2
আমি এখনও পাঠ্যের রঙ পরিবর্তন করতে পুরোপুরি অক্ষম। আমার সামগ্রিক থিম পাঠ্য রঙটি কেবল অগ্রাধিকার নেয়। কোন সাহায্য? এই উত্তরগুলির কোনওটিই কাজ করে না।
ডেভিড পি

114

মনে হয় এটি একটি

  <item name="android:itemTextAppearance">@style/myCustomMenuTextAppearance</item>

আমার থিম এবং

   <style name="myCustomMenuTextAppearance" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
        <item name="android:textColor">@android:color/primary_text_dark</item>
    </style>

শৈলীতে। এক্সএমএল তালিকা-আইটেমগুলির স্টাইল পরিবর্তন করে তবে মেনু আইটেমগুলি নয়।


5
এটি প্রসঙ্গ মেনু আইটেমগুলির জন্য দুর্দান্ত কাজ করে (মেনু বোতাম থেকে মেনু আইটেম নয়) যা আমি খুঁজছিলাম। পুরো লেআউটফ্যাক্টরি গণ্ডগোলের চেয়ে অনেক সহজ।
চুবসনডাবস

android:itemTextAppearanceঅ্যাট্রিবিউট একটি শৈলী যার পিতা বা মাতা হল মধ্যে স্থাপন করা যাবে না parent="@android:style/Widget.Holo.ListPopupWindow"যেহেতু সঠিকভাবে রেন্ডার করা হবে না। এটি অবশ্যই তার পিতামাতার মতো একটি শীর্ষ স্তরের স্টাইলে থাকতে হবে android:Theme.Holo.Light.DarkActionBar
toobsco42

আমি <আইটেমের নাম = "অ্যান্ড্রয়েড: আইটেমটেক্সট অ্যাপিয়রেন্স"> @ শৈলী / মাই কাস্টমমেনু টেক্সটএপিয়ারেন্স </item> কোথায় যুক্ত করব?
বাগসফ্লায়ার

@bagusflyer আপনি আপনার থিমের মূল শৈলী যে যোগ করা উচিত, অর্থাত্ শৈলী যে শিশু Theme.Holoবা Theme.Holo.Light.DarkActionBarবা অনুরূপ।
তাশ পেমিভা

86

আপনি পরিবর্তে MenuItemব্যবহার করে সহজেই পাঠ্যের রঙ পরিবর্তন করতে পারেন ।SpannableStringString

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu, menu);

    int positionOfMenuItem = 0; // or whatever...
    MenuItem item = menu.getItem(positionOfMenuItem);
    SpannableString s = new SpannableString("My red MenuItem");
    s.setSpan(new ForegroundColorSpan(Color.RED), 0, s.length(), 0);
    item.setTitle(s);
}

10
এটি আমার জন্য 4.4 এবং 5+ উভয় ক্ষেত্রে ব্যবহার করেছেmenu.findItem(R.id.menu_item_id);menu.getItem()
হ্যাগমি

1
আমার জন্যও [ফাইন্ড আইটেম (...) ব্যবহার করে] কাজ করেছেন।
ধাঁধা

6
"সবসময়": সমাধান শুধুমাত্র ওভারফ্লো মধ্যে আইটেমের জন্য .... আমি আইটেমটি রঙ যা showAsAction সেটিং দ্বারা দৃশ্যমান তা পরিবর্তন করতে wan't কাজ
জুনায়েদ

56

আপনি যদি থিম সহ নতুন সরঞ্জামদণ্ডটি ব্যবহার করছেন তবে Theme.AppCompat.Light.NoActionBarআপনি এটি নিম্নলিখিত পদ্ধতিতে স্টাইল করতে পারেন।

 <style name="ToolbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:textColorPrimary">@color/my_color1</item>
    <item name="android:textColorSecondary">@color/my_color2</item>
    <item name="android:textColor">@color/my_color3</item>
 </style>`

আমি যে ফলাফল পেয়েছি তা অনুসারে,
android:textColorPrimaryপাঠ্যের রঙটি কি আপনার ক্রিয়াকলাপের নাম প্রদর্শন করে যা সরঞ্জামদণ্ডের প্রাথমিক পাঠ্য।

android:textColorSecondaryসাবটাইটেল এবং আরও বিকল্পের (3 ডট) বোতামের পাঠ্য রঙ। (হ্যাঁ, এটি এই সম্পত্তি অনুযায়ী এটির রঙ পরিবর্তন করেছে!)

android:textColorমেনু সহ অন্যান্য সমস্ত পাঠ্যের রঙ।

অবশেষে থিমটি সরঞ্জামদণ্ডে সেট করুন

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:theme="@style/ToolbarTheme"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"/>

টুলবারে ক্রিয়া (পাঠ্য) হিসাবে প্রদর্শিত বোতামগুলির পাঠ্যটি কোন আইটেমটি পরিচালনা করে? অ্যান্ড্রয়েড: টেক্সট কালারপ্রাইমারি, অ্যান্ড্রয়েড: টেক্সট কালার সেকেন্ডারি বা অ্যান্ড্রয়েড: টেক্সট কালার তাদের প্রভাবিত করে বলে মনে হচ্ছে না।
লার্শ

পূর্ববর্তী মন্তব্যে আমার প্রশ্নের উত্তরে: android:actionMenuTextColor( স্ট্যাকওভারফ্লো . com/a/5538709/423105 দেখুন )।
লার্শ

32

আপনি যদি মেনুটি ব্যবহার করেন <android.support.design.widget.NavigationView />তবে কেবল নীচে লাইনটি যুক্ত করুন NavigationView:

app:itemTextColor="your color"

আইকনের জন্য রঙিন টিন্ট উপলব্ধ, এটি আপনার আইকনের জন্য রঙকেও ওভাররাইড করবে। তার জন্য আপনাকে নীচে লাইন যুক্ত করতে হবে:

app:itemIconTint="your color"

উদাহরণ:

<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:itemTextColor="@color/color_white"
        app:itemIconTint="@color/color_white"

        android:background="@color/colorPrimary"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer"/>

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


এটি অন্য আইটেমের নীস্টযুক্ত আইটেমগুলিকে পরিবর্তন করেছে, তবে এটি অন্যান্য আইটেমযুক্ত আইটেমটি পরিবর্তন করে নি। আপনি কি জানেন যে আমি কীভাবে সেগুলি পরিবর্তন করতে পারি?
দিনু নিকোলা

@ ডিনুনিকোলেট আপনি কি দয়া করে আপনার উদাহরণের স্ক্রিনশট পোস্ট করতে পারেন? অথবা আরও বিশদ সরবরাহ করুন।
মিহির ত্রিবেদী

আমার কাছে <item> <menu> <অভ্যন্তরীণ আইটেম> </menu> </item> ছিল এবং কেবলমাত্র অভ্যন্তরের আইটেমগুলির রঙ বদলেছে
দিনু নিকোল

31

আমি প্রোগ্রামের মতো এটি সম্পর্কে গিয়েছিলাম:

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.changeip_card_menu, menu); 
    for(int i = 0; i < menu.size(); i++) {
        MenuItem item = menu.getItem(i);
        SpannableString spanString = new SpannableString(menu.getItem(i).getTitle().toString());
        spanString.setSpan(new ForegroundColorSpan(Color.BLACK), 0,     spanString.length(), 0); //fix the color to white
        item.setTitle(spanString);
    }
    return true;
}

2
আপনার উত্তর আমাকে মেনু আইটেম পাঠ্যকে সাহসী করতে সেট করেছে। (এস.সেটস্প্যান (নতুন স্টাইলস্প্যান (অ্যান্ড্রয়েড.গ্রাফিক্স.টাইফেস.ফোল্ড.এল)), 0, s.leth (), 0); ধন্যবাদ!
আরকাদিউজ সিয়েলিস্কি

এই সমাধানটি আমার সমস্যাটিকে সহায়তা করেছে। আমি এটি পছন্দ করি কারণ এটি থিম রিলেটেড কনডিশনের উপর নির্ভর করে না।
টমক্যাট

15

আপনি এই প্রশ্নে দেখতে পারেন আপনার উচিত:

<item name="android:textColorPrimary">yourColor</item>

উপরের কোডটি API> = v21 এর জন্য মেনু ক্রিয়া আইটেমগুলির পাঠ্যের রঙ পরিবর্তন করে color

<item name="actionMenuTextColor">@android:color/holo_green_light</item>

উপরে API <ভি 21 এর কোড রয়েছে


ধন্যবাদ. এটি গ্রহণ করা উচিত। এটি সহজ এবং সহজ
পুজোর

10

আমি মেনু আইটেম স্ফীত করা হয় যখন একটি একক আইটেমের পাঠ্য রঙ পরিবর্তন করতে এইচটিএমএল ট্যাগ ব্যবহার। আশা করি এটি সহায়ক হবে।

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    menu.findItem(R.id.main_settings).setTitle(Html.fromHtml("<font color='#ff3824'>Settings</font>"));
    return true;
}

1
মার্শমেলোতে এটি আমার পক্ষে কাজ করে না। পাঠ্য প্রয়োগ করা হয়েছে, তবে রঙটি নয়।
অলি সি

মার্শম্যালো সম্পর্কে, সম্ভবত এটি ম্যাক্স.মাস্টারম্যানের উত্তরে বর্ণিত একই কারণে কাজ করে না, "সমাধানগুলি কেবল ওভারফ্লোতে আইটেমের জন্যই কাজ করে।"
জোসে_জিডি

10

একক সরঞ্জামদণ্ডের জন্য কাস্টম মেনু রঙ তৈরি করার সহজ উপায়, অ্যাপপ্লেমের জন্য নয়

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay.MenuBlue">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"/>
    </android.support.design.widget.AppBarLayout>

স্টাইল.এক্সএমএল এ সাধারণ সরঞ্জামদণ্ড

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>

আমাদের কাস্টম সরঞ্জামদণ্ড শৈলী

<style name="AppTheme.AppBarOverlay.MenuBlue">
    <item name="actionMenuTextColor">@color/blue</item>
</style>

দুর্দান্ত কাজ! সর্বোত্তম উত্তর.
bebe

9

কোটলিনে আমি এই এক্সটেনশনগুলি লিখেছিলাম:

fun MenuItem.setTitleColor(color: Int) {
    val hexColor = Integer.toHexString(color).toUpperCase().substring(2)
    val html = "<font color='#$hexColor'>$title</font>"
    this.title = html.parseAsHtml()
}           



@Suppress("DEPRECATION")                                                                        
fun String.parseAsHtml(): Spanned {                                                             
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {                                
        Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)                                         
    } else {                                                                                    
        Html.fromHtml(this)                                                                     
    }                                                                                           
}  

এবং এটির মতো ব্যবহৃত:

menu.findItem(R.id.main_settings).setTitleColor(Color.RED)

সত্যিই এই সমাধানটি পছন্দ করুন, খুব ঝরঝরে!
জামিল নওয়াজ

ধন্যবাদ, সহজ এবং দ্রুত সমাধান। এপিআই> 24 এর জন্য এটি দ্বিতীয়
এক্স

7

সংক্ষিপ্ত উত্তর হল হ্যাঁ. ভাগ্যবান তুমি!
এটি করতে, আপনাকে অ্যান্ড্রয়েড ডিফল্ট স্টাইলগুলির কয়েকটি স্টাইলকে ওভাররাইড করতে হবে:

প্রথমত, অ্যান্ড্রয়েডে থিমগুলির সংজ্ঞাটি দেখুন :

<style name="Theme.IconMenu">
<!-- Menu/item attributes -->
<item name="android:itemTextAppearance">@android:style/TextAppearance.Widget.IconMenu.Item</item>
<item name="android:itemBackground">@android:drawable/menu_selector</item>
<item name="android:itemIconDisabledAlpha">?android:attr/disabledAlpha</item>
<item name="android:horizontalDivider">@android:drawable/divider_horizontal_bright</item>
<item name="android:verticalDivider">@android:drawable/divider_vertical_bright</item>
<item name="android:windowAnimationStyle">@android:style/Animation.OptionsPanel</item>
<item name="android:moreIcon">@android:drawable/ic_menu_more</item>
<item name="android:background">@null</item>
</style>

সুতরাং, মেনুতে পাঠ্যের উপস্থিতি শৈলীর@android:style/TextAppearance.Widget.IconMenu.Item
সংজ্ঞায় এখনই রয়েছে :

<style name="TextAppearance.Widget.IconMenu.Item" parent="TextAppearance.Small">
<item name="android:textColor">?textColorPrimaryInverse</item>
</style>

সিস্টেমের সংস্থানসমূহের রঙিন ফোল্ডারে যদি আপনি তাকান তবে এখন আমাদের কাছে প্রশ্নযুক্ত রঙের নাম রয়েছে:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@android:color/bright_foreground_light_disabled" /> 
<item android:state_window_focused="false" android:color="@android:color/bright_foreground_light" /> 
<item android:state_pressed="true" android:color="@android:color/bright_foreground_light" /> 
<item android:state_selected="true" android:color="@android:color/bright_foreground_light" /> 
<item android:color="@android:color/bright_foreground_light" /> 
<!--  not selected --> 
</selector>

শেষ পর্যন্ত, আপনার যা করা দরকার তা এখানে:

"TextAppearance.Widget.IconMenu.Item" ওভাররাইড করুন এবং আপনার নিজস্ব স্টাইল তৈরি করুন। তারপরে এটি আপনার পছন্দসইভাবে লিঙ্ক করুন এটি আপনার পছন্দ মতো করুন। আশা করি এটি আপনাকে সহায়তা করবে। শুভকামনা!


জবাব দেওয়ার জন্য ধন্যবাদ আমি যা করেছি কি আপনি প্রস্তাব কিন্তু এটি মেনু আইটেম রঙ পরিবর্তন করবেন না
সুনীল

প্রকৃতপক্ষে, আমি কেবল মেনু স্টাফগুলির আরও বেশি কিছু পড়ে বুঝতে পেরেছিলাম যে এটি ভেবেছিলাম তার চেয়ে অনেক জটিল you আপনি যদি নিজের নিজস্ব কাস্টম মেনুটি তৈরি করতে না চান তবে আমার আরও কিছু পড়ার দরকার পড়বে, আমি রাখব আমি যদি আরও খুঁজে পাই তবে আপনি এখানে পোস্ট করেছেন।
সেফি

"TextAppearance.Widget.IconMenu.Item" ওভাররাইড করা সম্ভব নয়।
পিক্সেস করুন

এই উত্তরটি বিভ্রান্তিমূলক .. সুতরাং উপসংহারটি, এটি কাজ করে না এবং মূলত চিন্তার চেয়ে অর্জনের জন্য অনেক বেশি শক্ত / দীর্ঘতর বাতাসযুক্ত?
স্পিডিয়েনমডস 15 '17

6

অ্যান্ড্রয়েডের বিকল্প মেনুটিকে পটভূমি সেট করতে বা পাঠ্যের উপস্থিতি পরিবর্তন করতে কাস্টমাইজ করা যায়। মেনুতে পটভূমি এবং পাঠ্য রঙ থিম এবং শৈলী ব্যবহার করে পরিবর্তন করা যায় না। অ্যান্ড্রয়েড সোর্স কোড (ডেটা \ রেজিস \ লেআউট \ আইকন_মেনু_সাইটম_লেআউটআউট.এমএমএল) ক্লাসের একটি কাস্টম আইটেম ব্যবহার করে "com.android.intern.view.menu.IconMenuItem" মেনু বিন্যাসের জন্য দেখুন। মেনুটি কাস্টমাইজ করতে আমরা উপরের শ্রেণিতে পরিবর্তন করতে পারি। এটি অর্জন করতে, লেআউটআইনফ্লেটার কারখানা শ্রেণিটি ব্যবহার করুন এবং দৃশ্যের জন্য পটভূমি এবং পাঠ্য রঙ সেট করুন।


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.my_menu, menu);
    getLayoutInflater().setFactory(new Factory() {
        @Override
        public View onCreateView(String name, Context context, AttributeSet attrs) {
            if (name .equalsIgnoreCase(“com.android.internal.view.menu.IconMenuItemView”)) {
                try{
                    LayoutInflater f = getLayoutInflater();
                    final View view = f.createView(name, null, attrs);
                    new Handler().post(new Runnable() {
                        public void run() {
                            // set the background drawable
                            view .setBackgroundResource(R.drawable.my_ac_menu_background);

                            // set the text color
                            ((TextView) view).setTextColor(Color.WHITE);
                        }
                    });
                    return view;
                } catch (InflateException e) {
                    } catch (ClassNotFoundException e) {}
            }
            return null;
        }
    });
    return super.onCreateOptionsMenu(menu);
}



3
03-23 19:45:25.134: E/AndroidRuntime(26761): java.lang.IllegalStateException: A factory has already been set on this LayoutInflater
করার ক্রা

এটি প্রথমবারের জন্য কাজ করে। আপনি দ্বিতীয়বার মেনু খুললে আপনি ব্যতিক্রম পাবেন get
লাভফোরড্রয়েড

6

কোড উদাহরণের জন্য ধন্যবাদ। একটি কনটেক্সট মেনুতে এটি কাজ করার জন্য আমাকে এটি পরিবর্তন করতে হয়েছিল। এটা আমার সমাধান।

    static final Class<?>[] constructorSignature = new Class[] {Context.class, AttributeSet.class};

class MenuColorFix implements LayoutInflater.Factory {
    public View onCreateView(String name, Context context, AttributeSet attrs) {
        if (name.equalsIgnoreCase("com.android.internal.view.menu.ListMenuItemView")) {
            try {
                Class<? extends ViewGroup> clazz = context.getClassLoader().loadClass(name).asSubclass(ViewGroup.class);
                Constructor<? extends ViewGroup> constructor = clazz.getConstructor(constructorSignature);
                final ViewGroup view = constructor.newInstance(new Object[]{context,attrs});

                new Handler().post(new Runnable() {
                    public void run() {
                        try {
                            view.setBackgroundColor(Color.BLACK);
                            List<View> children = getAllChildren(view);
                            for(int i = 0; i< children.size(); i++) {
                                View child = children.get(i);
                                if ( child instanceof TextView ) {
                                    ((TextView)child).setTextColor(Color.WHITE);
                                }
                            }
                        }
                        catch (Exception e) {
                            Log.i(TAG, "Caught Exception!",e);
                        }

                    }
                });
                return view;
            }
            catch (Exception e) {
                Log.i(TAG, "Caught Exception!",e);
            }
        }
        return null;
    }       
}

public List<View> getAllChildren(ViewGroup vg) {
    ArrayList<View> result = new ArrayList<View>();
    for ( int i = 0; i < vg.getChildCount(); i++ ) {
        View child = vg.getChildAt(i);
        if ( child instanceof ViewGroup) {
            result.addAll(getAllChildren((ViewGroup)child));
        }
        else {
            result.add(child);
        }
    }
    return result;
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    LayoutInflater lInflater = getLayoutInflater();
    if ( lInflater.getFactory() == null ) {
        lInflater.setFactory(new MenuColorFix());
    }
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.myMenu, menu);
}

আমার জন্য এটি অ্যান্ড্রয়েড 1.6, 2.03 এবং 4.03 এর সাথে কাজ করে।


আপনি যদি উপরের কাজটি করে থাকেন তবে আপনার কেবল মারকাস ওলছন সমাধানটি ব্যবহার করা উচিত। অনেক সহজ।
চুবসনডাবস

এক্সএমএল সলিউশনটি আমার জন্য উদাহরণস্বরূপ ২.৩.x এ কাজ করে না, তবে এটি একটি কবজির মতো কাজ করে - এছাড়াও 4.x এ
সানলোক

এই সমাধানটি সবচেয়ে ভাল কাজ করেছে। সামঞ্জস্যতা গ্রন্থাগারটি ব্যবহার করে ডিভাইসগুলিতে শৈলীগুলি প্রয়োগ করতে আমাকে android.support.v7.internal.view.menu.ListMenuItemView- ক্যাপচার করতে হয়েছিল
চিয়াতর

এই ফিক্সটি গুগল ম্যাপস ভি 2 এর সাথে কাজ করবে না - মানচিত্রটি সঠিকভাবে রেন্ডার করার জন্য সুপার পদ্ধতিটি 1 ম কল করা উচিত।
চিয়াতর

5

আমি এটি ইউরেকা পেয়েছি !!

আপনার অ্যাপ্লিকেশন থিমে:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/ActionBarTheme</item>
    <!-- backward compatibility -->          
    <item name="actionBarStyle">@style/ActionBarTheme</item>        
</style>

আপনার অ্যাকশন বার থিমটি এখানে:

<style name="ActionBarTheme" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
   <item name="android:background">@color/actionbar_bg_color</item>
   <item name="popupTheme">@style/ActionBarPopupTheme</item
   <!-- backward compatibility -->
   <item name="background">@color/actionbar_bg_color</item>
</style>

এবং এখানে আপনার পপআপ থিম:

 <style name="ActionBarPopupTheme">
    <item name="android:textColor">@color/menu_text_color</item>
    <item name="android:background">@color/menu_bg_color</item>
 </style>

চিয়ার্স;)


5

কোডের নীচে মেনু আইটেম পাঠ্যের রঙ ব্যবহার করতে

<style name="AppToolbar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:itemTextAppearance">@style/menu_item_color</item>
</style>

কোথায়

<style name="menu_item_color">
<item name="android:textColor">@color/app_font_color</item>
</style>

4

ম্যাক্স.মাস্টারম্যানকে ধন্যবাদ, এই সমাধানটি আমি 22 স্তরে কাজ করতে পেরেছি:

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    MenuItem searchMenuItem = menu.findItem(R.id.search);
    SearchView searchView = (SearchView) searchMenuItem.getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setSubmitButtonEnabled(true);
    searchView.setOnQueryTextListener(this);
    setMenuTextColor(menu, R.id.displaySummary, R.string.show_summary);
    setMenuTextColor(menu, R.id.about, R.string.text_about);
    setMenuTextColor(menu, R.id.importExport, R.string.import_export);
    setMenuTextColor(menu, R.id.preferences, R.string.settings);
    return true;
}

private void setMenuTextColor(Menu menu, int menuResource, int menuTextResource) {
    MenuItem item = menu.findItem(menuResource);
    SpannableString s = new SpannableString(getString(menuTextResource));
    s.setSpan(new ForegroundColorSpan(Color.BLACK), 0, s.length(), 0);
    item.setTitle(s);
}

হার্ডকোড পদ্ধতিতে Color.BLACKঅতিরিক্ত প্যারামিটারে পরিণত হতে পারে setMenuTextColor। এছাড়াও, আমি এটি কেবল মেনু আইটেমগুলির জন্য ব্যবহার করেছি android:showAsAction="never"


আমার জন্য এপিআই 24 এ কাজ করছেন না? কোনও ধারণা? কয়েকদিন ধরে এই আটকে ছিল ... হাস্যকর!
ডেভিড পি

আপনাকে কী বলব তা নিশ্চিত নয়। এটি আমার পক্ষে এপিআই 25-এ কাজ করছে
হালকা রক্ষক

3

আপনি প্রোগ্রামগতভাবে রঙ সেট করতে পারেন।

private static void setMenuTextColor(final Context context, final Toolbar toolbar, final int menuResId, final int colorRes) {
    toolbar.post(new Runnable() {
        @Override
        public void run() {
            View settingsMenuItem =  toolbar.findViewById(menuResId);
            if (settingsMenuItem instanceof TextView) {
                if (DEBUG) {
                    Log.i(TAG, "setMenuTextColor textview");
                }
                TextView tv = (TextView) settingsMenuItem;
                tv.setTextColor(ContextCompat.getColor(context, colorRes));
            } else { // you can ignore this branch, because usually there is not the situation
                Menu menu = toolbar.getMenu();
                MenuItem item = menu.findItem(menuResId);
                SpannableString s = new SpannableString(item.getTitle());
                s.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, colorRes)), 0, s.length(), 0);
                item.setTitle(s);
            }

        }
    });
}

3

এটিকে আমার স্টাইলস.এক্সএমএলে যুক্ত করা আমার পক্ষে কাজ করেছে

<item name="android:textColorPrimary">?android:attr/textColorPrimaryInverse</item>

2

এটি কেবল আপনার থিমে যুক্ত করুন

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:itemTextAppearance">@style/AppTheme.ItemTextStyle</item>
</style>

<style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
        <item name="android:textColor">@color/orange_500</item>
</style>

21 এআইপি-তে পরীক্ষা করা হয়েছে


2
এটি ব্যবহার করা ভাল <style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget">, অন্যথায় পাঠ্যটি ওভারফ্লো মেনুতে খুব ছোট দেখাচ্ছে। আরও মনে রাখবেন যে এই কৌশলটি কেবল অ্যান্ড্রয়েড 5 এবং তারপরের উপর কাজ করে।
মিস্টার-আইডিই

2
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.search, menu);


    MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
    SearchView searchView = (SearchView) myActionMenuItem.getActionView();

    EditText searchEditText = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
    searchEditText.setTextColor(Color.WHITE); //You color here

1
আপনার উত্তরটি ব্যাখ্যা করুন
কোডার

1
এটি যদি অনুসন্ধান ভিউ না হয়?
nasch

2

আমার পরিস্থিতিটি বিকল্পগুলির মেনুতে পাঠ্যের রঙ সেটিংস ছিল (মেনু বোতাম টিপে প্রধান অ্যাপ্লিকেশন মেনু প্রদর্শিত হয়েছে)।

পরীক্ষিত এপিআই 16 সঙ্গে appcompat-v7-27.0.2 গ্রন্থাগার, AppCompatActivityজন্য MainActivityএবং AppCompatএ অ্যাপ্লিকেশনের জন্য থিম Andro আইডি

শৈলী.এক্সএমএল :

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  <item name="actionBarPopupTheme">@style/PopupTheme</item>
</style>

<style name="PopupTheme" parent="@style/ThemeOverlay.AppCompat.Light">
  <item name="android:textColorSecondary">#f00</item>
</style>

textColorSecondaryএটি অন্যান্য উপাদানগুলিকে প্রভাবিত করে কিনা জানি না তবে এটি মেনু পাঠ্যের রঙকে নিয়ন্ত্রণ করে।


আমি বিষয়টিতে কয়েকটি উদাহরণ অনুসন্ধান করেছি তবে ব্যবহারের জন্য প্রস্তুত সমস্ত স্নিপেট কাজ করে না।

সুতরাং আমি এটিকে অ্যাপকম্প্যাট-ভি 7 লাইব্রেরির উত্স কোড (বিশেষত .আর প্যাকেজের রেস ফোল্ডারের সাথে ) দিয়ে অনুসন্ধান করতে চেয়েছিলাম ।

যদিও আমার ক্ষেত্রে আমি বিস্ফোরিত .আর নির্ভরতার সাথে Eclipse ব্যবহার করেছি । সুতরাং আমি ডিফল্ট শৈলীগুলি পরিবর্তন করতে এবং ফলাফলগুলি পরীক্ষা করতে পারি। গ্রেডল বা অ্যান্ড্রয়েড স্টুডিওর সাহায্যে গ্রন্থাগারগুলিকে কীভাবে বিস্ফোরিত করবেন তা জানেন না সরাসরি । এটি তদন্তের আরও একটি সূত্রের দাবিদার।

সুতরাং আমার উদ্দেশ্যটি ছিল তাই মেনু পাঠ্যের জন্য res / মান / মান.xML ফাইলের কোন রঙটি ব্যবহার করা হবে তা খুঁজে পেয়েছি (আমি প্রায় নিশ্চিত ছিলাম যে রঙটি সেখানে ছিল)।

  1. আমি সেই ফাইলটি খুললাম, তারপরে সমস্ত রঙের সদৃশ হয়েছি, সেগুলি ওভাররাইড করার জন্য ডিফল্ট ফাইলগুলির নীচে রেখেছি এবং নির্ধারিত করেছি #f00 সকলকে মূল্য করেছি।
  2. অ্যাপ্লিকেশন শুরু করুন।
  3. অনেক উপাদান লাল পটভূমি বা পাঠ্য রঙ ছিল। এবং মেনু আইটেম। এটাই আমার দরকার ছিল।
  4. 5-10 লাইন ব্লক করে আমার যুক্ত রঙগুলি সরিয়ে আমি secondary_text_default_material_lightরঙ আইটেম দিয়ে শেষ করেছি ।
  5. মধ্যে ফাইলের মধ্যে যে নাম খুঁজছেন মাঝামাঝি (মধ্যে ভাল বা ফোল্ডার মাঝামাঝি / রং ) আমি একমাত্র সংঘটন পাওয়া রং / abc_secondary_text_material_light.xml ফাইল (আমি সাবলাইম টেক্সট এসব অস্ত্রোপচারের জন্য তাই এটি জিনিস আমি প্রয়োজন খুঁজে পাওয়া সহজ ব্যবহৃত হয়)।
  6. মানগুলিতে ফিরে যান। XML এর জন্য 8 টি ব্যবহারের সন্ধান করা হয়েছিল @color/abc_secondary_text_material_light
  7. এটি একটি হালকা থিম ছিল তাই 2 থিমের 4 টি বাকি: Base.ThemeOverlay.AppCompat.Lightএবং Platform.AppCompat.Light
  8. প্রথম থিমটি দ্বিতীয়টির একটি শিশু ছিল সুতরাং সেই রঙের সংস্থান সহ কেবলমাত্র 2 টি বৈশিষ্ট্য ছিল: android:textColorSecondaryএবং android:textColorTertiaryমধ্যে Base.ThemeOverlay.AppCompat.Light
  9. সরাসরি তাদের মান পরিবর্তন values.xml এবং অ্যাপ্লিকেশন চলমান আমি দেখেছি যে চূড়ান্ত সঠিক অ্যাট্রিবিউট ছিল android:textColorSecondary
  10. এর পরে আমার একটি থিম বা অন্য একটি বৈশিষ্ট্য প্রয়োজন যাতে আমি এটি আমার অ্যাপ্লিকেশন এর স্টাইল.এক্সএমএল এ পরিবর্তন করতে পারি (কারণ আমার থিমটির পিতামাতার হিসাবে ছিল Theme.AppCompat.Lightএবং না ThemeOverlay.AppCompat.Light)।
  11. আমি একই ফাইলটিতে অনুসন্ধান করেছি Base.ThemeOverlay.AppCompat.Light। এটি একটি শিশু ছিল ThemeOverlay.AppCompat.Light
  12. অনুসন্ধানের জন্য ThemeOverlay.AppCompat.Lightআমি এটির বৈশিষ্ট্যটির মান Base.Theme.AppCompat.Light.DarkActionBarহিসাবে থিমটিতে এর ব্যবহার পেয়েছি actionBarPopupTheme
  13. আমার অ্যাপ্লিকেশনটির থিমটি প্রাপ্তির Theme.AppCompat.Light.DarkActionBarএকটি শিশু ছিল Base.Theme.AppCompat.Light.DarkActionBarযাতে আমি সেই বৈশিষ্ট্যটি আমার স্টাইলস.এক্সএমএলে ব্যবহার করতে পারি ছাড়াই ।
  14. এটি উপরের উদাহরণ কোডে যেমন দেখা গেছে আমি উল্লিখিত থেকে একটি শিশু থিম তৈরি করেছি ThemeOverlay.AppCompat.Lightএবং android:textColorSecondaryবৈশিষ্ট্যটি পরিবর্তন করেছি ।

https://i.imgur.com/LNfKdzC.png


1

সেফির সমাধানটি কাজ করে না। উপরে বর্ণিত পদ্ধতিটি ব্যবহার করে বিকল্পগুলির মেনু আইটেমের পাঠ্য উপস্থিতিকে ওভাররাইড করা সম্ভব তবে আইটেম বা মেনু নয়। এটি করার জন্য প্রয়োজনীয়ভাবে 3 টি উপায় রয়েছে:

  1. বিকল্প মেনুর পটভূমির রঙ কীভাবে পরিবর্তন করবেন?
  2. আপনার পছন্দের ফলাফলগুলি পেতে ক্রেইটঅ্যাপশনস মেনু এবং অন প্রিপার্পেপশনমেনু প্রদর্শন করতে ও ওভাররাইড করতে আপনার নিজের ভিউ লিখুন। আমি সাধারণত এটি বর্ণনা করি কারণ এই পদ্ধতিগুলিতে আপনি যা যা করতে পারেন তা করতে পারেন তবে আপনি সম্ভবত সুপার () এ কল করতে চান না।
  3. ওপেন-সোর্স এসডিকে থেকে কোড অনুলিপি করুন এবং আপনার আচরণের জন্য কাস্টমাইজ করুন। ক্রিয়াকলাপ দ্বারা ব্যবহৃত ডিফল্ট মেনু প্রয়োগ আর কার্যকর হবে না।

4441 সংখ্যা দেখুন : আরও ক্লুসের জন্য কাস্টম বিকল্প মেনু থিম


পুনরাবৃত্তি করতে ... সেফির সমাধান মেনু আইটেম টেক্সটএপরিয়েন্সের জন্য কাজ করে, যদিও আমি যা করেছি তা থিমস.এক্সএমএল এর মাধ্যমে ডিফল্টটিকে ওভাররাইড করে। এছাড়াও উপরের # 2 বা # 3 জনকে সচেতন হওয়া উচিত যে সুপার # অনক্রিটঅপশনগুলি মেনু / সুপার # অনপ্রিপার্পশনমেনুতে কল করা সিস্টেম মেনু আইটেমগুলি রাখার জন্য ডিজাইন করা হয়েছে ... ক্রিয়াকলাপ # মেনু () এর ক্রিয়াকলাপের জাভাডকে নির্দেশিত হিসাবে। এটি আপনার অ্যাপ্লিকেশনটির জন্য / নাও পারে।
ভয়ঙ্কর

সেলফি যা বর্ণনা করছে তা হ'ল এটি আপনার থিমগুলিতে থাকে ml > <আইটেমের নাম = "অ্যান্ড্রয়েড: টেক্সট সাইজ"> 12 ডিপি </item> <আইটেমের নাম = "অ্যান্ড্রয়েড: টেক্সট কালার"> # এফএফএফএফএফ </item> </style> এটি যতটা সহজ। আপনি কি বোঝাতে চেয়েছিলেন? গভীর বিকল্পসমূহ-মেনু কাস্টমাইজেশন মোটেও সহজ নয়, তবে আমি শীঘ্রই এ সম্পর্কে একটি ব্লগ নিবন্ধ পোস্ট করার ইচ্ছা করি।
ভয়ঙ্কর

1

এই কোডটি চেষ্টা করুন ....

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
         inflater.inflate(R.menu.my_menu, menu);

        getLayoutInflater().setFactory(new Factory() {
            @Override
            public View onCreateView(String name, Context context,
                    AttributeSet attrs) {

                if (name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")) {
                    try {
                        LayoutInflater f = getLayoutInflater();
                        final View view = f.createView(name, null, attrs);

                        new Handler().post(new Runnable() {
                            public void run() {

                                // set the background drawable
                                 view.setBackgroundResource(R.drawable.my_ac_menu_background);

                                // set the text color
                                ((TextView) view).setTextColor(Color.WHITE);
                            }
                        });
                        return view;
                    } catch (InflateException e) {
                    } catch (ClassNotFoundException e) {
                    }
                }
                return null;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

1
Android এর উপর> 4.0 আমি পেয়ে করছিjava.lang.IllegalStateException: A factory has already been set on this LayoutInflater
করতে ক্রা

1

আপনি যদি কোনও পৃথক মেনু আইটেমের জন্য রঙ সেট করতে চান তবে একটি সরঞ্জামদণ্ডের থিমটি অনুকূলিতকরণ করা সঠিক সমাধান নয়। এটি অর্জন করতে, আপনি অ্যান্ড্রয়েডের ব্যবহার করতে পারেন: মেনু আইটেমটির জন্য অ্যাকশন লেআউট এবং অ্যাকশন ভিউ।

অ্যাকশন দেখার জন্য প্রথমে একটি এক্সএমএল লেআউট ফাইল তৈরি করুন। এই উদাহরণে আমরা অ্যাকশন ভিউ হিসাবে একটি বোতাম ব্যবহার করি:

menu_button.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/menuButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Done"
        android:textColor="?android:attr/colorAccent"
        style="?android:attr/buttonBarButtonStyle"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

উপরের কোড স্নিপেটে, আমরা android:textColor="?android:attr/colorAccent"বোতামের পাঠ্যের রঙ কাস্টমাইজ করতে ব্যবহার করি ।

তারপরে মেনুটির জন্য আপনার এক্সএমএল লেআউট ফাইলটিতে, app:actionLayout="@layout/menu_button"নীচের প্রদর্শিত হিসাবে অন্তর্ভুক্ত করুন :

main_menu.xml

<?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/menuItem"
        android:title=""
        app:actionLayout="@layout/menu_button"
        app:showAsAction="always"/>
</menu>

onCreateOptionsMenu()আপনার ক্রিয়াকলাপে সর্বশেষ পদ্ধতিটি ওভাররাইড করুন :

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    MenuItem item = menu.findItem(R.id.menuItem);
    Button saveButton = item.getActionView().findViewById(R.id.menuButton);
    saveButton.setOnClickListener(view -> {
        // Do something
    });
    return true;
}

... বা খণ্ড:

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater){
    inflater.inflate(R.menu.main_menu, menu);
    MenuItem item = menu.findItem(R.id.menuItem);
    Button saveButton = item.getActionView().findViewById(R.id.menuButton);
    button.setOnClickListener(view -> {
        // Do something
    });
}

ক্রিয়া দর্শন সম্পর্কে আরও বিশদের জন্য অ্যান্ড্রয়েড বিকাশকারী গাইডটি দেখুন


0

আপনি রঙের সাথে কোনও নির্দিষ্ট মেনু আইটেমটি এভাবে রঙ করতে পারেন, সমস্ত এপিআই স্তরের জন্য কাজ করে:

public static void setToolbarMenuItemTextColor(final Toolbar toolbar,
                                               final @ColorRes int color,
                                               @IdRes final int resId) {
    if (toolbar != null) {
        for (int i = 0; i < toolbar.getChildCount(); i++) {
            final View view = toolbar.getChildAt(i);
            if (view instanceof ActionMenuView) {
                final ActionMenuView actionMenuView = (ActionMenuView) view;
                // view children are accessible only after layout-ing
                actionMenuView.post(new Runnable() {
                    @Override
                    public void run() {
                        for (int j = 0; j < actionMenuView.getChildCount(); j++) {
                            final View innerView = actionMenuView.getChildAt(j);
                            if (innerView instanceof ActionMenuItemView) {
                                final ActionMenuItemView itemView = (ActionMenuItemView) innerView;
                                if (resId == itemView.getId()) {
                                    itemView.setTextColor(ContextCompat.getColor(toolbar.getContext(), color));
                                }
                            }
                        }
                    }
                });
            }
        }
    }
}

এটি করে আপনি ব্যাকগ্রাউন্ড সিলেক্টর ইফেক্টটি শিথিল করেছেন, সুতরাং মেনু আইটেমের সমস্ত শিশুদের জন্য একটি কাস্টম ব্যাকগ্রাউন্ড নির্বাচনকারী প্রয়োগ করার কোড এখানে।

public static void setToolbarMenuItemsBackgroundSelector(final Context context,
                                                         final Toolbar toolbar) {
    if (toolbar != null) {
        for (int i = 0; i < toolbar.getChildCount(); i++) {
            final View view = toolbar.getChildAt(i);
            if (view instanceof ImageButton) {
                // left toolbar icon (navigation, hamburger, ...)
                UiHelper.setViewBackgroundSelector(context, view);
            } else if (view instanceof ActionMenuView) {
                final ActionMenuView actionMenuView = (ActionMenuView) view;

                // view children are accessible only after layout-ing
                actionMenuView.post(new Runnable() {
                    @Override
                    public void run() {
                        for (int j = 0; j < actionMenuView.getChildCount(); j++) {
                            final View innerView = actionMenuView.getChildAt(j);
                            if (innerView instanceof ActionMenuItemView) {
                                // text item views
                                final ActionMenuItemView itemView = (ActionMenuItemView) innerView;
                                UiHelper.setViewBackgroundSelector(context, itemView);

                                // icon item views
                                for (int k = 0; k < itemView.getCompoundDrawables().length; k++) {
                                    if (itemView.getCompoundDrawables()[k] != null) {
                                        UiHelper.setViewBackgroundSelector(context, itemView);
                                    }
                                }
                            }
                        }
                    }
                });
            }
        }
    }
}

এখানে সহায়তা ফাংশনটিও রয়েছে:

public static void setViewBackgroundSelector(@NonNull Context context, @NonNull View itemView) {
    int[] attrs = new int[]{R.attr.selectableItemBackgroundBorderless};
    TypedArray ta = context.obtainStyledAttributes(attrs);
    Drawable drawable = ta.getDrawable(0);
    ta.recycle();

    ViewCompat.setBackground(itemView, drawable);
}

0

পাঠ্যের রঙ পরিবর্তন করার জন্য, আপনি কেবল মেনু আইটেমের জন্য একটি কাস্টম ভিউ সেট করতে পারেন এবং তারপরে আপনি পাঠ্যের জন্য রঙটি নির্ধারণ করতে পারেন।

নমুনা কোড: মেনু আইটেম.সেটঅ্যাকশনভিউ ()


যদিও এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে, সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।
মিশা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.