Chr*_*yle 8 android android-layout android-menu android-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在这一点上对我没有帮助.
我遇到了这个问题,并提出了一个100%工作的黑客.
我忙了两次调用invalidateOptionsMenu().看下面的代码:
private boolean hackActionBarReset = false;
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//a hack to reset the items in the action bar.
hackActionBarReset = true;
invalidateOptionsMenu();
hackActionBarReset = false;
invalidateOptionsMenu();
}
Run Code Online (Sandbox Code Playgroud)
在你的onCreateOptionsMenu()中设置你要显示的菜单项:
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT | (hackActionBarReset ? MenuItem.SHOW_AS_ACTION_NEVER : MenuItem.SHOW_AS_ACTION_IF_ROOM));
Run Code Online (Sandbox Code Playgroud)
不是一个漂亮的解决方案但它的工作
归档时间: |
|
查看次数: |
3824 次 |
最近记录: |