有一个ActionBar在每个Android 4.0的应用程序,它得到了一个称号.我需要减小这个尺寸.但我不明白我是怎么做到的,因为ActionBar它没有为它提供公共方法.备注:我不想使用自定义视图.
我有一个使用ActionBar的应用程序,我自己处理方向更改:
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
Run Code Online (Sandbox Code Playgroud)
...并且菜单应该适合ActionBar而不会在横向上溢出,但不能在纵向中溢出:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="@string/Game" android:id="@+id/game" android:icon="@android:drawable/ic_menu_manage" android:showAsAction="ifRoom|withText"/>
<item android:title="@string/Type" android:id="@+id/type" android:icon="@android:drawable/ic_menu_edit" android:showAsAction="ifRoom|withText"/>
<item android:title="@string/Other" android:id="@+id/other" android:icon="@android:drawable/ic_menu_gallery" android:showAsAction="ifRoom|withText"/>
<item android:title="@string/Solve" android:id="@+id/solve" android:icon="@android:drawable/ic_menu_directions" android:showAsAction="ifRoom|withText"/>
<item android:title="@string/Help" android:id="@+id/help" android:icon="@android:drawable/ic_menu_help" android:showAsAction="ifRoom"/>
</menu>
Run Code Online (Sandbox Code Playgroud)
在启动时,这可以正常工作:
景观:

肖像:
(是的,我可以强制所有项目始终显示并且它们适合,如下所示,但可能会在较小的平板电脑上打破)
当模拟器更改方向时,ActionBar的容量似乎没有变化:
肖像,当我开始在风景中:
(这没关系,但不一致)
风景,当我开始画像时:
这看起来很傻,这也是我想解决这个问题的原因.
我将此调用添加到invalidateOptionsMenu(),但它没有帮助:
@Override
public void onConfigurationChanged(Configuration newConfig)
{
maybeMoveSomeViewsAround(newConfig);
super.onConfigurationChanged(newConfig);
invalidateOptionsMenu();
}
Run Code Online (Sandbox Code Playgroud)
(实际上我通过反射来调用它以实现向后兼容性,但调试器告诉我它确实被调用并且没有遇到异常.)
invalidateOptionsMenu()实际上最终在返回之前调用onCreateOptionsMenu()(它重新膨胀菜单),我可以在后面看到getResources().getConfiguration().orientation已经改变了.所以这真的令人费解.如果正在重新创建选项菜单,当方向已更改时,它必须是ActionBar本身缓存宽度?
有没有办法在不破坏/创建活动的情况下重新创建ActionBar?(因为后者在我的情况下有点贵)
编辑:这是一个显示问题的最小示例项目.
编辑2:我曾想过检查屏幕宽度并以编程方式调整始终和从不适当之间的showAsAction标志,但这需要知道(或猜测)每个项目的宽度.ActionBar的公共API在这一点上对我没有帮助.
有没有办法改变ActionBar标题和副标题的大小/颜色?
我正在使用ActionBarSherlock来桥接较低版本和更高版本.ActionBarSherlock提供了在SherlockActionBarCompat中自定义文本样式的方法,但似乎没有办法在SherlockActionBarNative中创建它.
编辑: 由杰克添加并由作者删除
编辑: 关闭解决方案:
<style name="resizeableTitleStyle" parent="TextAppearance.Sherlock.Widget.ActionBar.Title.Inverse">
<item name="android:textSize">@dimen/action_bar_title_text_size</item>
</style>
<style name="Theme.ResizeableActionBar" parent="Theme.Sherlock.Light.DarkActionBar">
<item name="actionBarStyle">@style/resizeableActionBarStyle</item>
<item name="android:actionBarStyle">@style/resizeableActionBarStyle</item>
<item name="actionBarSize">60dp</item>
<item name="android:actionBarSize">60dp</item>
</style>
<style name="resizeableActionBarStyle" parent="@style/Widget.Sherlock.Light.ActionBar.Solid.Inverse">
<item name="titleTextStyle">@style/resizeableTitleStyle</item>
<item name="android:titleTextStyle">@style/resizeableTitleStyle</item>
</style>
Run Code Online (Sandbox Code Playgroud)
感谢ABS的作者Jake的帮助.
现在几乎完成了,除了只能通过相当多的试验估算actionBarSize的近似绝对尺寸(我的应用程序为60dp); wrap_content导致API2.2扩展整个屏幕,并在解析xml时抛出API4.2.2异常.
另外:
当actionBarSize设置为0dp时,输出为(http://i.stack.imgur.com/xX4E1.png,低信誉直接在此处发布图像):左侧的API2.2,操作栏占用整个屏幕没有内容,API4.2.2在右边,内容没有动作栏.
当设置为wrap_content时,API2.2的输出相同,并抛出异常:引起:java.lang.UnsupportedOperationException:无法转换为维度:type = 0x10