我有一个使用ActionBar的应用程序,在其中我自己处理方向变化:
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
在横屏时,菜单应适合于操作栏(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>
在启动时,它可以正常工作:
横屏:
竖屏:
(是的,我可以强制显示所有项目并且它们会适合屏幕,但是可能会在较小的平板电脑上出问题)
当模拟器更改方向时,ActionBar的容量似乎并没有改变:
竖屏,在我开始时是横屏:
(这是可以接受的,但不一致)
横屏,在我开始时是竖屏:
这看起来非常傻,这也是我想要修复此问题的原因。
我添加了这个调用invalidateOptionsMenu(),但它没有什么帮助:
@Override
public void onConfigurationChanged(Configuration newConfig)
{
maybeMoveSomeViewsAround(newConfig);
super.onConfigurationChanged(newConfig);
invalidateOptionsMenu();
}
实际上我通过反射来调用它以保持向后兼容性,但调试器告诉我它真正被调用并且没有遇到异常。
invalidateOptionsMenu() 在返回之前实际上会调用onCreateOptionsMenu()(重新填充菜单),我可以在后者内部看到getResources().getConfiguration().orientation已经发生了变化。所以这真的很令人困惑。如果选项菜单正在重新创建,并且方向已更改,则必须是ActionBar本身缓存了宽度吗?
有没有一种方法可以重新创建ActionBar而不销毁/创建Activity? (因为在我的情况下后者有点昂贵)
编辑:这里是一个显示问题的最小示例项目。
编辑2:我考虑过检查屏幕宽度,并在始终和从不之间适当地以编程方式调整showAsAction标志,但这需要知道(或猜测)每个项的宽度。ActionBar的公共API在这一点上对我没有帮助。