it-swarm.com.ru

Как изменить цвет фона меню параметров панели действий в Android 4.2?

Я хотел бы изменить цвет фона меню параметров (переполнения) в 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 не дает никакого эффекта:

Menu Sample

На изображении выше, я хочу изменить фон меню с черного на синий цвет на панели действий . Как мне этого добиться, и что я сделал не так?

59
MKD

Существует простой способ изменить цвета в Панели действий Используйте Генератор ActionBar и скопируйте и вставьте все файлы в папку res и измените тему в файле Android.manifest. 

19
Sunny

Генератор стилей панели действий , , предложенный Sunny , очень полезен, но он генерирует много файлов, большинство из которых не имеют значения, если вы хотите изменить только цвет фона 

Итак, я углубился в создаваемый им Zip и попытался сузить, какие части имеют значение, чтобы я мог внести минимальное количество изменений в свое приложение. Ниже то, что я узнал. 


В генераторе стилей соответствующим параметром является Popup color, который влияет на «Переполнение меню, фон подменю и панели счетчика».

enter image description here

Продолжайте и сгенерируйте Zip, но из всех сгенерированных файлов вам действительно нужно только одно изображение, menu_dropdown_panel_example.9.png, которое выглядит примерно так:

enter image description here

Итак, добавьте разные версии разрешения в 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" 
    ... >

Что вы получаете с этой настройкой:

enter image description here

Обратите внимание, что я использую 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+).

87
Jonik

Если люди все еще обращаются за рабочим решением, вот что сработало для меня: - Это для библиотеки поддержки 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 - голубой, а цвет текста MenuItem - розовый с размером текста 25sp: -

 enter image description here

78
Nicks

Если вы читаете это, возможно, все предыдущие ответы не сработали для вашей темы на основе Holo Dark

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>

Это оно!

17
rupps

Мой простой трюк, чтобы изменить цвет фона и цвет текста в 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>
15
aLIEz

Если вы работаете на последней панели инструментов в Android-студии, то вот самое маленькое решение.

 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, а не фон. Последнее будет применяться ко всему (самому меню и каждому пункту меню), первое относится только к всплывающему меню.

3
Rishab

Вы можете применять стили и темы в переполнении MenuItem, как показано ниже. OverFlow Menu - это 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>
3
Tejas Mehta

Я также поражен этой же проблемой, наконец, я получил простое решение. только что добавил одну строку в стиль панели действий.

<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" достаточно изменить фон меню параметров

3
Gowsik Raja

Быстрый путь!

styles.xml

<style name="popupTheme" parent="Theme.AppCompat.Light">

    <item name="Android:background">@color/colorBackground</item>
    <item name="Android:textColor">@color/colorItem</item>

</style>

Затем добавьте эти конкретные стили в ваши стили AppTheme

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="popupTheme">@style/popupTheme</item>
</style>

СДЕЛАННЫЙ!

2
Soon Santos

Я смог изменить цвет переполнения действия, просто поместив шестнадцатеричное значение в:

    <!-- 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>
2
Rishabh

Добавьте следующее к вашему Styles.xml

<style name="Custom_Theme" parent="Theme.AppCompat.Light.DarkActionBar">

    <item name="Android:itemBackground">@color/white</item>
    <item name="Android:textColor">@color/colorPrimaryDark</item>

</style>

Изменить тему только в activity_main.xml.

Android:theme="@style/Custom_Theme"
1
Keyur Sureliya

Попробуйте этот код. Добавьте этот фрагмент в ваш 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"  >
1
Niranjan

Я использовал это, и это работает просто отлично.

Примените этот код в функции onCreate ()

val actionBar: Android.support.v7.app.ActionBar? = supportActionBar
    actionBar?.setBackgroundDrawable(ColorDrawable(Color.parseColor("Your color code here")))    
0
user8397875

В своей теме приложения вы можете установить свойство Android: itemBackground, чтобы изменить цвет меню действий. 

Например: 

<style name="AppThemeDark" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/drk_colorPrimary</item>
        <item name="colorPrimaryDark">@color/drk_colorPrimaryDark</item>
        <item name="colorAccent">@color/drk_colorAccent</item>
        <item name="actionBarStyle">@style/NoTitle</item>
        <item name="windowNoTitle">true</item>
        <item name="Android:textColor">@color/white</item>

        <!-- THIS IS WHERE YOU CHANGE THE COLOR -->
        <item name="Android:itemBackground">@color/drk_colorPrimary</item>
</style>

0
Tyler Devenere
<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>
0
Саша Серегин

Ниже приведены изменения, необходимые в вашей теме для изменения панели действий и цвета фона меню переполнения. Вам нужно настроить «Android: фон» 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>
0
Pawan Maheshwari