Androidでメニュー項目のテキストの色を変更するにはどうすればよいですか?


175

Androidでメニュー項目の背景色を変更できますか?

誰かこれに解決策があるかどうか私に知らせてください。最後のオプションは明らかにカスタマイズすることですが、カスタマイズせずにテキストの色を変更する方法はありますか。


これの解決策を私に知らせることができる人はいますか?
10

3
テキストの色、テキストビューの背景色を変更しますか?または両方?どちらも違うものです。質問を再構成してください。
Abhinav Saxena 2014年

回答:


335

あなたのテーマの1つの単純な行:)

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

19
注:これは、アプリのメインテーマ定義に含める必要がありますactionBarStyle。たとえば、内には含めないでください。それはactionBarStyle論理的に思えますが、内では機能しません!
Colin M.

47
以前のAPIバージョンをサポート<item name="actionMenuTextColor">@color/your_color</item>するには、Android名前空間を使用しないでください
alex.p '

5
@ColinM。それはテーマに入る必要があります。themeツールバーに属性を設定すると、これが機能します。
DariusL

2
android:名前空間を使用しても使用しなくても機能しませんでした。メインアプリのテーマに追加されました。
racが

2
私はまだ完全にテキストの色を変更することができません。私の全体的なテーマのテキストカラーが優先されます。何か助けは?これらの答えはどれも機能しません。
David P

114

のようです

  <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で、リスト項目のスタイルを変更しますが、メニュー項目は変更しません。


5
これは、私が探していたコンテキストメニュー項目(メニューボタンのメニュー項目ではない)に最適です。LayoutFactory全体の混乱よりもはるかに単純です。
chubbsondubs

android:itemTextAppearance属性は、その親であるスタイルの中に配置することができないparent="@android:style/Widget.Holo.ListPopupWindow"ことが正しく表示されませんので、。親がであるようなトップレベルのスタイルである必要がありますandroid:Theme.Holo.Light.DarkActionBar
toobsco42 2013年

<item name = "android:itemTextAppearance"> @ style / myCustomMenuTextApearance </ item>はどこに追加すればよいですか?
Bagusflyer 2014

@bagusflyerあなたはすなわちの子である、スタイル、あなたのテーマのルートスタイルでそれを追加する必要がありますTheme.Holoか、Theme.Holo.Light.DarkActionBarまたは類似。
Tash Pemhiwa 2014年

86

の代わり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);
}

10
これは、4.4と5+の両方で機能しました。menu.findItem(R.id.menu_item_id);代わりにmenu.getItem()
haagmm

1
私もうまくいきました[findItem(...)を使用]。
ボーッ

6
「常に」:溶液は、オーバーフローの項目のために....私はshowAsActionを設定することにより表示される項目の色を変更するwan'tワーク
Junaid

56

新しいツールバーとテーマを使用している場合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ドット)ボタンのテキスト色です。(はい、このプロパティに従って色が変わりました!)

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"/>

ツールバーのアクション(テキスト)として表示されるボタンのテキストを管理するアイテムはどれですか。android:textColorPrimary、android:textColorSecondary、android:textColorのいずれも影響を与えていないようです。
LarsH 2017年

前のコメントの私の質問への回答:android:actionMenuTextColorstackoverflow.com/a/5538709/423105を参照)。
LarsH 2017年

31

メニューを使用している場合は<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"/>

それがあなたを助けることを願っています。


これにより、別のアイテムにネストされているアイテムが変更されましたが、他のアイテムを含むアイテムは変更されませんでした。私もそれらを変更する方法を知っていますか?
Dinu Nicolae

@DinuNicolaeスクリーンショットの例を投稿していただけますか?または詳細を入力してください。
Mihir Trivedi

<item> <menu> <inside items> </ menu> </ item>があり、内部のアイテムの色のみが変更されました
Dinu Nicolae

31

私はプログラムで次のようにそれについて行きました:

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;
}

2
あなたの答えは、MenuItemテキストを太字に設定するのに役立ちました。(s.setSpan(new StyleSpan(android.graphics.Typeface.BOLD)、0、s.length()、0);ありがとう!
ArkadiuszCieśliński15年

この解決策は私の問題を助けました。テーマ関連の条件に依存しないので、私はこれが好きです。
Tomcat

15

この質問でわかるように、次のことを行う必要があります。

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

上記のコードは、API> = v21のメニューアクションアイテムのテキストの色を変更します。

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

上記はAPI <v21のコードです


ありがとうございました。これは受け入れられるべきです。それはシンプルで簡単です
Pooja

10

htmlタグを使用して、メニュー項目がインフレートされているときに1つの項目のテキストの色を変更しました。お役に立てれば幸いです。

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;
}

1
これはマシュマロでは私にはうまくいきません。テキストは適用されますが、色は適用されません。
Ollie C

マシュマロについては、おそらくmax.mustermannの回答で述べられているのと同じ理由で「ソリューションはオーバーフローのアイテムに対してのみ機能する」とは言えません。
Jose_GD 2016年

10

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>

styles.xmlの通常のツールバー

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

カスタムツールバースタイル

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

よく働く!ベストアンサー。
2017年

9

Kotlinでこれらの拡張機能を作成しました。

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)

本当にこのソリューションのように、とてもきれいです!
Jamil Nawaz、2018

ありがとう、シンプルで迅速なソリューション。API> 24の場合、2番目のext関数なしで機能します
laszlo

7

短い答えはYESです。あなたはラッキーです!
そのためには、Androidのデフォルトスタイルの一部のスタイルをオーバーライドする必要があります。

まず、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
、スタイルの定義のNowにあります

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

これで、システムのリソースのcolorフォルダーを確認すると、問題の色の名前がわかります。

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

最後に、これがあなたがする必要があることです:

「TextAppearance.Widget.IconMenu.Item」をオーバーライドして、独自のスタイルを作成します。次に、それを独自のセレクターにリンクして、希望する方法にします。これがお役に立てば幸いです。幸運を!


返信いただきありがとうございます。私はあなたが提案したことをしましたが、それはメニュー項目の色を変えません
sunil '26 / 08/26

実際、メニューをもっと読むことで、思ったよりもはるかに複雑だと気づきました。独自の完全なカスタムメニューを作成したくない場合は、これを読んでおく必要があります。もっと見つけたらここに投稿しました。
Sephy、

「TextAppearance.Widget.IconMenu.Item」をオーバーライドすることはできません。
peceps 2011

この答えは誤解を招くようなものです..結論は、それが機能せず、最初に考えたよりも達成するのがはるかに難しい/長い風になりますか?
speedynomads

6

Androidのオプションメニューをカスタマイズして、背景を設定したり、テキストの外観を変更したりできます。メニューの背景とテキストの色は、テーマとスタイルを使用して変更できませんでした。androidソースコード(data \ res \ layout \ icon_menu_item_layout.xml)は、メニューレイアウトに「com.android.internal.view.menu.IconMenuItemView」クラスのカスタムアイテムを使用します。上記のクラスを変更して、メニューをカスタマイズできます。同じことを行うには、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);
}



3
03-23 19:45:25.134: E/AndroidRuntime(26761): java.lang.IllegalStateException: A factory has already been set on this LayoutInflater
Kra

これは初めて動作します。もう一度メニューを開くと、例外が発生します。
LoveForDroid 2017

6

コード例をありがとう。私はそれをコンテキストメニューで動作するように変更する必要がありました。これが私の解決策です。

    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);
}

私にとって、これはAndroid 1.6、2.03、4.03で動作します。


上記を実行している場合は、Marcus Wolschonソリューションの使用を検討する必要があります。はるかに簡単です。
chubbsondubs

たとえば、2.3.xではxmlソリューションは機能しませんが、これは魅力的なように
機能します-4.x

このソリューションが最も効果的でした。互換性ライブラリを使用してデバイスにスタイルを適用するには、android.support.v7.internal.view.menu.ListMenuItemViewもキャプチャする必要がありました
Chiatar

この修正はGoogleマップv2では機能しません。マップを正しくレンダリングするには、スーパーメソッドを最初に呼び出す必要があります。
チアタール2013年

5

ユーレカを見つけた!!

アプリのテーマ:

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

乾杯;)


5

メニュー項目のテキストの色を変更するには、コードの下を使用します

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

4

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は、setMenuTextColorメソッドの追加パラメーターになる可能性があります。また、これはだったメニュー項目にのみ使用しましたandroid:showAsAction="never"


API 24で動作しません。何かアイデアはありますか?これに何日も行き詰まっている...ばかげている!
David P

何を伝えればよいかわからない。これは、API 25に私のために正常に動作している
lightkeeper

3

プログラムで色を設定できます。

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);
            }

        }
    });
}

3

これを私のstyles.xmlに追加するとうまくいきました

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

2

これをテーマに追加するだけです

<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でテスト済み


2
を使用することをお勧めします<style name="AppTheme.ItemTextStyle" parent="@android:style/TextAppearance.Widget">。そうしないと、オーバーフローメニューのテキストが小さすぎるように見えます。また、この手法はAndroid 5以降でのみ機能することにも注意してください。
Mr-IDE

2
@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

1
あなたの答えを説明してください
Coder

1
SearchViewでない場合はどうなりますか?
nasch

2

私の状況は、オプションメニューのテキストの色を設定することでした(メインアプリメニューはメニューボタンを押すと表示されました)。

でテストAPI 16APPCOMPAT-v7-27.0.2ライブラリAppCompatActivityMainActivityAppCompatでアプリケーションのテーマのAndroidManifest.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依存関係を展開してEclipseを使用しましたが。したがって、デフォルトのスタイルを変更して結果を確認できます。GradleまたはAndroid Studioで直接使用するためにライブラリを分解する方法がわかりません。それは調査の別のスレッドに値します。

だから私の目的は、res / values / values.xmlファイルのどの色がメニューテキストに使用されているかを見つけることでした(色がそこにあるとほぼ確信していました)。

  1. そのファイルを開いてすべての色を複製し、デフォルトの色の下に置いて上書きし、すべての色に#f00値を割り当てました。
  2. アプリを起動します。
  3. 多くの要素の背景が赤またはテキスト色でした。そしてメニューアイテムも。それが私が必要としていたことです。
  4. 追加した色を5〜10行のブロックで削除すると、secondary_text_default_material_lightカラーアイテムで終了しました。
  5. resフォルダー(またはres / colors内)内のファイルでその名前を検索すると、color / abc_secondary_text_material_light.xmlファイルで1つだけ見つかりました(これらの操作にSublime Textを使用したので、必要なものを簡単に見つけることができます)。
  6. values.xmlに戻ると、8の使用法が見つかりました@color/abc_secondary_text_material_light
  7. それはライトのテーマだったので、4つが2つのテーマに残っています:Base.ThemeOverlay.AppCompat.LightPlatform.AppCompat.Light
  8. :最初のテーマはそうそこにその色のリソースを持つ唯一の2属性があっ秒1の子供だったandroid:textColorSecondaryandroid: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.Lightandroid:textColorSecondary属性を変更しました。

https://i.imgur.com/LNfKdzC.png


1

Sephyのソリューションは機能しません。上記の方法を使用してオプションメニュー項目のテキストの外観をオーバーライドできますが、項目またはメニューはオーバーライドできません。これを行うには、基本的に3つの方法があります。

  1. オプションメニューの背景色を変更する方法
  2. 独自のビューを記述して、onCreateOptionsMenuおよびonPrepareOptionsMenuを表示およびオーバーライドして、必要な結果を取得します。一般的には、これらのメソッドで何でも好きなことができるので、これを一般的に述べますが、おそらくsuper()を呼び出したくないでしょう。
  3. オープンソースSDKからコードをコピーして、動作に合わせてカスタマイズします。アクティビティで使用されるデフォルトのメニュー実装は適用されなくなります。

その他の手がかりについては、課題4441:カスタムオプションメニューのテーマを参照してください。


繰り返しますが、SephyのソリューションはメニューアイテムTextAppearanceに対して機能しますが、私が行ったことは、themes.xmlを介してデフォルトをオーバーライドすることです。また、上記の#2または#3は、super#onCreateOptionsMenu / super#onPrepareOptionsMenuへの呼び出しがシステムメニュー項目を配置するように設計されていることに注意してください... Activity#onCreateOptionsMenu()のjavadocに示されています。それはあなたのアプリにとって重要かもしれないし、重要ではないかもしれません。
粘り強い

Sephyが説明しているのは、これをthemes.xmlに含めることです:<item name = "android:itemTextAppearance"> @ style / Text_MenuItemText </ item>次に、styles.xmlで次のように定義します:<style name = "Text_MenuItemText" > <item name = "android:textSize"> 12dp </ item> <item name = "android:textColor">#FFFFFF </ item> </ style>とても簡単です。それはあなたが意味したことでしたか?より深いオプションメニューのカスタマイズは簡単ではありませんが、私はそれについてブログ記事をすぐに投稿するつもりです。
粘り強い

1

このコードを試してください...

 @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);
    }

1
Android> 4.0の場合java.lang.IllegalStateException: A factory has already been set on this LayoutInflater
Kra

1

個々のメニュー項目に色を設定する場合、ツールバーのテーマをカスタマイズすることは適切な解決策ではありません。これを実現するには、android: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デベロッパーガイドをご覧ください。


0

これは、特定のメニュー項目に色を付ける方法であり、すべての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);
}

0

テキストの色を変更するには、MenuItemのカスタムビューを設定して、テキストの色を定義します。

サンプルコード:MenuItem.setActionView()


このコードスニペットは質問を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
Mischa 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.