Android ActionBar MenuItem LowerCase

风格不统一 提交于 2019-11-28 17:26:35

Solution for native ActionBar implementation:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyTheme" parent="android:Theme.Holo">
        <item name="android:actionMenuTextAppearance">@style/MyMenuTextAppearance</item>
    </style>
    <style name="MyMenuTextAppearance" parent="android:TextAppearance.Holo.Widget.ActionBar.Menu">
        <item name="android:textAllCaps">false</item>
    </style>
</resources>

If you are using ActionBarSherlock there are two different approaches:

1) Create boolean resource abs__config_actionMenuItemAllCaps and set it to false:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="abs__config_actionMenuItemAllCaps">false</bool>
</resources>

2) Or create theme with overriden actionMenuTextAppearance and use it in AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyTheme" parent="Theme.Sherlock">
        <item name="actionMenuTextAppearance">@style/MyMenuTextAppearance</item>
        <item name="android:actionMenuTextAppearance">@style/MyMenuTextAppearance</item>
    </style>
    <style name="MyMenuTextAppearance" parent="TextAppearance.Sherlock.Widget.ActionBar.Menu">
        <item name="android:textAllCaps">false</item>
    </style>
</resources>

PLEASE NOTE: there is bug in ActionBarSherlock that forces MenuItem to be upper case on pre-ICS (https://github.com/JakeWharton/ActionBarSherlock/issues/969). I've submitted patch but it is not merged at the moment. For now you can use my fork: https://github.com/alexander-mironov/ActionBarSherlock/tree/dev, I will update this answer when my code is merged in the main repository.

UPDATE: my fix has been merged into main ActionBarSherlock repository.

Add the following to one of your values xml files -

<bool name="abc_config_actionMenuItemAllCaps">false</bool>

Just to complete the answer, if you're using AppCompat the parent style is:

<style name="MyMenuTextAppearance" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Menu">
    <item name="android:textAllCaps">false</item>
</style>

For making the menu text to lowercase like "MENU ITEM" to "Menu Item" here is my solution.

In res >> values >> styles.xml add the following:

<style name="MenuItemTextAppearance" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Menu">
    <item name="textAllCaps">false</item>
</style>

After you can call it on your AppTheme:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">...</item>
    <item name="colorPrimaryDark">...</item>
    <item name="colorAccent">...</item>
    <item name="actionMenuTextAppearance">@style/MenuItemTextAppearance</item>
</style>

I hope this helps. :)

I tried some of the other answers here but to no luck (I'm not using action bar sherlock). As mentioned in the comments, in the newer support libraries, the above solutions don't seem to work. To solve this issue, I added my own actionLayout to the Menu Items.

<item
    android:id="@+id/done"
    app:showAsAction="always"
    android:title="@string/yourTitle"/>

Then in my code I did something like this.

final MenuItem done = menu.findItem(R.id.done);

done.setActionView(R.layout.menu_item_kingfisher_text_view);

TextView doneTextView = (TextView) done.getActionView();

Then you can do what you want with the text view and avoid the text being all caps. This is definitely not ideal, but if you need a workaround for this issue, this does work.

From source code in android.support.v7.internal.view.menu.ListMenuItemView

//Set text appearance in constructor from style
...
mTextAppearance = a.getResourceId(R.styleable.MenuView_android_itemTextAppearance, -1);
...

//Apply text appearance to view item
mTitleView = (TextView) findViewById(R.id.title);
if (mTextAppearance != -1) {
    mTitleView.setTextAppearance(mTextAppearanceContext, mTextAppearance);
}

In project: Create popup theme and apply it on popup creation for some custom popup if it's planned to use this appearance across whole application then put it to main application theme.

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

...
Context context = new ContextThemeWrapper(getActivity(), R.style.PopupTheme);
MenuPopupHelper optionsMenu = new MenuPopupHelper(context, menuBuilder, anchorView);
...

add theme to toolbar with textAllCaps

<android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"          
            android:minHeight="?attr/actionBarSize"            
            app:theme="@style/ToolBarStyle"
            app:titleTextColor="@color/colorAccent"
            app:subtitleTextColor="@color/colorAccent"
            />

styles.xml

<style name="ToolBarStyle" parent="Theme.AppCompat">          
        <item name="android:textAllCaps">false</item>
    </style>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!