刷新菜单项onConfigurationChanged

时间:2015-06-24 17:05:41

标签: android android-actionbar

我正在使用支持库。在操作栏中,我有一个巨大的徽标(宽度= 320),searchView和一些菜单项(如收藏夹等)。 此外,我的活动使用onConfigurationChanged。

问题如下: 旋转设备后,ActionMenuView不会重新计算其宽度。它使用与之前方向相同的空间。

因此,如果我在protrait模式下启动活动,并且ActionMenuView的宽度为250px,它在横向模式下也将占据250px的宽度。

如果我在横向模式下开始活动而ActionMenuView的宽度为450px,那么它在纵向模式下也将占据450px宽度!

这里有3个问题,与此问题有关。

  1. 带有" asRoom"的menuItem数量参数不取决于当前方向,而是取决于活动的开始方向。如果在溢出菜单中隐藏3个项目,并且从活动开始可见2个项目,则旋转后它们将是相同的。但是如果我们从另一个方向开始活动,我们将从开始获得另外数量的隐藏menuItem,并且在我们重新创建此活动之前,这个数字不会改变。
  2. 如果我们使用ActionBar.setHomeAsUpIndicator自定义主页按钮,ActionMenuView不会理解它应该占用多少空间。如果我们以横向模式开始活动 - ActionMenuView占用了大量空间。在我们旋转设备后 - 它会尝试将自己拉出屏幕。
  3. 不同的徽标大小。如果我们从肖像开始,ActionMenuView确实理解它没有那么多的地方。占地面积小,即使旋转后标识也有正常尺寸。但是如果我们从景观开始,ActionMenuView占用了大量的空间。它仍然试图在旋转后获得相同的面积。这就是为什么徽标的尺寸减小了。
  4. 我如何向ActionMenuView解释它应该在旋转后重新计算其有限的宽度?

    感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我通过以下方法找到了我的问题的答案:

在OnConfigurationChanged方法中,按以下方式重新创建菜单

ActionMenuPresenter presenter = new ActionMenuPresenter(getActivity());
MenuBuilder menuBuilder = new MenuBuilder(getActivity());
menuBuilder.setCallback(new Callback() {
    @Override
    public void onMenuModeChange(MenuBuilder arg0) {
    }
    @Override
    public boolean onMenuItemSelected(MenuBuilder arg0, MenuItem arg1) {
        onOptionsItemSelected(arg1);
        return false;
    }
});
toolbar.setMenu(menuBuilder, presenter);

但是,当我们使用自定义Menu对象时 - 它会丢失样式。我使用AppCompat.Dark.NoActionBar主题,但在旋转设备并重新创建菜单后,我的溢出菜单按钮和搜索小部件文本变为黑色(而不是白色)。

我通过在xml文件中自定义搜索小部件来修复它,其中白色图标用于搜索和清除,以编程方式将textColor + hintTextColor设置为白色,并为我的溢出菜单按钮声明以下样式:

<style name="Base.Widget.AppCompat.ActionButton.Overflow">
    <item name="android:tint">#FFF</item>
</style>