Android 4.2에서 Action Bar의 옵션 메뉴 배경색을 변경하는 방법은 무엇입니까?
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는 효과가 없습니다.
위 그림 에서 Action Bar에서 메뉴 배경을 검정색에서 파란색으로 변경하고 싶습니다 . 어떻게 이것을 달성 할 수 있으며 내가 뭘 잘못 했습니까?
Actionbar에서 색상을 변경하는 쉬운 방법이 있습니다. ActionBar Generator를 사용 하고 res
폴더에 있는 모든 파일을 복사하여 붙여넣고 Android.manifest 파일에서 테마를 변경합니다.
작업 표시 줄 스타일 발전기 , 써니 제안은 매우 유용하지만, 생성 많은 경우에만 배경색을 변경하려면 관련이없는 대부분의 파일의합니다.
그래서 저는 그것이 생성하는 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 배경색은 하늘색이고 MenuItem 텍스트 색상은 분홍색이며 textsize는 25sp입니다.
이것을 읽으면 아마도 이전의 모든 답변이 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>
그게 다야!
팝업 메뉴 / 옵션 메뉴에서 텍스트의 배경색과 색상을 변경하는 간단한 방법
<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>
아래와 같이 Overflow MenuItem에서 스타일과 테마를 적용 할 수 있습니다. OverFlow 메뉴는 ListView이므로 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>
안드로이드 스튜디오의 최신 툴바에서 작업하는 경우 여기에 가장 작은 솔루션이 있습니다 툴바 옵션 메뉴 색상을 변경하려면 툴바 요소에 추가하십시오
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를 사용해야합니다. 후자는 모든 항목 (메뉴 자체 및 각 메뉴 항목)에 적용되고 전자는 팝업 메뉴에만 적용됩니다.
나는 또한이 같은 문제에 부딪 혔고 마침내 간단한 해결책을 얻었습니다. 액션 바 스타일에 한 줄을 추가했습니다.
<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" 는 옵션 메뉴 배경을 변경하기에 충분합니다.
빠른 방법!
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>
끝난!
I was able to change colour of action overflow by just putting hex value at:
<!-- 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>
Within your app theme you can set the android:itemBackground property to change the color of the action menu.
For example:
<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>
Try this code. Add this snippet to your 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>
And in Manifest.xml add below snippet under application
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
Add following to your 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>
Change theme in activity_main.xml
only.
android:theme="@style/Custom_Theme"
Following are the changes required in your theme for changing action bar & overflow menu background color. You need to configure "android:background" of 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>
I used this and it works just fine.
Apply this code in the onCreate() function
val actionBar: android.support.v7.app.ActionBar? = supportActionBar
actionBar?.setBackgroundDrawable(ColorDrawable(Color.parseColor("Your color code here")))
'programing tip' 카테고리의 다른 글
NSString에 대한 열거 형 값 (iOS) (0) | 2020.11.19 |
---|---|
mongodb 서비스가 시작되지 않습니다 (0) | 2020.11.19 |
고급 PHP 개발자를위한 MVC (0) | 2020.11.19 |
nokogiri gem 설치 오류 (0) | 2020.11.19 |
ArrayList (0) | 2020.11.19 |