programing tip

Android 4.2에서 Action Bar의 옵션 메뉴 배경색을 변경하는 방법은 무엇입니까?

itbloger 2020. 11. 19. 07:54
반응형

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:popupMenuStyleandroid: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")))    

참고URL : https://stackoverflow.com/questions/19659637/how-to-change-the-background-color-of-action-bars-option-menu-in-android-4-2

반응형

'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