programing

Android에서 메뉴 항목의 텍스트 색상을 변경하는 방법은 무엇입니까?

powerit 2023. 9. 10. 13:09
반응형

Android에서 메뉴 항목의 텍스트 색상을 변경하는 방법은 무엇입니까?

안드로이드에서 메뉴 항목의 배경색을 변경할 수 있습니까?

이에 대한 해결책이 있는 사람이 있으면 알려주시기 바랍니다.마지막 옵션은 분명히 사용자 지정이지만 사용자 지정 없이 텍스트 색상을 변경할 수 있는 방법이 있습니까?

당신의 테마에서 간단한 한 줄 :)

<item name="android:actionMenuTextColor">@color/your_color</item>

뭔가.

  <item name="android:itemTextAppearance">@style/myCustomMenuTextAppearance</item>

제 주제에 있어서 그리고

   <style name="myCustomMenuTextAppearance" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
        <item name="android:textColor">@android:color/primary_text_dark</item>
    </style>

styles.xml에서 목록 항목의 스타일을 변경하지만 메뉴 항목은 변경하지 않습니다.

을 할 색상을 변경할 수 .MenuItem문자를 쉽게 쓰다SpannableString에 대신에String.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu, menu);

    int positionOfMenuItem = 0; // or whatever...
    MenuItem item = menu.getItem(positionOfMenuItem);
    SpannableString s = new SpannableString("My red MenuItem");
    s.setSpan(new ForegroundColorSpan(Color.RED), 0, s.length(), 0);
    item.setTitle(s);
}

모음을 , 하는 를 합니다 을 합니다 를 을 하는 )Theme.AppCompat.Light.NoActionBar, 다음과 같은 방법으로 스타일링 할 수 있습니다.

 <style name="ToolbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:textColorPrimary">@color/my_color1</item>
    <item name="android:textColorSecondary">@color/my_color2</item>
    <item name="android:textColor">@color/my_color3</item>
 </style>`

내가, 가,
android:textColorPrimary활동 이름을 표시하는 텍스트 색상으로 도구 모음의 기본 텍스트입니다.

android:textColorSecondary는 자막 및 기타 옵션(3 dot) 버튼의 텍스트 색상입니다.(네, 이 속성에 따라 색상이 변경되었습니다!)

android:textColor메뉴를 포함한 모든 텍스트의 색상입니다.

를 도구 모음로다를합니다.

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:theme="@style/ToolbarTheme"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"/>

저는 프로그램적으로 이 일을 해보았습니다.

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.changeip_card_menu, menu); 
    for(int i = 0; i < menu.size(); i++) {
        MenuItem item = menu.getItem(i);
        SpannableString spanString = new SpannableString(menu.getItem(i).getTitle().toString());
        spanString.setSpan(new ForegroundColorSpan(Color.BLACK), 0,     spanString.length(), 0); //fix the color to white
        item.setTitle(spanString);
    }
    return true;
}

메뉴를 다음과 같이 사용하는 경우<android.support.design.widget.NavigationView />그다음에 아래 라인을 추가하면 됩니다.NavigationView:

app:itemTextColor="your color"

아이콘에 사용할 수 있는 colorTint 아이콘의 색상도 덮어씁니다.아래 줄에 추가해야 합니다.

app:itemIconTint="your color"

예:

<android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"

        app:itemTextColor="@color/color_white"
        app:itemIconTint="@color/color_white"

        android:background="@color/colorPrimary"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer"/>

도움이 되기를 바랍니다.

코틀린에서 나는 다음과 같은 확장을 썼습니다.

fun MenuItem.setTitleColor(color: Int) {
    val hexColor = Integer.toHexString(color).toUpperCase().substring(2)
    val html = "<font color='#$hexColor'>$title</font>"
    this.title = html.parseAsHtml()
}           



@Suppress("DEPRECATION")                                                                        
fun String.parseAsHtml(): Spanned {                                                             
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {                                
        Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)                                         
    } else {                                                                                    
        Html.fromHtml(this)                                                                     
    }                                                                                           
}  

다음과 같이 사용됩니다.

menu.findItem(R.id.main_settings).setTitleColor(Color.RED)

이 질문에서 알 수 있듯이 다음과 같이 해야 합니다.

<item name="android:textColorPrimary">yourColor</item>

위 코드는 API >= v21에 대한 메뉴 작업 항목의 텍스트 색상을 변경합니다.

<item name="actionMenuTextColor">@android:color/holo_green_light</item>

위는 API < v21에 대한 코드입니다.

메뉴 항목이 부풀려지면 html 태그를 사용하여 단일 항목의 텍스트 색상을 변경했습니다.도움이 되기를 바랍니다.

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    menu.findItem(R.id.main_settings).setTitle(Html.fromHtml("<font color='#ff3824'>Settings</font>"));
    return true;
}

AppTheme이 아닌 단일 도구 모음의 사용자 지정 메뉴 색상을 만드는 가장 간단한 방법

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay.MenuBlue">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"/>
    </android.support.design.widget.AppBarLayout>

style.xml의 일반 도구 모음

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>

우리의 맞춤 도구 모음 스타일

<style name="AppTheme.AppBarOverlay.MenuBlue">
    <item name="actionMenuTextColor">@color/blue</item>
</style>

재료 설계를 사용하고 있었는데 도구 모음이 작은 화면에 있으면 옵션을 더 클릭하면 흰색 드롭다운 상자가 빈 채로 나타납니다.이 문제를 해결하기 위해 메인 앱 테마에 추가한 것 같습니다.

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="android:itemTextAppearance">@style/menuItem</item>
</style>

그런 다음 메뉴 항목의 텍스트 색을 원하는 색으로 설정하는 스타일을 만들었습니다.

<style name="menuItem" parent="Widget.AppCompat.TextView.SpinnerItem">
    <item name="android:textColor">@color/black</item>
</style>

이름 Widget.AppCompat.TextView.SpinnerItem그건 별로 중요하지 않다고 생각해요, 그래도 될 거예요.

메뉴 항목 텍스트 색상을 변경하려면 코드 아래 사용

<style name="AppToolbar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:itemTextAppearance">@style/menu_item_color</item>
</style>

어디에

<style name="menu_item_color">
<item name="android:textColor">@color/app_font_color</item>
</style>

단답형은 '그렇다' 입니다. 행운을 빌어요!
기본즉, Android의부을본다야면다야fo:es면dsteo부eud,o

먼저 Android에서 테마의 정의를 살펴봅니다.

<style name="Theme.IconMenu">
<!-- Menu/item attributes -->
<item name="android:itemTextAppearance">@android:style/TextAppearance.Widget.IconMenu.Item</item>
<item name="android:itemBackground">@android:drawable/menu_selector</item>
<item name="android:itemIconDisabledAlpha">?android:attr/disabledAlpha</item>
<item name="android:horizontalDivider">@android:drawable/divider_horizontal_bright</item>
<item name="android:verticalDivider">@android:drawable/divider_vertical_bright</item>
<item name="android:windowAnimationStyle">@android:style/Animation.OptionsPanel</item>
<item name="android:moreIcon">@android:drawable/ic_menu_more</item>
<item name="android:background">@null</item>
</style>

그래서 메뉴에 있는 텍스트의 모습은@android:style/TextAppearance.Widget.IconMenu.Item
이제 스타일 정의에서:

<style name="TextAppearance.Widget.IconMenu.Item" parent="TextAppearance.Small">
<item name="android:textColor">?textColorPrimaryInverse</item>
</style>

이제 시스템 리소스의 색상 폴더에서 문제의 색상 이름을 확인할 수 있습니다.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@android:color/bright_foreground_light_disabled" /> 
<item android:state_window_focused="false" android:color="@android:color/bright_foreground_light" /> 
<item android:state_pressed="true" android:color="@android:color/bright_foreground_light" /> 
<item android:state_selected="true" android:color="@android:color/bright_foreground_light" /> 
<item android:color="@android:color/bright_foreground_light" /> 
<!--  not selected --> 
</selector>

마지막으로 다음과 같은 작업을 수행해야 합니다.

"텍스트 출현"을 재정의합니다.위젯.아이콘 메뉴.항목"을 선택하고 자신만의 스타일을 만듭니다.그런 다음 자신의 선택기에 연결하여 원하는 대로 만들 수 있습니다.도움이 되길 바랍니다.행운을 빕니다.

안드로이드의 옵션 메뉴를 사용자 정의하여 배경을 설정하거나 텍스트 모양을 변경할 수 있습니다.테마와 스타일을 사용하여 메뉴의 배경과 텍스트 색상을 변경할 수 없습니다.안드로이드 소스 코드(data\res\layout\icon_menu_item_layout.xml)는 com.android 클래스의 사용자 지정 항목을 사용합니다.internal.view.메뉴.아이콘 메뉴 항목"메뉴 레이아웃을 봅니다.위 클래스에서 메뉴를 변경하여 커스터마이징 할 수 있습니다.동일하게 하려면 LayoutInflater 팩토리 클래스를 사용하고 뷰의 배경 및 텍스트 색상을 설정합니다.


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.my_menu, menu);
    getLayoutInflater().setFactory(new Factory() {
        @Override
        public View onCreateView(String name, Context context, AttributeSet attrs) {
            if (name .equalsIgnoreCase(“com.android.internal.view.menu.IconMenuItemView”)) {
                try{
                    LayoutInflater f = getLayoutInflater();
                    final View view = f.createView(name, null, attrs);
                    new Handler().post(new Runnable() {
                        public void run() {
                            // set the background drawable
                            view .setBackgroundResource(R.drawable.my_ac_menu_background);

                            // set the text color
                            ((TextView) view).setTextColor(Color.WHITE);
                        }
                    });
                    return view;
                } catch (InflateException e) {
                    } catch (ClassNotFoundException e) {}
            }
            return null;
        }
    });
    return super.onCreateOptionsMenu(menu);
}


코드 예시 감사합니다.상황에 맞는 메뉴로 작동시키기 위해 수정해야 했습니다.이것이 제 해결책입니다.

    static final Class<?>[] constructorSignature = new Class[] {Context.class, AttributeSet.class};

class MenuColorFix implements LayoutInflater.Factory {
    public View onCreateView(String name, Context context, AttributeSet attrs) {
        if (name.equalsIgnoreCase("com.android.internal.view.menu.ListMenuItemView")) {
            try {
                Class<? extends ViewGroup> clazz = context.getClassLoader().loadClass(name).asSubclass(ViewGroup.class);
                Constructor<? extends ViewGroup> constructor = clazz.getConstructor(constructorSignature);
                final ViewGroup view = constructor.newInstance(new Object[]{context,attrs});

                new Handler().post(new Runnable() {
                    public void run() {
                        try {
                            view.setBackgroundColor(Color.BLACK);
                            List<View> children = getAllChildren(view);
                            for(int i = 0; i< children.size(); i++) {
                                View child = children.get(i);
                                if ( child instanceof TextView ) {
                                    ((TextView)child).setTextColor(Color.WHITE);
                                }
                            }
                        }
                        catch (Exception e) {
                            Log.i(TAG, "Caught Exception!",e);
                        }

                    }
                });
                return view;
            }
            catch (Exception e) {
                Log.i(TAG, "Caught Exception!",e);
            }
        }
        return null;
    }       
}

public List<View> getAllChildren(ViewGroup vg) {
    ArrayList<View> result = new ArrayList<View>();
    for ( int i = 0; i < vg.getChildCount(); i++ ) {
        View child = vg.getChildAt(i);
        if ( child instanceof ViewGroup) {
            result.addAll(getAllChildren((ViewGroup)child));
        }
        else {
            result.add(child);
        }
    }
    return result;
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    LayoutInflater lInflater = getLayoutInflater();
    if ( lInflater.getFactory() == null ) {
        lInflater.setFactory(new MenuColorFix());
    }
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.myMenu, menu);
}

저는 안드로이드 1.6, 2.03, 4.03에서 작동합니다.

유레카를 찾았어요!!

앱 테마:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/ActionBarTheme</item>
    <!-- backward compatibility -->          
    <item name="actionBarStyle">@style/ActionBarTheme</item>        
</style>

액션바 테마는 다음과 같습니다.

<style name="ActionBarTheme" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
   <item name="android:background">@color/actionbar_bg_color</item>
   <item name="popupTheme">@style/ActionBarPopupTheme</item
   <!-- backward compatibility -->
   <item name="background">@color/actionbar_bg_color</item>
</style>

팝업 테마는 다음과 같습니다.

 <style name="ActionBarPopupTheme">
    <item name="android:textColor">@color/menu_text_color</item>
    <item name="android:background">@color/menu_bg_color</item>
 </style>

건배 ;)

테마에 추가하기만 하면 됩니다.

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:itemTextAppearance">@style/AppTheme.ItemTextStyle</item>
</style>

<style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
        <item name="android:textColor">@color/orange_500</item>
</style>

API 21에서 테스트됨

max.musterman 덕분에 레벨 22에서 일하게 되었습니다.

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    MenuItem searchMenuItem = menu.findItem(R.id.search);
    SearchView searchView = (SearchView) searchMenuItem.getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setSubmitButtonEnabled(true);
    searchView.setOnQueryTextListener(this);
    setMenuTextColor(menu, R.id.displaySummary, R.string.show_summary);
    setMenuTextColor(menu, R.id.about, R.string.text_about);
    setMenuTextColor(menu, R.id.importExport, R.string.import_export);
    setMenuTextColor(menu, R.id.preferences, R.string.settings);
    return true;
}

private void setMenuTextColor(Menu menu, int menuResource, int menuTextResource) {
    MenuItem item = menu.findItem(menuResource);
    SpannableString s = new SpannableString(getString(menuTextResource));
    s.setSpan(new ForegroundColorSpan(Color.BLACK), 0, s.length(), 0);
    item.setTitle(s);
}

Color.BLACK에한가가될수다e수될eo에 대한 추가 가 될 수 .setMenuTextColor방법.그리고 이것은 오직 메뉴 아이템에만 사용했습니다.android:showAsAction="never".

이것을 내 styles.xml에 추가하는 것이 나에게 효과가 있었습니다.

<item name="android:textColorPrimary">?android:attr/textColorPrimaryInverse</item>

개별 메뉴 항목에 대해 색상을 설정하려는 경우 도구 모음 테마를 사용자 정의하는 것은 올바른 해결책이 아닙니다.이를 위해 안드로이드:actionLayout과 메뉴 항목에 대한 액션뷰를 사용할 수 있습니다.

먼저 작업 보기에 사용할 XML 레이아웃 파일을 만듭니다.이 예제에서는 단추를 작업 보기로 사용합니다.

menu_button.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/menuButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Done"
        android:textColor="?android:attr/colorAccent"
        style="?android:attr/buttonBarButtonStyle"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

위의 코드 조각에서 우리는 다음을 사용합니다.android:textColor="?android:attr/colorAccent"단추 텍스트 색상을 사용자 정의합니다.

그런 다음 메뉴의 XML 레이아웃 파일에 다음을 포함합니다.app:actionLayout="@layout/menu_button"아래와 같이

main_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/menuItem"
        android:title=""
        app:actionLayout="@layout/menu_button"
        app:showAsAction="always"/>
</menu>

마지막 재지정:onCreateOptionsMenu()활동 방법:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    MenuItem item = menu.findItem(R.id.menuItem);
    Button saveButton = item.getActionView().findViewById(R.id.menuButton);
    saveButton.setOnClickListener(view -> {
        // Do something
    });
    return true;
}

...또는 조각:

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater){
    inflater.inflate(R.menu.main_menu, menu);
    MenuItem item = menu.findItem(R.id.menuItem);
    Button saveButton = item.getActionView().findViewById(R.id.menuButton);
    button.setOnClickListener(view -> {
        // Do something
    });
}

액션 뷰에 대한 자세한 내용은 Android 개발자 가이드를 참조하십시오.

프로그래밍 방식으로 색상을 설정할 수 있습니다.

private static void setMenuTextColor(final Context context, final Toolbar toolbar, final int menuResId, final int colorRes) {
    toolbar.post(new Runnable() {
        @Override
        public void run() {
            View settingsMenuItem =  toolbar.findViewById(menuResId);
            if (settingsMenuItem instanceof TextView) {
                if (DEBUG) {
                    Log.i(TAG, "setMenuTextColor textview");
                }
                TextView tv = (TextView) settingsMenuItem;
                tv.setTextColor(ContextCompat.getColor(context, colorRes));
            } else { // you can ignore this branch, because usually there is not the situation
                Menu menu = toolbar.getMenu();
                MenuItem item = menu.findItem(menuResId);
                SpannableString s = new SpannableString(item.getTitle());
                s.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, colorRes)), 0, s.length(), 0);
                item.setTitle(s);
            }

        }
    });
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.search, menu);


    MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
    SearchView searchView = (SearchView) myActionMenuItem.getActionView();

    EditText searchEditText = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
    searchEditText.setTextColor(Color.WHITE); //You color here

제 상황은 옵션 메뉴에서 텍스트 색상을 설정하는 것이었습니다(메뉴 버튼을 누르면 메인 앱 메뉴가 나타남).

API 16에서 appcompat-v7-27.0.2 라이브러리로 테스트되었으며,AppCompatActivity위해서MainActivity그리고.AppCompatAndroidManifest.xml의 응용 프로그램에 대한 테마입니다.

styles.xml:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  <item name="actionBarPopupTheme">@style/PopupTheme</item>
</style>

<style name="PopupTheme" parent="@style/ThemeOverlay.AppCompat.Light">
  <item name="android:textColorSecondary">#f00</item>
</style>

그것은 알 수 없습니다.textColorSecondary다른 요소에 영향을 미치지만 메뉴 텍스트 색상을 제어합니다.


해당 주제에 대한 몇 가지 예시를 검색했지만 모든 바로 사용할 수 있는 스니펫이 작동하지 않았습니다.

그래서 appcompat-v7 라이브러리(특히 .aar 패키지의 res 폴더)의 소스 코드로 조사하고 싶었습니다.

하지만 제 경우에는 폭발적인 .aar 의존성을 가진 이클립스를 사용했습니다.그래서 기본 스타일을 변경하고 결과를 확인할 수 있었습니다.Gradle 또는 Android Studio에서 직접 사용할 라이브러리를 폭발시키는 방법을 모릅니다.그것은 또 한번의 조사를 받을 만합니다.

그래서 저의 목적은 res/values/values.xml 파일에서 메뉴 텍스트에 어떤 색이 사용되는지 찾는 것이었습니다(그 색이 있다고 거의 확신했습니다).

  1. 그 파일을 열고, 모든 색을 복제해서 기본 색 아래에 덮어씌운 다음에 할당했습니다.#f00그들 모두에게 가치가 있습니다.
  2. 앱을 시작합니다.
  3. 많은 요소들이 빨간색 배경이나 텍스트 색을 가지고 있었습니다.메뉴도.그게 제게 필요했던 거에요.
  4. 추가된 색상을 5-10줄의 블록으로 제거하는 것으로 끝냈습니다.secondary_text_default_material_light컬러 아이템
  5. res 폴더(또는 res/color 내에서 더 나은) 내의 파일에서 해당 이름을 검색하면 color/abc_secondary_text_material_light.xml 파일에서 한 번만 발생했습니다(이 작업을 위해 Subravity Text를 사용하여 필요한 것을 더 쉽게 찾을 수 있었습니다).
  6. values.xml 8 사용이 발견되었습니다.@color/abc_secondary_text_material_light.
  7. Light 테마라서 2개의 테마로 4개가 남았습니다.Base.ThemeOverlay.AppCompat.Light그리고.Platform.AppCompat.Light.
  8. 첫 번째 테마는 두 번째 테마의 하위 테마였기 때문에 해당 색상 리소스의 속성은 2개뿐이었습니다.android:textColorSecondary그리고.android:textColorTertiary에서Base.ThemeOverlay.AppCompat.Light.
  9. values.xml에서 그들의 값을 직접 바꾸고 앱을 실행해보니 최종적으로 올바른 속성이android:textColorSecondary.
  10. 그 다음으로 저는 제 앱의 style.xml에서 변경할 수 있도록 테마 또는 다른 속성이 필요했습니다(제 테마가 상위에 있기 때문에).Theme.AppCompat.Light에가 ThemeOverlay.AppCompat.Light).
  11. 에서 를 했습니다.Base.ThemeOverlay.AppCompat.Light. 아이가 있었습니다.ThemeOverlay.AppCompat.Light.
  12. 을 하는 중 ThemeOverlay.AppCompat.Light나는 는에서 .Base.Theme.AppCompat.Light.DarkActionBar로서의 actionBarPopupTheme속성 값.
  13. 앱의 의 의 의 Theme.AppCompat.Light.DarkActionBar아이들은 발견자의 아이였습니다Base.Theme.AppCompat.Light.DarkActionBar그래서 저는 그 속성을 제 styles.xml에 문제없이 사용할 수 있었습니다.
  14. 코드에서처럼, 된 의 에서 에 된 으로 를 를 으로 된 의 에서 ThemeOverlay.AppCompat.Light그리고 변화를 줬습니다.android:textColorSecondary기여하다.

https://i.stack.imgur.com/plzdq.png

아래와 같이 텍스트 추가색상

<style name="MyTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:textColor">@color/radio_color_gray</item>
</style>

xml 파일의 도구 모음에서 사용합니다.

<androidx.appcompat.widget.Toolbar
     android:id="@+id/toolbar"
     android:layout_width="match_parent"
     android:layout_height="?attr/actionBarSize"
     app:popupTheme="@style/MyTheme.PopupOverlay" /> 

세피의 해결책은 효과가 없습니다.위에 설명한 방법을 사용하여 옵션 메뉴 항목 텍스트 모양을 재정의할 수 있지만 항목이나 메뉴는 무시할 수 없습니다.이를 위해서는 기본적으로 세 가지 방법이 있습니다.

  1. 옵션 메뉴의 배경색을 변경하는 방법은?
  2. 원하는 결과를 얻으려면 CreateOptions Menu와 PrepareOptions Menu에 표시하고 재정의하려면 자신의 보기를 작성합니다.저는 일반적으로 이 방법으로 원하는 것은 무엇이든 할 수 있기 때문에 이것을 언급하지만, 아마도 당신은 super()를 호출하고 싶지 않을 것입니다.
  3. 오픈 소스 SDK에서 코드를 복사하고 동작에 맞게 사용자 지정합니다.Activity에서 사용하는 기본 메뉴 구현은 더 이상 적용되지 않습니다.

자세한 단서는 4441호: 사용자 지정 옵션 메뉴 테마를 참조하십시오.

이 코드를 사용해 보십시오.

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
         inflater.inflate(R.menu.my_menu, menu);

        getLayoutInflater().setFactory(new Factory() {
            @Override
            public View onCreateView(String name, Context context,
                    AttributeSet attrs) {

                if (name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")) {
                    try {
                        LayoutInflater f = getLayoutInflater();
                        final View view = f.createView(name, null, attrs);

                        new Handler().post(new Runnable() {
                            public void run() {

                                // set the background drawable
                                 view.setBackgroundResource(R.drawable.my_ac_menu_background);

                                // set the text color
                                ((TextView) view).setTextColor(Color.WHITE);
                            }
                        });
                        return view;
                    } catch (InflateException e) {
                    } catch (ClassNotFoundException e) {
                    }
                }
                return null;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

특정 메뉴 항목을 색상으로 색칠할 수 있는 방법은 모든 API 수준에서 작동합니다.

public static void setToolbarMenuItemTextColor(final Toolbar toolbar,
                                               final @ColorRes int color,
                                               @IdRes final int resId) {
    if (toolbar != null) {
        for (int i = 0; i < toolbar.getChildCount(); i++) {
            final View view = toolbar.getChildAt(i);
            if (view instanceof ActionMenuView) {
                final ActionMenuView actionMenuView = (ActionMenuView) view;
                // view children are accessible only after layout-ing
                actionMenuView.post(new Runnable() {
                    @Override
                    public void run() {
                        for (int j = 0; j < actionMenuView.getChildCount(); j++) {
                            final View innerView = actionMenuView.getChildAt(j);
                            if (innerView instanceof ActionMenuItemView) {
                                final ActionMenuItemView itemView = (ActionMenuItemView) innerView;
                                if (resId == itemView.getId()) {
                                    itemView.setTextColor(ContextCompat.getColor(toolbar.getContext(), color));
                                }
                            }
                        }
                    }
                });
            }
        }
    }
}

이렇게 하면 배경 선택기 효과가 사라지므로 모든 메뉴 항목의 하위 항목에 사용자 지정 배경 선택기를 적용할 수 있는 코드가 여기에 있습니다.

public static void setToolbarMenuItemsBackgroundSelector(final Context context,
                                                         final Toolbar toolbar) {
    if (toolbar != null) {
        for (int i = 0; i < toolbar.getChildCount(); i++) {
            final View view = toolbar.getChildAt(i);
            if (view instanceof ImageButton) {
                // left toolbar icon (navigation, hamburger, ...)
                UiHelper.setViewBackgroundSelector(context, view);
            } else if (view instanceof ActionMenuView) {
                final ActionMenuView actionMenuView = (ActionMenuView) view;

                // view children are accessible only after layout-ing
                actionMenuView.post(new Runnable() {
                    @Override
                    public void run() {
                        for (int j = 0; j < actionMenuView.getChildCount(); j++) {
                            final View innerView = actionMenuView.getChildAt(j);
                            if (innerView instanceof ActionMenuItemView) {
                                // text item views
                                final ActionMenuItemView itemView = (ActionMenuItemView) innerView;
                                UiHelper.setViewBackgroundSelector(context, itemView);

                                // icon item views
                                for (int k = 0; k < itemView.getCompoundDrawables().length; k++) {
                                    if (itemView.getCompoundDrawables()[k] != null) {
                                        UiHelper.setViewBackgroundSelector(context, itemView);
                                    }
                                }
                            }
                        }
                    }
                });
            }
        }
    }
}

도우미 기능도 다음과 같습니다.

public static void setViewBackgroundSelector(@NonNull Context context, @NonNull View itemView) {
    int[] attrs = new int[]{R.attr.selectableItemBackgroundBorderless};
    TypedArray ta = context.obtainStyledAttributes(attrs);
    Drawable drawable = ta.getDrawable(0);
    ta.recycle();

    ViewCompat.setBackground(itemView, drawable);
}

텍스트 색상을 변경하려면 메뉴 항목에 대한 사용자 정의 보기를 설정한 다음 텍스트의 색상을 정의할 수 있습니다.

샘플 코드 : MenuItem.setActionView()

단순히 Values - styles and inside style로 이동하여 색상을 입력하기만 하면 됩니다.

언급URL : https://stackoverflow.com/questions/3519277/how-to-change-the-text-color-of-menu-item-in-android

반응형