एंड्रॉइड में मेनू आइटम का टेक्स्ट रंग कैसे बदलें?


175

क्या मैं एंड्रॉइड में मेनू आइटम की पृष्ठभूमि का रंग बदल सकता हूं?

कृपया मुझे बताएं कि किसी के पास इसका कोई हल है। अंतिम विकल्प स्पष्ट रूप से इसे अनुकूलित करने के लिए होगा, लेकिन क्या पाठ के रंग को बिना अनुकूलित किए इसे बदलने का कोई तरीका है।


क्या कोई है जो मुझे इसका समाधान बता सकता है?
सुनील

3
क्या आप टेक्स्ट कलर, टेक्स्ट व्यू का बैकग्राउंड कलर बदलना चाहते हैं? अथवा दोनों? दोनों अलग-अलग चीजें हैं। कृपया प्रश्न को फिर से फ्रेम करें।
अभिनव सक्सेना

जवाबों:


335

अपने विषय में एक सरल रेखा :)

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

19
नोट: यह आपके ऐप के लिए मुख्य थीम परिभाषा में जाना चाहिए, actionBarStyleउदाहरण के लिए नहीं । यह काम नहीं करेगा actionBarStyle, भले ही यह तर्कसंगत लगता हो!
कॉलिन एम।

47
निम्न एपीआई संस्करणों का समर्थन करने के लिए <item name="actionMenuTextColor">@color/your_color</item>
alex.p

5
@ColinM। इसे एक थीम में जाना है । यदि आप themeअपने टूलबार पर एक विशेषता सेट करते हैं, तो यह काम करता है।
डेरियसल सिप

2
मेरे साथ या बिना एंड्रॉइड के काम नहीं कर रहा था: नामस्थान। इसे मुख्य ऐप थीम में जोड़ा गया था।
आरएसी

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>

में शैलियों। xml सूची आइटम नहीं बल्कि मेनू आइटम की शैली बदल जाते हैं।


5
यह संदर्भ मेनू आइटम (मेनू बटन से मेनू आइटम नहीं) के लिए बहुत अच्छा काम करता है। पूरे लेआउटफैक्टरी गड़बड़ की तुलना में बहुत सरल।
चूबसॉन्डब्स

इस android:itemTextAppearanceविशेषता को एक शैली के भीतर नहीं रखा जा सकता है, जिसका अभिभावक parent="@android:style/Widget.Holo.ListPopupWindow"तब से ठीक से प्रस्तुत नहीं होगा। यह एक शीर्ष स्तर की शैली में होना चाहिए, जिसका मूल माता-पिता है android:Theme.Holo.Light.DarkActionBar
टोब्स्को 42

मुझे <आइटम का नाम = "android: itemTextAppearance"> @ शैली / myCustomMenuTextApearance </ आइटम> कहां जोड़ना चाहिए?
Bagusflyer

@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()
haagmm

1
मेरे लिए भी काम किया [findItem (...)] का उपयोग करते हुए।
स्तब्ध

6
समाधान केवल अतिप्रवाह में आइटम के लिए काम करते हैं .... मैं शोकेस सेट करके दिखाई देने वाले आइटम रंग को बदलने के लिए नहीं चाहता हूं: "हमेशा"
जुनैद

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: textColorPrimary, android: textColorSecondary, और न ही android: textColor उन्हें प्रभावित करते हैं।
लार्स

पूर्ववर्ती टिप्पणी में मेरे प्रश्न के उत्तर में: android:actionMenuTextColor(देखें stackoverflow.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"/>

आशा है इससे आपकी मदद होगी।


इसने उन वस्तुओं को बदल दिया जो किसी अन्य आइटम में नेस्टेड हैं, लेकिन इसने अन्य आइटम वाले आइटम को नहीं बदला। क्या आप जानते हैं कि मैं उन्हें कैसे बदल सकता था?
दीनू निकोले

@DinuNicolae क्या आप अपना उदाहरण स्क्रीनशॉट पोस्ट कर सकते हैं? या अधिक विस्तार प्रदान करें।
मिहिर त्रिवेदी

मेरे पास <आइटम> <मेनू> <अंदरूनी आइटम> </ मेनू> </ आइटम> और केवल आइटम का रंग बदल गया है
दीनू निकोले

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
आपके उत्तर ने मुझे MenuItem पाठ को बोल्ड करने में मदद की। (s.setSpan (नई StyleSpan (android.graphics.Typeface.BOLD), 0, s.length (), 0);! धन्यवाद
आर्कादिउज़ Cieśliński

इस समाधान से मेरे मुद्दे में मदद मिली। मुझे यह पसंद है क्योंकि यह विषय पर निर्भर कंडोम से निर्भर नहीं होगा।
तोमकाट

15

जैसा कि आप इस प्रश्न में देख सकते हैं :

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

उपर्युक्त कोड API> = v21 के लिए मेनू एक्शन आइटम के टेक्स्ट रंग को बदलता है।

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

ऊपर एपीआई <v21 के लिए कोड है


धन्यवाद। इसे स्वीकार किया जाना चाहिए। यह आसान और आसान है
पूजा

10

मेनू आइटम के फुलाए जाने पर मैंने एकल आइटम के टेक्स्ट रंग को बदलने के लिए html टैग का उपयोग किया। आशा है कि यह मददगार होगा।

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

एकल टूलबार के लिए कस्टम मेनू रंग बनाने के लिए SIMPLEST तरीका, AppTheme के लिए नहीं

    <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.xml पर सामान्य टूलबार

<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

छोटा जवाब हां है। तुम भाग्यशाली हो!
ऐसा करने के लिए, आपको Android डिफ़ॉल्ट शैलियों की कुछ शैलियों को ओवरराइड करने की आवश्यकता है:

सबसे पहले, एंड्रॉइड में थीम की परिभाषा देखें :

<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" को ओवरराइड करें और अपनी खुद की शैली बनाएं। फिर इसे अपने स्वयं के चयनकर्ता से लिंक करें ताकि आप इसे अपनी इच्छानुसार बना सकें। आशा है कि यह आपकी मदद करता है। सौभाग्य!


जवाब के लिए धन्यवाद। मैंने वही किया है जो आपने सुझाया है लेकिन यह मेनू आइटम का रंग नहीं बदलता है
सुनील

वास्तव में, मुझे बस मेनू सामान के अधिक पढ़ने से एहसास हुआ कि यह मैंने जितना सोचा था उससे कहीं अधिक जटिल है। यदि आप अपना पूर्ण कस्टम मेनू नहीं बनाना चाहते हैं ... तो मेरे लिए कुछ और पढ़ने की आवश्यकता होगी, मैं रखूंगा आप यहाँ पोस्ट अगर मैं और अधिक लगता है।
सिपाही

"TextAppearance.Widget.IconMenu.Item" को ओवरराइड करना संभव नहीं है।
Peceps

यह उत्तर भ्रामक है .. इसलिए निष्कर्ष यह है, यह काम नहीं करता है और मूल रूप से सोचा गया की तुलना में बहुत कठिन / लंबा है?
स्पीडनोमैड्स

6

एंड्रॉइड में विकल्प मेनू को पृष्ठभूमि सेट करने या टेक्स्ट उपस्थिति को बदलने के लिए अनुकूलित किया जा सकता है। थीम और शैलियों का उपयोग करके मेनू में पृष्ठभूमि और पाठ का रंग नहीं बदला जा सकता है। Android स्रोत कोड (डेटा \ res \ लेआउट \ icon_menu_item_layout.xml) मेनू लेआउट के लिए क्लास "com.android.internal.view.menu.IconMenuItem" के कस्टम आइटम का उपयोग करता है। हम मेनू को अनुकूलित करने के लिए उपरोक्त वर्ग में परिवर्तन कर सकते हैं। उसी को प्राप्त करने के लिए, LayoutInflater फ़ैक्टरी वर्ग का उपयोग करें और दृश्य के लिए पृष्ठभूमि और पाठ रंग सेट करें।


@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
कोरा

यह पहली बार काम करता है। जब आप दूसरी बार मेनू खोलते हैं तो आपको अपवाद मिलता है।
लवफॉरड्रॉइड

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 के साथ काम करता है।


यदि आप ऊपर कर रहे हैं, तो आपको बस मार्कस वोल्सचॉन समाधान का उपयोग करना चाहिए। बहुत सरल।
चूबसॉन्डब्स

Xml समाधान मेरे लिए उदाहरण के लिए 2.3.x पर काम नहीं करता है, लेकिन यह एक आकर्षण की तरह काम करता है - 4.x पर भी
sunlock

इस समाधान ने सबसे अच्छा काम किया। मुझे भी android.support.v7.internal.view.menu.ListMenuItemView को कैप्चर करना था, ताकि
कॉम्पिटिशन

यह फ़िक्स Google मैप्स v2 के साथ काम नहीं करेगा - सही तरीके से रेंडर करने के लिए सुपर मेथड को 1st कहा जाना चाहिए।
15

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

Max.musterman के लिए धन्यवाद, यह वह समाधान है जो मुझे 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

इसे मेरी शैलियों में शामिल करना। xml ने मेरे लिए काम किया

<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
यदि यह SearchView नहीं है तो क्या होगा?
nasch

2

मेरी स्थिति सेटिंग्स मेनू में टेक्स्ट टेक्स्ट का रंग था (मेन ऐप मेनू मेनू बटन प्रेस पर दिखाया गया था)।

में परीक्षण किया गया एपीआई 16 के साथ appcompat-v7-27.0.2 पुस्तकालय, AppCompatActivityके लिए MainActivityऔर AppCompatमें आवेदन के लिए विषय को AndroidManifest.xml

style.xml :

<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अन्य तत्वों को प्रभावित करता है, लेकिन यह मेनू पाठ रंग को नियंत्रित करता है।


मैंने इस विषय पर कुछ उदाहरण खोजे लेकिन सभी तैयार-से-उपयोग वाले स्निपेट्स ने काम नहीं किया।

इसलिए मैं appcompat-v7 लाइब्रेरी के लिए स्रोत कोड (विशेष रूप से .AR पैकेज के Res फ़ोल्डर के साथ) के साथ इसकी जांच करना चाहता था ।

हालांकि मेरे मामले में मैं विस्फोट के साथ ग्रहण इस्तेमाल किया .aar निर्भरता। इसलिए मैं डिफ़ॉल्ट शैलियों को बदल सकता था और परिणामों की जांच कर सकता था। ग्रैडल या एंड्रॉइड स्टूडियो के साथ सीधे उपयोग करने के लिए पुस्तकालयों को विस्फोट करना नहीं जानते । यह जांच का एक और सूत्र है।

तो मेरा उद्देश्य इतना था कि रेस / मान / मानों में कौन सा रंग है । मेनू फ़ाइल के लिए xml फ़ाइल का उपयोग किया जाता है (मुझे लगभग यकीन था कि रंग वहां था)।

  1. मैंने उस फ़ाइल को खोला, फिर सभी रंगों को डुप्लिकेट किया, उन्हें ओवरराइड करने के लिए डिफ़ॉल्ट वालों के नीचे रखा और उन #f00सभी को मान दिया।
  2. ऐप शुरू करें।
  3. कई तत्वों में लाल रंग की पृष्ठभूमि या पाठ का रंग था। और मेनू आइटम भी। यही मुझे चाहिए था।
  4. 5-10 लाइनों के ब्लॉक द्वारा अपने जोड़े गए रंगों को हटाकर मैं समाप्त हो गया secondary_text_default_material_light रंग आइटम के ।
  5. Res फ़ोल्डर में फ़ाइलों में उस नाम को खोजना (या Res / रंगों के भीतर बेहतर ) मुझे रंग / abc_secondary_text_material_light.xml रंग में केवल एक घटना मिली मुझे फ़ाइल (मैंने इन कार्यों के लिए उदात्त पाठ का उपयोग किया है, इसलिए मुझे वह चीज़ ढूंढना आसान है जो मुझे चाहिए)।
  6. वापस मानों के लिए। xml 8 usages के लिए पाए गए@color/abc_secondary_text_material_light
  7. यह एक लाइट थीम थी इसलिए 4 को 2 थीम में छोड़ दिया गया: Base.ThemeOverlay.AppCompat.LightऔरPlatform.AppCompat.Light
  8. पहला विषय दूसरे का बच्चा था इसलिए उस रंग संसाधन के साथ केवल 2 विशेषताएँ थीं: android:textColorSecondaryऔर android:textColorTertiaryमें Base.ThemeOverlay.AppCompat.Light
  9. अपने मूल्यों को सीधे मानों में बदलते हुए। xml और ऐप को चलाकर मैंने पाया कि अंतिम सही विशेषता थी android:textColorSecondary
  10. आगे मुझे एक थीम या किसी अन्य विशेषता की आवश्यकता थी ताकि मैं इसे अपने ऐप के स्टाइल में बदल सकूं। xml (क्योंकि मेरे विषय में माता-पिता के रूप में था - 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इसलिए मैं अपनी शैली में उस विशेषता का उपयोग कर सकता हूं। xml । समस्याओं के बिना ।
  14. जैसा कि मैंने ऊपर उदाहरण कोड में देखा है, मैंने उल्लेख से एक बाल विषय बनाया ThemeOverlay.AppCompat.Lightऔर android:textColorSecondaryविशेषता को बदल दिया।

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


1

सिपाही का समाधान काम नहीं करता है। उपरोक्त वर्णित विधि का उपयोग करके विकल्प मेनू आइटम टेक्स्ट उपस्थिति को ओवरराइड करना संभव है, लेकिन आइटम या मेनू नहीं। ऐसा करने के लिए अनिवार्य रूप से 3 तरीके हैं:

  1. विकल्प मेनू की पृष्ठभूमि का रंग कैसे बदलें?
  2. प्रदर्शित करने के लिए अपना स्वयं का दृश्य लिखें और अपने इच्छित परिणामों को प्राप्त करने के लिए onCreateOptionsMenu और onPrepareOptionsMenu को ओवरराइड करें। मैं इसे आम तौर पर बताता हूं क्योंकि आप आम तौर पर इन तरीकों से जो चाहें कर सकते हैं, लेकिन आप शायद सुपर () में कॉल नहीं करना चाहेंगे।
  3. ओपन-सोर्स एसडीके से कोड कॉपी करें और अपने व्यवहार के लिए अनुकूलित करें। गतिविधि द्वारा उपयोग किया जाने वाला डिफ़ॉल्ट मेनू कार्यान्वयन अब लागू नहीं होगा।

समस्या 4441 देखें : अधिक सुराग के लिए कस्टम विकल्प मेनू थीम


पुनरावृत्ति करने के लिए ... सिपाही का समाधान मेनू आइटम TextAppearance के लिए काम करता है, हालांकि मैंने जो भी किया है वह एक theme.xml के माध्यम से डिफ़ॉल्ट को ओवरराइड करता है। इसके अलावा, # 2 या # 3 ऊपर पता होना चाहिए कि सुपर # onCreateOptionsMenu / super # के माध्यम से कॉल करने पर सिस्टम मेनू आइटम रखने के लिए डिज़ाइन किया गया है ... जैसा कि गतिविधि के लिए javadoc में दिखाया गया है #CreateOptionsMenu ()। यह आपके ऐप के लिए मायने नहीं रख सकता है।
प्रात: काल

सिपाही जो वर्णन कर रहा है, वह आपके थीम्स में है। xml: <item name = "android: itemTextAppearance"> @ style / Text_MenuItemText </ item> फिर अपने स्टाइल में कुछ इस तरह परिभाषित करें। xml: <style name = "Text_MenuItemText" > <आइटम का नाम = "Android: textSize"> 12dp </ आइटम> <आइटम का नाम = "Android: textColor"> # FFFFFF </ वस्तु> </ 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
एंड्रॉइड पर> 4.0 मैं हो रहा हूंjava.lang.IllegalStateException: A factory has already been set on this LayoutInflater
Kra

1

यदि आप अलग-अलग मेनू आइटम के लिए रंग सेट करना चाहते हैं, तो टूलबार थीम को कस्टमाइज़ करना सही समाधान नहीं है। इसे प्राप्त करने के लिए, आप एंड्रॉइड का उपयोग कर सकते हैं: एक्शन लाइट और मेनू आइटम के लिए एक एक्शन दृश्य।

क्रिया दृश्य के लिए पहले XML लेआउट फ़ाइल बनाएँ। इस उदाहरण में हम एक बटन को एक क्रिया दृश्य के रूप में उपयोग करते हैं:

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"बटन टेक्स्ट कलर को कस्टमाइज़ करने के लिए उपयोग करते हैं।

फिर मेनू के लिए अपनी XML लेआउट फ़ाइल में, 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
    });
}

कार्रवाई के विचारों के बारे में अधिक जानकारी के लिए, Android डेवलपर मार्गदर्शिका देखें


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

पाठ का रंग बदलने के लिए, आप बस MenuItem के लिए एक कस्टम दृश्य सेट कर सकते हैं, और फिर आप पाठ के लिए रंग को परिभाषित कर सकते हैं।

नमूना कोड: MenuItem.setActionView ()


हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
मिशा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.