wake-up-neo.com

Wie kann ich die Hintergrundfarbe des Aktionsleisten-Optionsmenüs in Android 4.2 ändern?

Ich möchte die Hintergrundfarbe des Optionsmenüs (Überlauf) in Android 4.2 ändern. Ich habe alle Methoden ausprobiert, aber es zeigt immer noch die vom Design eingestellte Standardfarbe. Ich habe den folgenden Code & XML-Configs verwendet.

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>

Das obige setMenuBackground hat keine Wirkung:

Menu Sample

In der obigen Abbildung möchte ich den Menühintergrund von Schwarz in die blaue Farbe in der Aktionsleiste ändern . Wie kann ich das erreichen und was habe ich falsch gemacht?

59
MKD

Es gibt eine einfache Möglichkeit, die Farben in Actionbar zu ändern .__ Verwenden Sie ActionBar Generator und fügen Sie alle Dateien in Ihren res-Ordner ein, und ändern Sie Ihr Design in der Android.manifest-Datei. 

19
Sunny

Der Action Bar Style Generator , , der von Sunny vorgeschlagen wird, ist sehr nützlich, erzeugt jedoch viele Dateien, von denen die meisten irrelevant sind, wenn Sie nur die ändern möchten Hintergrundfarbe. 

Also habe ich tiefer in die von ihm generierte Zip-Datei gegraben und versucht, die wichtigsten Elemente einzugrenzen, damit ich die minimalen Änderungen an meiner App vornehmen kann. Unten ist was ich herausgefunden habe. 


Im Style-Generator ist die entsprechende Einstellung Popup-Farbe, die sich auf "Overflow-Menü, Untermenü und Hintergrund des Drehfelds" auswirkt.

enter image description here

Machen Sie weiter und generieren Sie die Zip-Datei, aber von allen generierten Dateien benötigen Sie wirklich nur ein Bild, menu_dropdown_panel_example.9.png, das ungefähr so ​​aussieht:

enter image description here

Fügen Sie also die verschiedenen Auflösungsversionen zu res/drawable-* hinzu. (Und benennen Sie sie möglicherweise in menu_dropdown_panel.9.png um.)

Als Beispiel hätten Sie in res/values/themes.xml folgendes: Android:popupMenuStyle und Android:popupBackground sind die Schlüsseleinstellungen.

<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>

Und natürlich in AndroidManifest.xml:

<application
    Android:theme="@style/MyAppActionBarTheme" 
    ... >

Was Sie mit diesem Setup bekommen:

enter image description here

Beachten Sie, dass ich Theme.Holo.Light als Basisdesign verwende. Wenn Sie Theme.Holo (Holo Dark) verwenden, ist ein zusätzlicher Schritt erforderlich, da diese Antwort beschreibt !

Wenn Sie (wie ich) die gesamte Aktionsleiste und nicht nur das Menü gestalten möchten, geben Sie Folgendes in res/drawable/blue_action_bar_background.xml ein: 

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

Funktioniert zumindest auf Android 4.0 und höher (API-Ebene 14 und höher).

87
Jonik

Für den Fall, dass die Leute immer noch nach einer funktionierenden Lösung suchen, funktionierte für mich Folgendes: - Dies ist für die Appcompat-Unterstützungsbibliothek .. _. Dies wird in Fortsetzung zum ActionBar-Styling hier erklärt

Nachfolgend finden Sie die Datei 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>

und so sieht es aus - MenuItem-Hintergrundfarbe ist himmelblau und MenuItem-Textfarbe ist rosa mit Textgröße als 25sp: -

 enter image description here

78
Nicks

Wenn Sie dies lesen, liegt dies wahrscheinlich daran, dass alle vorherigen Antworten für Ihr Holo Dark - basiertes Thema nicht funktionierten. 

Holo Dark verwendet einen zusätzlichen Wrapper für den PopupMenus. Nachdem Sie was Jonik vorgeschlagen hat müssen Sie Ihrer 'xml'-Datei den folgenden Stil hinzufügen:

<style name="PopupWrapper" parent="@Android:style/Theme.Holo">
    <item name="Android:popupMenuStyle">@style/YourPopupMenu</item>
</style>

Verweisen Sie dann in Ihrem Themenblock darauf:

<style name="Your.cool.Theme" parent="@Android:style/Theme.Holo">
    .
    .
    .
    <item name="Android:actionBarWidgetTheme">@style/PopupWrapper</item>
</style>

Das ist es!

17
rupps

Mein einfacher Trick, um Hintergrundfarbe und Farbe des Textes im Popup-Menü/Optionsmenü zu ändern

<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

Wenn Sie in der neuesten Symbolleiste in Android Studio arbeiten, finden Sie hier die kleinste Lösung. Um die Farbe der Symbolleistenoptionen-Menüs zu ändern, fügen Sie diese zu Ihrem Symbolleistenelement hinzu

 app:popupTheme="@style/MyDarkToolbarStyle"

Dann definieren Sie in Ihrer styles.xml den Popup-Menüstil

<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>

Beachten Sie, dass Sie colorBackground und nicht Hintergrund verwenden müssen. Letzteres wird auf alles angewendet (das Menü selbst und jeder Menüpunkt), Ersteres gilt nur für das Popup-Menü.

3
Rishab

Sie können Stile und Designs in Overflow MenuItem wie folgt anwenden. Das OverFlow-Menü ist ListView, also können wir das Design als Listenansicht anwenden.

Wenden Sie den folgenden Code in styles.xml an

<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

Ich bin auch mit dem gleichen Problem betroffen, endlich habe ich eine einfache Lösung gefunden. soeben wurde der Stil der Aktionsleiste um eine Zeile erweitert.

<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" reicht aus, um den Hintergrund des Optionsmenüs zu ändern

3
Gowsik Raja

Der schnelle Weg!

styles.xml

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

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

</style>

Fügen Sie dann diese spezifischen Stile zu Ihren AppTheme-Stilen hinzu

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

ERLEDIGT!

2
Soon Santos

Ich konnte die Farbe des Aktionsüberlaufs ändern, indem ich einfach den Hex-Wert unter

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

Fügen Sie folgendes zu Ihrem Styles.xml hinzu

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

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

</style>

Ändern Sie das Thema nur in activity_main.xml.

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

Versuchen Sie diesen Code. Fügen Sie dieses Snippet zu res> values> styles.xml hinzu

<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>

Und in Manifest.xml fügen Sie unter Anwendung den folgenden Ausschnitt hinzu

 <application
    Android:allowBackup="true"
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name"

     Android:theme="@style/AppTheme"  >
1
Niranjan

Ich habe das benutzt und es funktioniert einwandfrei.

Wenden Sie diesen Code in der Funktion onCreate () an

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

In Ihrem App-Design können Sie die Eigenschaft Android: itemBackground festlegen, um die Farbe des Aktionsmenüs zu ändern. 

Zum Beispiel: 

<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>

Nachfolgend sind die erforderlichen Änderungen in Ihrem Design zum Ändern der Hintergrundfarbe der Aktionsleiste und des Überlaufmenüs aufgeführt. Sie müssen "Android: Hintergrund" von actionBarStyle & popupMenuStyle konfigurieren

<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