Ответ 1
Существует простой способ изменить цвета в панели действий
Используйте ActionBar Generator и скопируйте весь файл в папку res
и измените тему в файле Android.manifest.
Я хочу изменить цвет фона меню опций (переполнение) в Android 4.2. Я пробовал все методы, но он по-прежнему показывает цвет по умолчанию, заданный темой. Я использовал следующий код и конфигурацию XML.
MainActivity.java
public class MainActivity extends Activity {
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().setIcon(R.drawable.ic_launcher);
getActionBar().setTitle("Sample Menu");
getActionBar().setBackgroundDrawable(new
ColorDrawable(Color.parseColor("#33B5E5")));
int titleId = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
TextView titleText = (TextView)findViewById(titleId);
titleText.setTextColor(Color.parseColor("#ffffff"));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
setMenuBackground();
return true;
}
protected void setMenuBackground(){
// Log.d(TAG, "Enterting setMenuBackGround");
getLayoutInflater().setFactory( new Factory() {
@Override
public View onCreateView(String name, Context context,
AttributeSet attrs) {
if ( name.equalsIgnoreCase( "com.android.internal.view.menu.IconMenuItemView" ) ) {
try { // Ask our inflater to create the view
LayoutInflater f = getLayoutInflater();
final View view = f.createView( name, null, attrs );
/* The background gets refreshed each time a new item is added the options menu.
* So each time Android applies the default background we need to set our own
* background. This is done using a thread giving the background change as runnable
* object */
new Handler().post( new Runnable() {
public void run () {
// sets the background color
view.setBackgroundResource( R.color.menubg);
// sets the text color
((TextView) view).setTextColor(Color.WHITE);
// sets the text size
((TextView) view).setTextSize(18);
}
} );
return view;
}
catch ( InflateException e ) {}
catch ( ClassNotFoundException e ) {}
}
return null;
}});
}
}
menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_settings"
android:icon="@drawable/menu"
android:showAsAction="always"
android:title="@string/action_settings">
<menu>
<item
android:id="@+id/item1"
android:showAsAction="always"
android:title="@string/item1" />
<item
android:id="@+id/item2"
android:showAsAction="always"
android:title="@string/item2" />
<item
android:id="@+id/item3"
android:showAsAction="always"
android:title="@string/item3" />
<item
android:id="@+id/item4"
android:showAsAction="always"
android:title="@string/item4" />
</menu>
</item>
</menu>
color.xml
<color name="menubg">#33B5E5</color>
Вышеуказанный setMenuBackground не оказывает никакого эффекта:
На приведенном выше рисунке Я хочу изменить фон меню от черного до синего цвета в панели действий. Как я могу достичь этого, и что я делал неправильно?
Существует простой способ изменить цвета в панели действий
Используйте ActionBar Generator и скопируйте весь файл в папку res
и измените тему в файле Android.manifest.
Генератор стилей Action Bar, предложенный Sunny, очень полезен, но он генерирует много файлов, большинство из которых не имеют значения, если вы хотите только изменить цвет фона.
Итак, я углубился в zip, который он создал, и попытался сузить, какие части имеют значение, поэтому я могу внести минимальное количество изменений в свое приложение. Ниже я узнал.
В генераторе стилей соответствующий параметр Цвет всплывающей подсказки, который влияет на " меню переполнения, подменю и фон панели счетчика".
Идите и создайте zip, но из всех сгенерированных файлов вам действительно нужно только одно изображение menu_dropdown_panel_example.9.png
, которое выглядит примерно так:
Итак, добавьте разные версии разрешения в res/drawable-*
. (И, возможно, переименуйте их в menu_dropdown_panel.9.png
.)
Затем, в качестве примера, в res/values/themes.xml
у вас будет следующее: android:popupMenuStyle
и android:popupBackground
.
<resources>
<style name="MyAppActionBarTheme" parent="android:Theme.Holo.Light">
<item name="android:popupMenuStyle">@style/MyApp.PopupMenu</item>
<item name="android:actionBarStyle">@style/MyApp.ActionBar</item>
</style>
<!-- The beef: background color for Action Bar overflow menu -->
<style name="MyApp.PopupMenu" parent="android:Widget.Holo.Light.ListPopupWindow">
<item name="android:popupBackground">@drawable/menu_dropdown_panel</item>
</style>
<!-- Bonus: if you want to style whole Action Bar, not just the menu -->
<style name="MyApp.ActionBar" parent="android:Widget.Holo.Light.ActionBar.Solid">
<!-- Blue background color & black bottom border -->
<item name="android:background">@drawable/blue_action_bar_background</item>
</style>
</resources>
И, конечно, в AndroidManifest.xml
:
<application
android:theme="@style/MyAppActionBarTheme"
... >
Что вы получите с этой настройкой:
Обратите внимание, что я использую Theme.Holo.Light
в качестве базовой темы. Если вы используете Theme.Holo
(Holo Dark), вам нужен еще один шаг в качестве этого ответа!
Кроме того, если вы (как и я) хотели создать стиль всей панели действий, а не только меню, поместите что-то вроде этого в res/drawable/blue_action_bar_background.xml
:
<!-- Bonus: if you want to style whole Action Bar, not just the menu -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle">
<stroke android:width="2dp" android:color="#FF000000" />
<solid android:color="#FF2070B0" />
</shape>
</item>
<item android:bottom="2dp">
<shape android:shape="rectangle">
<stroke android:width="2dp" android:color="#FF2070B0" />
<solid android:color="#00000000" />
<padding android:bottom="2dp" />
</shape>
</item>
</layer-list>
Работает отлично, по крайней мере, на Android 4.0+ (уровень API 14 +).
В случае, если люди все еще посещают рабочее решение, вот что сработало для меня: - Это для библиотеки поддержки Appcompat. Это продолжение к стилю ActionBar здесь
Ниже приведен файл styles.xml.
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
<!-- This is the styling for action bar -->
<item name="actionBarStyle">@style/MyActionBar</item>
<!--To change the text styling of options menu items</item>-->
<item name="android:itemTextAppearance">@style/MyActionBar.MenuTextStyle</item>
<!--To change the background of options menu-->
<item name="android:itemBackground">@color/skyBlue</item>
</style>
<style name="MyActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
<item name="background">@color/red</item>
<item name="titleTextStyle">@style/MyActionBarTitle</item>
</style>
<style name="MyActionBarTitle" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:textColor">@color/white</item>
</style>
<style name="MyActionBar.MenuTextStyle"
parent="style/TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:textColor">@color/red</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">25sp</item>
</style>
</resources>
и так оно выглядит - цвет фона MenuItem - это skyblue, а цвет текста MenuItem - розовый, с текстом - 25sp: -
Если вы прочтете это, вероятно, потому, что все предыдущие ответы не работали для вашей темы Голо Темного.
Holo Dark использует дополнительную оболочку для PopupMenus, поэтому после того, что предложил Jonik, вы должны добавить следующий стиль в свой файл xml:
<style name="PopupWrapper" parent="@android:style/Theme.Holo">
<item name="android:popupMenuStyle">@style/YourPopupMenu</item>
</style>
Затем укажите его в своем блоке темы:
<style name="Your.cool.Theme" parent="@android:style/Theme.Holo">
.
.
.
<item name="android:actionBarWidgetTheme">@style/PopupWrapper</item>
</style>
Что это!
Мой простой трюк, чтобы изменить цвет фона и цвет текста в Popup Menu/Option Menu
<style name="CustomActionBarTheme"
parent="@android:style/Theme.Holo">
<item name="android:popupMenuStyle">@style/MyPopupMenu</item>
<item name="android:itemTextAppearance">@style/TextAppearance</item>
</style>
<!-- Popup Menu Background Color styles -->
<style name="MyPopupMenu"
parent="@android:style/Widget.Holo.ListPopupWindow">
<item name="android:popupBackground">@color/Your_color_for_background</item>
</style>
<!-- Popup Menu Text Color styles -->
<style name="TextAppearance">
<item name="android:textColor">@color/Your_color_for_text</item>
</style>
Вы можете применять стили и темы в меню переполнения MenuItem, как показано ниже. Меню OverFlow - это ListView, поэтому мы можем применять тему в соответствии с списком.
Применить ниже код в styles.xml
<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
<item name="android:dropDownListViewStyle">@style/PopupMenuListView</item>
<item name="android:actionBarWidgetTheme">@style/PopupMenuTextView</item>
<item name="android:popupMenuStyle">@style/PopupMenu</item>
<item name="android:listPreferredItemHeightSmall">40dp</item>
</style>
<!-- Change Overflow Menu ListView Divider Property -->
<style name="PopupMenuListView" parent="@android:style/Widget.Holo.ListView.DropDown">
<item name="android:divider">@color/app_navigation_divider</item>
<item name="android:dividerHeight">1sp</item>
<item name="android:listSelector">@drawable/list_selector</item>
</style>
<!-- Change Overflow Menu ListView Text Size and Text Size -->
<style name="PopupMenuTextView" parent="@android:style/Widget.Holo.Light.TextView">
<item name="android:textColor">@color/app_white</item>
<item name="android:textStyle">normal</item>
<item name="android:textSize">18sp</item>
<item name="android:drawablePadding">25dp</item>
<item name="android:drawableRight">@drawable/navigation_arrow_selector</item>
</style>
<!-- Change Overflow Menu Background -->
<style name="PopupMenu" parent="android:Widget.Holo.Light.ListPopupWindow">
<item name="android:popupBackground">@drawable/menu_overflow_bg</item>
</style>
Мне удалось изменить цвет переполнения действия, просто поместив шестнадцатеричное значение в:
<!-- The beef: background color for Action Bar overflow menu -->
<style name="MyApp.PopupMenu" parent="android:Widget.Holo.Light.ListPopupWindow">
<item name="android:popupBackground">HEX VALUE OF COLOR</item>
</style>
Если вы работаете на последней панели инструментов в андроид-студии, то вот самое маленькое решение Чтобы изменить цвет меню параметров панели инструментов, добавьте это в свой элемент панели инструментов.
app:popupTheme="@style/MyDarkToolbarStyle"
Затем в вашем styles.xml определите стиль всплывающего меню
<style name="MyDarkToolbarStyle" parent="ThemeOverlay.AppCompat.Light">
<item name="android:colorBackground">@color/mtrl_white_100</item>
<item name="android:textColor">@color/mtrl_light_blue_900</item>
</style>
Обратите внимание, что вам нужно использовать colorBackground, а не фон. Последний будет применяться ко всему (самому меню и каждому пункту меню), первое относится только к всплывающему меню.
Попробуйте этот код. Добавьте этот фрагмент к вашим res > values > styles.xml
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:actionBarWidgetTheme">@style/Theme.stylingactionbar.widget</item>
</style>
<style name="PopupMenu" parent="@android:style/Widget.Holo.ListPopupWindow">
<item name="android:popupBackground">@color/DarkSlateBlue</item>
<!-- for @color you have to create a color.xml in res > values -->
</style>
<style name="Theme.stylingactionbar.widget" parent="@android:style/Theme.Holo">
<item name="android:popupMenuStyle">@style/PopupMenu</item>
</style>
И в Manifest.xml добавьте ниже фрагмент под приложением
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
Я тоже поражен этой же проблемой, наконец, я получил простое решение. просто добавили одну строку в стиль действия.
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:textColorPrimary">@color/colorAccent</item>
<item name="android:colorBackground">@color/colorAppWhite</item>
</style>
"android: colorBackground" достаточно, чтобы изменить фон меню опций
Ниже перечислены изменения, необходимые в вашей теме для изменения цвета фона меню и цвета переполнения. Вам нужно настроить "андроид: фон" actionBarStyle и popupMenuStyle
<application
android:name="...."
android:theme="@style/AppLightTheme">
<style name="AppLightTheme" parent="android:Theme.Holo.Light">
<item name="android:actionBarStyle">@style/ActionBarLight</item>
<item name="android:popupMenuStyle">@style/ListPopupWindowLight</item>
</style>
<style name="ActionBarLight" parent="android:style/Widget.Holo.Light.ActionBar">
<item name="android:background">@color/white</item>
</style>
<style name="ListPopupWindowLight"parent="@android:style/Widget.Holo.Light.ListPopupWindow">
<item name="android:background">@color/white</item>
</style>
<style name="customTheme" parent="any_parent_theme">
<item name="android:itemBackground">#424242</item>
<item name="android:itemTextAppearance">@style/TextAppearance</item>
</style>
<style name="TextAppearance">
<item name="android:textColor">#E9E2BF</item>
</style>