क्या मैं एंड्रॉइड में मेनू आइटम की पृष्ठभूमि का रंग बदल सकता हूं?
कृपया मुझे बताएं कि किसी के पास इसका कोई हल है। अंतिम विकल्प स्पष्ट रूप से इसे अनुकूलित करने के लिए होगा, लेकिन क्या पाठ के रंग को बिना अनुकूलित किए इसे बदलने का कोई तरीका है।
क्या मैं एंड्रॉइड में मेनू आइटम की पृष्ठभूमि का रंग बदल सकता हूं?
कृपया मुझे बताएं कि किसी के पास इसका कोई हल है। अंतिम विकल्प स्पष्ट रूप से इसे अनुकूलित करने के लिए होगा, लेकिन क्या पाठ के रंग को बिना अनुकूलित किए इसे बदलने का कोई तरीका है।
जवाबों:
अपने विषय में एक सरल रेखा :)
<item name="android:actionMenuTextColor">@color/your_color</item>
actionBarStyle
उदाहरण के लिए नहीं । यह काम नहीं करेगा actionBarStyle
, भले ही यह तर्कसंगत लगता हो!
<item name="actionMenuTextColor">@color/your_color</item>
theme
अपने टूलबार पर एक विशेषता सेट करते हैं, तो यह काम करता है।
ऐसा लगता है कि ए
<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 सूची आइटम नहीं बल्कि मेनू आइटम की शैली बदल जाते हैं।
android:itemTextAppearance
विशेषता को एक शैली के भीतर नहीं रखा जा सकता है, जिसका अभिभावक parent="@android:style/Widget.Holo.ListPopupWindow"
तब से ठीक से प्रस्तुत नहीं होगा। यह एक शीर्ष स्तर की शैली में होना चाहिए, जिसका मूल माता-पिता है android:Theme.Holo.Light.DarkActionBar
।
Theme.Holo
या Theme.Holo.Light.DarkActionBar
या इसी तरह की।
आप इसके बजाय का MenuItem
उपयोग करके आसानी से पाठ का रंग बदल सकते हैं ।SpannableString
String
@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);
}
menu.findItem(R.id.menu_item_id);
बजायmenu.getItem()
यदि आप नए टूलबार का उपयोग कर रहे हैं, तो थीम के साथ 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
(देखें stackoverflow.com/a/5538709/423105 )।
यदि आप मेनू का उपयोग कर रहे हैं <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"/>
आशा है इससे आपकी मदद होगी।
मैं इसके बारे में इस तरह से गया:
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;
}
जैसा कि आप इस प्रश्न में देख सकते हैं :
<item name="android:textColorPrimary">yourColor</item>
उपर्युक्त कोड API> = v21 के लिए मेनू एक्शन आइटम के टेक्स्ट रंग को बदलता है।
<item name="actionMenuTextColor">@android:color/holo_green_light</item>
ऊपर एपीआई <v21 के लिए कोड है
मेनू आइटम के फुलाए जाने पर मैंने एकल आइटम के टेक्स्ट रंग को बदलने के लिए 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;
}
एकल टूलबार के लिए कस्टम मेनू रंग बनाने के लिए 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>
कोटलिन में मैंने ये एक्सटेंशन लिखे हैं:
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)
छोटा जवाब हां है। तुम भाग्यशाली हो!
ऐसा करने के लिए, आपको 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" को ओवरराइड करें और अपनी खुद की शैली बनाएं। फिर इसे अपने स्वयं के चयनकर्ता से लिंक करें ताकि आप इसे अपनी इच्छानुसार बना सकें। आशा है कि यह आपकी मदद करता है। सौभाग्य!
एंड्रॉइड में विकल्प मेनू को पृष्ठभूमि सेट करने या टेक्स्ट उपस्थिति को बदलने के लिए अनुकूलित किया जा सकता है। थीम और शैलियों का उपयोग करके मेनू में पृष्ठभूमि और पाठ का रंग नहीं बदला जा सकता है। 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);
}
03-23 19:45:25.134: E/AndroidRuntime(26761): java.lang.IllegalStateException: A factory has already been set on this LayoutInflater
कोड उदाहरण के लिए धन्यवाद। मुझे इसे संशोधित करने के लिए एक संदर्भ मेनू के साथ काम करने के लिए इसे प्राप्त करना पड़ा। यह मेरा समाधान है।
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 के साथ काम करता है।
मैं इसे यूरेका पाया !!
आपके एप्लिकेशन विषय में:
<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>
चीयर्स;)
कोड के नीचे मेनू आइटम टेक्स्ट रंग का उपयोग बदलने के लिए
<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>
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"
।
आप प्रोग्रामेटिक रूप से रंग सेट कर सकते हैं।
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);
}
}
});
}
बस इसे अपने विषय में जोड़ें
<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 पर परीक्षण किया गया
<style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget">
, अन्यथा अतिप्रवाह मेनू में पाठ बहुत छोटा दिखाई देता है। यह भी ध्यान दें कि यह तकनीक केवल एंड्रॉइड 5 और इसके बाद के संस्करण पर काम करती है।
@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
मेरी स्थिति सेटिंग्स मेनू में टेक्स्ट टेक्स्ट का रंग था (मेन ऐप मेनू मेनू बटन प्रेस पर दिखाया गया था)।
में परीक्षण किया गया एपीआई 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 फ़ाइल का उपयोग किया जाता है (मुझे लगभग यकीन था कि रंग वहां था)।
#f00
सभी को मान दिया।secondary_text_default_material_light
रंग आइटम के ।@color/abc_secondary_text_material_light
।Base.ThemeOverlay.AppCompat.Light
औरPlatform.AppCompat.Light
।android:textColorSecondary
और android:textColorTertiary
में Base.ThemeOverlay.AppCompat.Light
।android:textColorSecondary
।Theme.AppCompat.Light
नहींThemeOverlay.AppCompat.Light
)।Base.ThemeOverlay.AppCompat.Light
। इसका एक बच्चा थाThemeOverlay.AppCompat.Light
।ThemeOverlay.AppCompat.Light
मुझे खोज के लिए Base.Theme.AppCompat.Light.DarkActionBar
विषय के रूप में इसका उपयोग मिलाactionBarPopupTheme
विशेषता मान।Theme.AppCompat.Light.DarkActionBar
मिला एक बच्चा था Base.Theme.AppCompat.Light.DarkActionBar
इसलिए मैं अपनी शैली में उस विशेषता का उपयोग कर सकता हूं। xml । समस्याओं के बिना ।ThemeOverlay.AppCompat.Light
और android:textColorSecondary
विशेषता को बदल दिया।सिपाही का समाधान काम नहीं करता है। उपरोक्त वर्णित विधि का उपयोग करके विकल्प मेनू आइटम टेक्स्ट उपस्थिति को ओवरराइड करना संभव है, लेकिन आइटम या मेनू नहीं। ऐसा करने के लिए अनिवार्य रूप से 3 तरीके हैं:
समस्या 4441 देखें : अधिक सुराग के लिए कस्टम विकल्प मेनू थीम ।
इस कोड को आज़माएं…।
@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);
}
java.lang.IllegalStateException: A factory has already been set on this LayoutInflater
यदि आप अलग-अलग मेनू आइटम के लिए रंग सेट करना चाहते हैं, तो टूलबार थीम को कस्टमाइज़ करना सही समाधान नहीं है। इसे प्राप्त करने के लिए, आप एंड्रॉइड का उपयोग कर सकते हैं: एक्शन लाइट और मेनू आइटम के लिए एक एक्शन दृश्य।
क्रिया दृश्य के लिए पहले 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 डेवलपर मार्गदर्शिका देखें ।
यह है कि आप रंग के साथ एक विशिष्ट मेनू आइटम कैसे रंग सकते हैं, सभी एपीआई स्तरों के लिए काम करता है:
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);
}
पाठ का रंग बदलने के लिए, आप बस MenuItem के लिए एक कस्टम दृश्य सेट कर सकते हैं, और फिर आप पाठ के लिए रंग को परिभाषित कर सकते हैं।
नमूना कोड: MenuItem.setActionView ()