安卓ActionBar菜单项小写化

47

我希望将ActionBar中的MenuItem标题变为小写。

我的menu.xml文件内容如下:

  <item android:id="@+id/register"
    android:title="Register"
    android:showAsAction="ifRoom|withText"/>

  <item android:id="@+id/unregister"
    android:title="Unregister"
    android:showAsAction="ifRoom|withText"/>

在ActionBar中看到"REGISTER"和"UNREGISTER",但我希望它显示为"Register"和"Unregister"。

是否可以使菜单项的第一个字母大写并将后面的字母变小写?我该怎么做?


1
我改变了我的答案。你可以查看它。 - Alexander Mironov
7个回答

49

本地ActionBar实现的解决方案:

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

如果您正在使用ActionBarSherlock,则有两种不同的方法:

1)创建布尔资源 abs__config_actionMenuItemAllCaps 并将其设置为 false


1)创建布尔资源 abs__config_actionMenuItemAllCaps 并将其设置为 false:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="abs__config_actionMenuItemAllCaps">false</bool>
</resources>

2) 或者使用actionMenuTextAppearance覆盖创建主题,并在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>

请注意:ActionBarSherlock存在一个错误,导致在ICS之前的版本中MenuItem必须大写(https://github.com/JakeWharton/ActionBarSherlock/issues/969)。我已经提交了修补程序,但目前还没有合并。现在您可以使用我的分支:https://github.com/alexander-mironov/ActionBarSherlock/tree/dev,当我的代码合并到主存储库中时,我会更新此答案。

更新:我的修复已合并到主ActionBarSherlock存储库中。


感谢您提供的解决方案。是否可以通过编程方式将此样式设置到ActionBar上? - Martin Vysny
当升级以支持rev 23.3.0时,我不得不在没有android包的情况下使用textAllCaps。 <item name="textAllCaps">false</item> - Lucas Arrefelt

26

将以下内容添加到您的values XML文件中之一 -

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

25

仅为了完善答案,如果您正在使用AppCompat,则父样式为:

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

11
在我的S3和Nexus 4上,使用AppCompat对我没有任何影响。我可以更改其他actionMenuTextAppearance属性,如文本大小和样式。但是,全大写字母仍然存在。我使用的是支持库的rev 21.0.1版本。 - Mike Ortiz
@Mike:使用旧的支持库可以解决问题。但一些在21.0.x版本中不起作用了,我不知道为什么。也许他们根本就不想让它工作?有点烦人。 - Patrick Boos
我也遇到了同样的问题。 - jagmohan
这里有人找到解决方案了吗?我也遇到了同样的问题。 - Zach Sperske
2
当升级以支持rev 23.3.0时,我不得不在没有android包的情况下使用textAllCaps。 <item name="textAllCaps">false</item> - Lucas Arrefelt
是的,我看到你需要在两个地方删除Android包: <item name="actionMenuTextAppearance">@style/MyMenuTextAppearance</item> 和 <item name="textAllCaps">false</item>。 - hmac

17

要将菜单文本转换为小写,例如将"MENU ITEM" 转换为 "Menu Item",这是我的解决方案。

在res >> values >> styles.xml中添加以下内容:

<style name="MenuItemTextAppearance" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Menu">
    <item name="textAllCaps">false</item>
</style>
在你的App主题上调用它之后:
<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>

我希望这有所帮助。 :)


5

我尝试了这里的一些其他答案,但都没有成功(我没有使用action bar sherlock)。如评论中所述,在较新的支持库中,上述解决方案似乎不起作用。为了解决这个问题,我将自己的actionLayout添加到菜单项中。

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

然后在我的代码中,我做了类似这样的事情。

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

done.setActionView(R.layout.menu_item_kingfisher_text_view);

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

您可以使用文本视图并避免出现全大写的文本,这样就可以按照想要的方式进行处理。虽然这不是理想的解决方案,但如果您需要解决此问题的方法,这确实有效。


0

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

在项目中: 创建弹出主题并将其应用于某些自定义弹出窗口的创建,如果计划在整个应用程序中使用此外观,则将其放置在主应用程序主题中。
<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);
...

0

将主题添加到工具栏并使用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>

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