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 {{22864524}}。
<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では、何の効果も得られません。
また、img src="http://i.stack.imgur.com/xFlzp.png" width="240" alt="メニューサンプル">
上の図では、メニューの背景を黒からアクションバーの青に変更したいとしています。どのようにすればよいのでしょうか?また、何が間違っているのでしょうか?
Sunny氏が提案したアクションバースタイルジェネレータは非常に便利ですが、大量のファイルが生成され、背景色を変更するだけならそのほとんどは無関係です。
そこで、生成されたZIPをより深く掘り下げ、重要な部分を絞り込んで、自分のアプリに最小限の変更を加えられるようにしてみました。その結果、以下のことがわかりました。
この設定は、"オーバーフローメニュー、サブメニュー、スピナーパネルの背景"に影響します。
.
これは、オーバーフローメニューやサブメニュー、スピナーパネルの背景に影響します。
.
そこで、この画像の異なる解像度のバージョンを 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+)では素晴らしい動作をします。
に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>