204

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

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

4

29 に答える 29

132

どうやら

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

于 2011-04-04T12:51:25.047 に答える
103

の代わりにMenuItemを使用すると、テキストの色を簡単に変更できます。SpannableStringString

@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);
}
于 2013-09-25T15:03:57.440 に答える
32

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

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

于 2016-02-02T13:16:50.200 に答える
11

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)
于 2018-04-03T12:01:41.880 に答える
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;
}
于 2015-10-28T02:01:29.130 に答える
8

私はマテリアル デザインを使用していましたが、ツールバーが小さな画面に表示されているときに、その他のオプションをクリックすると、空白の白いドロップダウン ボックスが表示されました。これを修正するために、これをメインの AppTheme に追加したと思います。

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

次に、メニュー項目の textColor を目的の色に設定するスタイルを作成しました。

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

親の名前Widget.AppCompat.TextView.SpinnerItemはあまり重要ではないと思いますが、それでも機能するはずです。

于 2020-08-06T08:22:25.183 に答える
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で動作します。

于 2012-05-22T12:20:58.127 に答える
6

短い答えはイエスです。あなたはラッキーです!
そのためには、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
の定義内にあります。

<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」をオーバーライドして、独自のスタイルを作成します。次に、それを独自のセレクターにリンクして、希望どおりにします。これがお役に立てば幸いです。幸運を!

于 2010-08-19T09:10:52.413 に答える
6

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


于 2011-06-02T05:49:43.927 に答える
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>

乾杯 ;)

于 2015-07-06T23:24:08.833 に答える
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
于 2017-03-09T17:27:24.197 に答える
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);
    }
于 2012-08-19T13:23:57.483 に答える
1

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

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

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

于 2010-10-17T09:12:13.517 に答える
0

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

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

于 2017-08-24T09:56:07.333 に答える