Tôi có thể thay đổi màu nền của một mục Menu trong Android không?
Xin vui lòng cho tôi biết nếu có ai có bất kỳ giải pháp cho việc này. Tùy chọn cuối cùng rõ ràng là để tùy chỉnh nó, nhưng có cách nào để thay đổi màu văn bản mà không tùy chỉnh nó.
Tôi có thể thay đổi màu nền của một mục Menu trong Android không?
Xin vui lòng cho tôi biết nếu có ai có bất kỳ giải pháp cho việc này. Tùy chọn cuối cùng rõ ràng là để tùy chỉnh nó, nhưng có cách nào để thay đổi màu văn bản mà không tùy chỉnh nó.
Câu trả lời:
Một dòng đơn giản trong chủ đề của bạn :)
<item name="android:actionMenuTextColor">@color/your_color</item>
actionBarStyle
ví dụ. Nó sẽ không hoạt động trong actionBarStyle
, mặc dù điều đó có vẻ hợp lý!
<item name="actionMenuTextColor">@color/your_color</item>
không sử dụng không gian tên Android
theme
thuộc tính trên thanh công cụ của bạn, điều này hoạt động.
Có vẻ như một
<item name="android:itemTextAppearance">@style/myCustomMenuTextAppearance</item>
trong chủ đề của tôi và
<style name="myCustomMenuTextAppearance" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
<item name="android:textColor">@android:color/primary_text_dark</item>
</style>
trong tệp style.xml thay đổi kiểu của các mục danh sách nhưng không phải các mục menu.
android:itemTextAppearance
thuộc tính không thể được đặt trong một phong cách mà cha mẹ là parent="@android:style/Widget.Holo.ListPopupWindow"
vì đó sẽ không hoàn trả đúng. Nó phải ở trong một phong cách cấp cao nhất giống như một người có cha mẹ là android:Theme.Holo.Light.DarkActionBar
.
Theme.Holo
hoặc Theme.Holo.Light.DarkActionBar
hoặc tương đương.
Bạn có thể thay đổi màu sắc của MenuItem
văn bản một cách dễ dàng bằng cách sử dụng SpannableString
thay vì 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);
thay vìmenu.getItem()
Nếu bạn đang sử dụng Thanh công cụ mới, với chủ đề Theme.AppCompat.Light.NoActionBar
, bạn có thể tạo kiểu theo cách sau.
<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>`
Theo kết quả tôi nhận được,
android:textColorPrimary
là màu văn bản hiển thị tên hoạt động của bạn, là văn bản chính của thanh công cụ.
android:textColorSecondary
là màu văn bản cho phụ đề và nhiều nút tùy chọn (3 chấm). (Có, nó đã thay đổi màu theo thuộc tính này!)
android:textColor
Là màu cho tất cả các văn bản khác bao gồm menu.
Cuối cùng, đặt chủ đề cho Thanh công cụ
<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
(xem stackoverflow.com/a/5538709/423105 ).
Nếu bạn đang sử dụng menu như vậy <android.support.design.widget.NavigationView />
thì chỉ cần thêm dòng dưới đây vào NavigationView
:
app:itemTextColor="your color"
Cũng có sẵn colorTint cho biểu tượng, nó cũng sẽ ghi đè màu cho biểu tượng của bạn. Cho rằng bạn phải thêm dòng dưới đây:
app:itemIconTint="your color"
Thí dụ:
<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"/>
Hy vọng nó sẽ giúp bạn.
Tôi đã đi về nó theo lập trình như thế này:
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;
}
như bạn có thể thấy trong câu hỏi này, bạn nên:
<item name="android:textColorPrimary">yourColor</item>
Mã ở trên thay đổi màu văn bản của các mục hành động menu cho API> = v21.
<item name="actionMenuTextColor">@android:color/holo_green_light</item>
Trên đây là mã cho API <v21
Tôi đã sử dụng thẻ html để thay đổi màu văn bản của một mục khi mục menu bị thổi phồng. Hy vọng nó sẽ hữu ích.
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;
}
Cách SIMPLEST để tạo màu menu tùy chỉnh cho thanh công cụ duy nhất, không dành cho 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>
thanh công cụ thông thường trên Styles.xml
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
kiểu thanh công cụ tùy chỉnh của chúng tôi
<style name="AppTheme.AppBarOverlay.MenuBlue">
<item name="actionMenuTextColor">@color/blue</item>
</style>
trong Kotlin tôi đã viết các phần mở rộng này:
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)
}
}
và được sử dụng như thế này:
menu.findItem(R.id.main_settings).setTitleColor(Color.RED)
Câu trả lời ngắn gọn là có. bạn thật may mắn!
Để làm như vậy, bạn cần ghi đè một số kiểu của kiểu mặc định của Android:
Đầu tiên, hãy xem định nghĩa của các chủ đề trong 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>
Vì vậy, sự xuất hiện của văn bản trong menu là trong @android:style/TextAppearance.Widget.IconMenu.Item
Bây giờ, trong định nghĩa của các kiểu :
<style name="TextAppearance.Widget.IconMenu.Item" parent="TextAppearance.Small">
<item name="android:textColor">?textColorPrimaryInverse</item>
</style>
Vì vậy, bây giờ chúng ta có tên của màu trong câu hỏi, nếu bạn nhìn vào thư mục màu của các tài nguyên của hệ thống:
<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>
Cuối cùng, đây là những gì bạn cần làm:
Ghi đè "TextAppurdy.Widget.IconMothy.Item" và tạo phong cách của riêng bạn. Sau đó liên kết nó với bộ chọn của riêng bạn để làm cho nó theo cách bạn muốn. Hy vọng điều này sẽ giúp bạn. Chúc may mắn!
Menu tùy chọn trong Android có thể được tùy chỉnh để đặt nền hoặc thay đổi giao diện văn bản. Màu nền và màu văn bản trong menu không thể thay đổi bằng chủ đề và kiểu. Mã nguồn android (data \ res \ layout \ icon_menu_item_layout.xml) sử dụng một mục tùy chỉnh của lớp com com.android.i INTERNal.view.menu.IconMothyItem chế độ xem cho bố cục menu. Chúng ta có thể thay đổi trong lớp trên để tùy chỉnh menu. Để đạt được điều tương tự, hãy sử dụng lớp nhà máy LayoutInflater và đặt màu nền và màu văn bản cho dạng xem.
@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
Cảm ơn ví dụ mã. Tôi đã phải sửa đổi nó để làm cho nó hoạt động với một menu ngữ cảnh. Đây là giải pháp của tôi.
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);
}
Đối với tôi điều này hoạt động với Android 1.6, 2.03 và 4.03.
tôi tìm thấy nó rồi
trong chủ đề ứng dụng của bạn:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:actionBarStyle">@style/ActionBarTheme</item>
<!-- backward compatibility -->
<item name="actionBarStyle">@style/ActionBarTheme</item>
</style>
đây là chủ đề thanh hành động của bạn:
<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>
và đây là chủ đề bật lên của bạn:
<style name="ActionBarPopupTheme">
<item name="android:textColor">@color/menu_text_color</item>
<item name="android:background">@color/menu_bg_color</item>
</style>
Chúc mừng;)
để thay đổi màu văn bản mục menu sử dụng mã dưới đây
<style name="AppToolbar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:itemTextAppearance">@style/menu_item_color</item>
</style>
Ở đâu
<style name="menu_item_color">
<item name="android:textColor">@color/app_font_color</item>
</style>
Nhờ max.musterman, đây là giải pháp tôi có để làm việc ở cấp 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);
}
Mã hóa cứng Color.BLACK
có thể trở thành một tham số bổ sung cho setMenuTextColor
phương thức. Ngoài ra, tôi chỉ sử dụng điều này cho các mục menu android:showAsAction="never"
.
Bạn có thể thiết lập màu theo chương trình.
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);
}
}
});
}
Đơn giản chỉ cần thêm nó vào chủ đề của bạn
<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>
Đã thử nghiệm trên API 21
<style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget">
, nếu không, văn bản xuất hiện quá nhỏ trong menu tràn. Cũng lưu ý rằng kỹ thuật này chỉ hoạt động trên Android 5 trở lên.
@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
Tình huống của tôi là cài đặt màu văn bản trong menu tùy chọn (menu ứng dụng chính hiển thị khi nhấn nút menu).
Đã thử nghiệm trong API 16 với thư viện appcompat-v7-27.0.2 , AppCompatActivity
cho MainActivity
và AppCompat
chủ đề cho ứng dụng trong AndroidManifest.xml .
kiểu tệp :
<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>
Không biết nếu điều đó textColorSecondary
ảnh hưởng đến các yếu tố khác nhưng nó kiểm soát màu văn bản menu.
Tôi đã tìm kiếm một số ví dụ về chủ đề này nhưng tất cả các đoạn mã sẵn sàng sử dụng đều không hoạt động.
Vì vậy, tôi muốn điều tra nó với mã nguồn cho thư viện appcompat-v7 (cụ thể là với thư mục res của gói .aar ).
Mặc dù trong trường hợp của tôi, tôi đã sử dụng Eclipse với các phụ thuộc .aar đã phát nổ . Vì vậy, tôi có thể thay đổi các kiểu mặc định và kiểm tra kết quả. Không biết cách làm nổ tung các thư viện để sử dụng trực tiếp với Gradle hoặc Android Studio . Nó xứng đáng với một chủ đề điều tra khác.
Vì vậy, mục đích của tôi là tìm màu nào trong tệp res / value / value.xml được sử dụng cho văn bản trình đơn (tôi gần như chắc chắn màu đó ở đó).
#f00
giá trị cho tất cả chúng.secondary_text_default_material_light
mục màu.@color/abc_secondary_text_material_light
.Base.ThemeOverlay.AppCompat.Light
vàPlatform.AppCompat.Light
.android:textColorSecondary
và android:textColorTertiary
trong Base.ThemeOverlay.AppCompat.Light
.android:textColorSecondary
.Theme.AppCompat.Light
chứ không phải là ThemeOverlay.AppCompat.Light
).Base.ThemeOverlay.AppCompat.Light
. Nó đã có một đứa con ThemeOverlay.AppCompat.Light
.ThemeOverlay.AppCompat.Light
tôi thấy việc sử dụng nó trong Base.Theme.AppCompat.Light.DarkActionBar
chủ đề là actionBarPopupTheme
giá trị thuộc tính.Theme.AppCompat.Light.DarkActionBar
là một phần tử con được tìm thấy Base.Theme.AppCompat.Light.DarkActionBar
để tôi có thể sử dụng thuộc tính đó trong tệp style.xml của mình mà không gặp vấn đề gì.ThemeOverlay.AppCompat.Light
và thay đổi android:textColorSecondary
.Giải pháp của Sephy không hoạt động. Có thể ghi đè giao diện văn bản của mục tùy chọn bằng cách sử dụng phương pháp được mô tả ở trên, nhưng không phải là mục hoặc menu. Để làm điều đó về cơ bản có 3 cách:
Xem Vấn đề 4441: Chủ đề Menu Tùy chọn Tùy chỉnh để biết thêm manh mối.
thử mã này ....
@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
Nếu bạn muốn đặt màu cho một mục menu riêng lẻ, tùy chỉnh chủ đề thanh công cụ không phải là giải pháp phù hợp. Để đạt được điều này, bạn có thể sử dụng android: actionLayout và chế độ xem hành động cho mục menu.
Đầu tiên tạo một tệp bố cục XML cho chế độ xem hành động. Trong ví dụ này, chúng tôi sử dụng một nút làm chế độ xem hành động:
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>
Trong đoạn mã trên, chúng tôi sử dụng android:textColor="?android:attr/colorAccent"
để tùy chỉnh màu văn bản nút.
Sau đó, trong tệp bố cục XML của bạn cho menu, bao gồm app:actionLayout="@layout/menu_button"
như hiển thị bên dưới:
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>
Ghi đè cuối cùng onCreateOptionsMenu()
phương thức trong hoạt động của bạn:
@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;
}
... hoặc đoạn:
@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
});
}
Để biết thêm chi tiết về chế độ xem hành động, hãy xem hướng dẫn dành cho nhà phát triển Android .
Đây là cách bạn có thể tô màu một mục menu cụ thể bằng màu sắc, hoạt động cho tất cả các cấp API:
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));
}
}
}
}
});
}
}
}
}
Bằng cách đó, bạn mất hiệu ứng bộ chọn nền, vì vậy đây là mã để áp dụng bộ chọn nền tùy chỉnh cho tất cả các mục menu con.
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);
}
}
}
}
}
});
}
}
}
}
Đây cũng là chức năng của trình trợ giúp:
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);
}
Để thay đổi màu văn bản, bạn chỉ có thể đặt chế độ xem tùy chỉnh cho MenuItem và sau đó bạn có thể xác định màu cho văn bản.
Mã mẫu: MenuItem.setActionView ()