方向更改后出现ActionItem

时间:2015-02-26 11:36:22

标签: android android-fragments android-actionbar

我遇到了很多奇怪的问题,我已经和他打了好几天了。我有两个片段AB

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

可能是什么原因?

同样有趣的是,ActionItem正在名为Looper标准 java类中恢复。它在那里“循环”几次然后恢复ActionItem


现在的代码。这就是我如何在代表片段导航的活动中创建它:

@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>

最后我如何在片段ActionItem B中隐藏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);
    }
}

3 个答案:

答案 0 :(得分:1)

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

此外,fragments' lifecycle与其主持人(活动)密切相关。

从我可以看到,您似乎隐藏了片段A B方法中的片段onCreate()。尝试在片段的生命周期方法中添加Log.d (Tag, String)方法,以查看何时调用它们。

答案 1 :(得分:1)

片段内部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);
}

现在您不需要处理活动中的菜单项。

希望这会对你有所帮助。

答案 2 :(得分:0)

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

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

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