如何在Android中更改holo主题菜单项文本颜色?

9

我正在使用我的应用中的Theme.Holo主题。

我使用以下Style.xml自定义了我的主题:

<style name="CustomActivityTheme" parent="@android:style/Theme.Holo">
    <item name="android:actionBarStyle">@style/CustomActivityTheme.ActionBar</item>
    <item name="android:actionMenuTextColor">#000000</item>
    <item name="android:divider">@drawable/action_bar_div</item>
    <item name="android:actionOverflowButtonStyle">@style/MyActionButtonOverflow</item>
    <item name="android:popupMenuStyle">@style/MyPopupMenu</item>
    <item name="android:itemBackground">@drawable/menu_item_background_fill</item>

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

<style name="myCustomMenuTextApearance" parent="@android:style/TextAppearance.Widget.TextView.PopupMenu">
    <item name="android:textColor">#404040</item>
</style>

<style name="CustomActivityTheme.ActionBar.OverFlow" parent="@android:style/TextAppearance">
    <item name="android:textColor">#404040</item>
    <item name="android:textSize">18sp</item>
</style>
<style name="CustomButton"> 
     <item name="android:background">@drawable/button_selector</item>
</style>
 <style name="CustomProgressButton">
     <item name="android:background">@drawable/custom_progress_button</item>
</style>
<style name="CustomProfileButton">
     <item name="android:background">@drawable/custom_profile_button</item>
</style>
<style name="CustomSharingButton">
     <item name="android:background">@drawable/custom_sharing_button</item>
</style>
<style name="CustomListBlue">
     <item name="android:background">@drawable/custom_listblue</item>
</style>

<style name="MyPopupMenu" parent="android:style/Widget.Holo.Light.ListPopupWindow">
    <!-- <item name="android:background">#B2B2B2</item> -->
    <item name="android:popupBackground">#B2B2B2</item>

</style>

<style name="MyActionButtonOverflow" parent="android:style/Widget.Holo.ActionButton.Overflow">
    <item name="android:src">@drawable/overflow</item>
</style>

<style name="CustomActivityTheme.ActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:background">@drawable/actionbar_bg</item>
    <item name="android:titleTextStyle">@style/CustomActivityTheme.ActionBar.Text</item>
    <item name="android:subtitleTextStyle">@style/CustomActivityTheme.ActionBar.Text</item>
    <!-- <item name="android:actionOverflowButtonStyle">@drawable/overflow.png</item> -->
</style>

<style name="CustomActivityTheme.ActionBar.Text" parent="@android:style/TextAppearance">
    <item name="android:textColor">#000000</item>
    <item name="android:textSize">16sp</item>
</style>

<style name="activated" parent="android:Theme.Holo">
    <item name="android:background">?android:attr/activatedBackgroundIndicator</item>
</style>

<!-- style for removing the floating dialog -->
<style name="CustomDialogTheme">
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

<!-- style for transparent image resource  activity -->

<style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:windowAnimationStyle">@style/MyAnimation.Window</item>
</style>

<!-- Animations for a non-full-screen window or activity. -->
<style name="MyAnimation.Window" parent="@android:style/Animation.Dialog">
    <item name="android:windowEnterAnimation">@anim/grow_from_middle</item>
    <item name="android:windowExitAnimation">@anim/shrink_to_middle</item>
</style>

<!-- style for transparent audio and video resource  activity -->

<style name="Theme.Transparent_Player" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:windowAnimationStyle">@style/MyPlayerAnimation.Window</item>
</style>

<!-- Animations for a non-full-screen window or activity. -->
<style name="MyPlayerAnimation.Window" parent="@android:style/Animation.Dialog">
    <item name="android:windowEnterAnimation">@anim/grow_from_action_bar</item>
    <item name="android:windowExitAnimation">@anim/shrink_to_action_bar</item>
</style>

我在10英寸设备上看到以下输出:

enter image description here

而在4.7英寸设备上,它的输出如下(白色文本颜色代替 #404040 颜色代码):

enter image description here

我已经设置了背景颜色,但是在4.7英寸设备上菜单项文本颜色没有改变。

在4.7英寸设备上,我没有溢出菜单图标,我是通过按菜单按钮打开此菜单的。

如何将文本颜色设置为与10英寸设备相同?

先感谢您!!!

我的菜单布局代码如下:

<item
    android:id="@+id/home"
    android:title="@string/home"/>
<item
    android:id="@+id/viewer"
    android:title="@string/viewer"/>
<item
    android:id="@+id/quiz"
    android:title="@string/quiz"/>
<item
    android:id="@+id/results"
    android:title="@string/results"/>
<item
    android:id="@+id/chat"
    android:title="@string/chat"/>
<item
    android:id="@+id/settings"
    android:title="@string/settings"/>
<item
    android:id="@+id/intro"
    android:title="@string/intro"/>
<item
    android:id="@+id/lookitup"
    android:title="@string/lookitup"/>
<item
    android:id="@+id/standing"
    android:title="@string/standing"/>
<item
    android:id="@+id/sharing"
    android:title="@string/sharing"/>
<item
    android:id="@+id/advance"
    android:title="@string/advance"/>
<item
    android:id="@+id/reset"
    android:title="@string/reset"/>

<item
    android:id="@+id/refresh"
    android:title="@string/refresh"/>

<item
    android:id="@+id/sync_now"
    android:title="@string/sync_now"/>

<item
    android:id="@+id/sync_info"
    android:title="@string/sync_info"/>

<item
    android:id="@+id/menuIconInfo"
    android:icon="@drawable/info_light_on_dark"
    android:showAsAction="always"/>

<item
    android:id="@+id/menuIconAudio"
    android:icon="@drawable/audio_light_on_dark"
    android:showAsAction="always"/>
<item
    android:id="@+id/menuIconVideo"
    android:icon="@drawable/video_light_on_dark"
    android:showAsAction="always"/>

<item
    android:id="@+id/menuIconLearn"
    android:icon="@drawable/ic_menu_learn"
    android:showAsAction="always"/>
<item
    android:id="@+id/menuIconIntro"
    android:icon="@drawable/intro_pane"
    android:showAsAction="always"/>
<item
    android:id="@+id/menuIconLookItUp"
    android:icon="@drawable/look_it_up"
    android:showAsAction="always"/>
<item
    android:id="@+id/menuIconRecall"
    android:icon="@drawable/ic_menu_recall"
    android:showAsAction="always"/>


1
@AkbariDipali,你最终成功了吗?我也在尝试做同样的事情,但是我甚至无法像你一样更改菜单项的背景。我发了一个问题询问这个问题,随时欢迎回答,即使只有关于编辑背景的解决方案,点赞也是肯定的:P - doplumi
@domenicop 是的,我下面给出的答案对我非常有效!我尝试了很多次使用style.xml来更改背景和文本颜色。但是我唯一能做到的就是更改背景(您可以在上面的问题中看到“ MyPopupMenu”“ MyActionButtonOverflow”样式以更改背景)。但是要更改文本颜色,我必须使用下面答案中提供的解决方案。试试吧。希望它也能为您工作。 - Akbari Dipali
@AkbariDipali 有点乱,我不得不修改一些东西才能让它工作,这就是为什么我在问^^ - doplumi
@domenicop 如果您正在使用图标菜单,则应使用“com.android.internal.view.menu.IconMenuItemView”。您能否调试代码并检查属性?我尝试了很多选项,最终在调试后找到了解决方案。 - Akbari Dipali
@AkbariDipali 我让 onCreateView 方法输出它所调用的所有名称,正如你在这里看到的那样,没有一个是该类(也没有一个包含 Menu 这个词!)我尝试使用 IconMenuItemView 但没有任何变化。如果您愿意,最好在聊天中继续讨论 :) - doplumi
显示剩余9条评论
2个回答

9

如果使用SpannableString而不是String,您应该能够轻松更改文本的颜色 - 无需进行麻烦的解决办法 ;-)

SpannableString s = new SpannableString("My red MenuItem");
s.setSpan(new ForegroundColorSpan(Color.RED), 0, s.length(), 0);
item.setTitle(s);

对我来说运行良好,在onPrepareOptionsMenu()中执行此操作。 - Marc

3

通过检查设备版本的代码,我已经解决了菜单的背景颜色更改问题。

如果设备不支持溢出菜单,你可以使用以下方法更改菜单的背景颜色,也可以更改菜单文本颜色:

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.GRAY);
                        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.BLACK);
                            }
                        }
                    }
                    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;
}

//在onCreateContextMenu中,放置以下代码
@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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接