web-dev-qa-db-ja.com

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

上の図では、アクションバーでメニューの背景を黒から青に変更したいです。どうすればこれを達成できますか?

62
MKD

Actionbarで色を変更する簡単な方法があります ActionBar Generator を使用して、resフォルダー内のすべてのファイルをコピーして貼り付け、Android.manifestファイルでテーマを変更します。

19
Sunny

Action Bar Style GeneratorSunnyが推奨 、非常に便利ですが、多くのファイル。背景色のみを変更したい場合、そのほとんどは無関係です。

そこで、生成されるZipをさらに掘り下げ、重要な部分を絞り込んで、アプリに最小限の変更を加えることができるようにしました。以下は私が見つけたものです。


スタイルジェネレーターでは、関連する設定はポップアップカラーです。これは、「オーバーフローメニュー、サブメニューおよびスピナーパネルの背景」。

enter image description here

続けてZipを生成しますが、生成されたすべてのファイルのうち、本当に必要な画像は1つだけです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>

これは、メニュー項目の背景色がスカイブルー、メニュー項目のテキスト色がピンクで、テキストサイズが25spの場合の外観です。

enter image description here

81
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

ポップアップメニュー/オプションメニューで背景色とテキストの色を変更する私の簡単なトリック

<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 studioの最新のツールバーで作業している場合、ここが最小のソリューションです。ツールバーオプションメニューの色を変更するには、これをツールバー要素に追加します

 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

以下のように、オーバーフローメニュー項目でスタイルとテーマを適用できます。オーバーフローメニューはリストビューなので、リストビューごとにテーマを適用できます。

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

私もこれと同じ問題に打たれ、ついに簡単な解決策を得ました。アクションバーのスタイルに1行追加しました。

<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

16進値を次の値に設定するだけで、アクションオーバーフローの色を変更できました。

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

アプリのテーマ内で、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>
2
Tyler Devenere

以下を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
<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>

以下は、アクションバーとオーバーフローメニューの背景色を変更するためにテーマで必要な変更です。 actionBarStyleとpopupMenuStyleの「Android:background」を設定する必要があります

<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