gpt4 book ai didi

android - ActionBar 容量/溢出不会随方向变化而变化

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:55:46 27 4
gpt4 key购买 nike

我有一个使用 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>

在启动时,这可以正常工作:

景观: wide ActionBar with all items in

肖像: narrow ActionBar with overflow(是的,我可以强制所有项目始终显示并且它们会适合,如下所示,但这可能会在较小的平板电脑上损坏)

当模拟器改变方向时,ActionBar 的容量似乎没有改变:

纵向,当我开始横向时: narrow ActionBar with all items in(这没问题,但不一致)

横向,当我开始纵向时: wide ActionBar with overflow这看起来真的很傻,这就是我要解决这个问题的原因。

我将此电话添加到 invalidateOptionsMenu() , 但它没有帮助:

@Override
public void onConfigurationChanged(Configuration newConfig)
{
maybeMoveSomeViewsAround(newConfig);
super.onConfigurationChanged(newConfig);
invalidateOptionsMenu();
}

(实际上我是为了向后兼容而通过反射来调用它,但是调试器告诉我它确实被调用了并且没有遇到异常。)

invalidateOptionsMenu() 实际上最终会在返回之前调用 onCreateOptionsMenu()(它重新扩充菜单),我可以在后者内部看到 getResources().getConfiguration().orientation 已经改变。所以这真的很令人费解。如果重新创建选项菜单,当方向发生变化时,一定是 ActionBar 本身缓存了宽度?

有没有办法在不破坏/创建 Activity 的情况下重新创建 ActionBar?(因为后者在我的情况下有点贵)

编辑:这是一个minimal sample project显示问题。

编辑 2: 我曾想过检查屏幕宽度并以编程方式适本地调整 always 和 never 之间的 showAsAction 标志,但这需要知道(或猜测)每个项目的宽度。 ActionBar's public API在这一点上对我没有帮助。

最佳答案

我遇到了这个问题并想出了一个 100% 有效的 hack。

我最后调用了两次 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();

}

然后在您的 onCreateOptionsMenu() 中将此设置在您要显示的菜单项上:

item.setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT | (hackActionBarReset ? MenuItem.SHOW_AS_ACTION_NEVER : MenuItem.SHOW_AS_ACTION_IF_ROOM));

不是一个很好的解决方案,但它有效。

关于android - ActionBar 容量/溢出不会随方向变化而变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7625964/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com