方向更改后出现 ActionItem

ActionItem appears after orientation change

我遇到了一个很奇怪的问题,我已经为此奋斗了好几天。我有两个片段 AB

虽然 A 可见,但我 ActionItem 可见。在用 B 替换片段 A 时,我隐藏了 ActionItem,它们是 onCreate() 中数据的过滤器(也在 onConfigurationChanged() 中尝试过)。它确实隐藏了。但是当方向变为横向时,此 ActionItem 会在操作栏中恢复。

可能是什么原因?

另一个有趣的事实是 ActionItem 正在 标准 java class 中恢复,称为 Looper。它在那里 "loops" 几次然后恢复 ActionItem


现在是代码。这就是我在代表片段导航的 activity 中创建它的方式:

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    getMenuInflater().inflate(R.menu.global_filters, menu);
    this.menu = menu;
    invalidateOptionsMenu();
    return super.onCreateOptionsMenu(this.menu);
}

global_filters.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".NavigationActivity">

<item android:id="@+id/action_filters"
    android:title="Filters"
    android:icon="@drawable/ic_filter_white"
    android:orderInCategory="100"
    app:showAsAction="ifRoom" />
</menu>

过滤器项目已添加到 onOptionsItemSelected(MenuItem item):

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   int id = item.getItemId();

   switch (id) {
        case R.id.action_filters:
            menuItemView = findViewById(R.id.action_filters); // SAME ID AS MENU ID
            popupMenu = new PopupMenu(this, menuItemView);
            //if logined - show user. Else guest
            if (state) {
                popupMenu.inflate(R.menu.popup_filters_user);
            } else {
                popupMenu.inflate(R.menu.popup_filters_guest);
            }
//....
}

popup_filters_user.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
    android:id="@+id/filter_purchased_user"
    android:title="Purchased"/>
<item
    android:id="@+id/filter_price_user"
    android:title="Price"/>
<item
    android:id="@+id/filter_author_user"
    android:title="Author"/>
<item
    android:id="@+id/filter_difficulty_user"
    android:title="Difficulty"/>
</menu>

最后是我如何在 Fragment 的 B 中隐藏 ActionItem onCreate():

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //....other logic

    //hide action Item
    View menuItemView = getActivity().findViewById(R.id.action_filters);
    if (menuItemView != null) {
        menuItemView.setVisibility(View.GONE);
    }
}

请记住,当方向改变时,整个 activity 都会重新绘制(即生命周期方法的连续回调)。

此外,fragments' lifecycle 与其宿主(activity)密切相关。

据我所知,您似乎将片段 A 隐藏在片段的 B onCreate() 方法中。尝试在片段的生命周期方法中添加 Log.d (Tag, String) 方法以查看何时调用这些方法。

在您的片段内部设置了 onCreate 方法

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

然后通过覆盖

分别为每个片段创建选项菜单
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO Add your menu entries here
    super.onCreateOptionsMenu(menu, inflater);
}

现在您无需处理 activity 中的菜单项。

希望对您有所帮助。

我已经自己解决了。问题是我在修改它的元素后没有保存 actionBar 的状态。

我只需要在每次修改项目后写setRetainInstance(true);

一如既往,解决方案很简单...