7

我正在尝试根据可见的片段在我的操作栏中显示/隐藏项目。

在我的 MainActivity 我有以下

/* Called whenever invalidateOptionsMenu() is called */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    if(this.myFragment.isVisible()){
        menu.findItem(R.id.action_read).setVisible(true);
    }else{
        menu.findItem(R.id.action_read).setVisible(false);
    }

    return super.onPrepareOptionsMenu(menu);
} 

这很好用,但是当设备旋转时会出现问题。旋转完成后,再次调用 onPrepareOptionsMenu 但是这次this.myFragment.isVisible() 返回 false ...因此当片段清晰可见时菜单项被隐藏(就屏幕上显示的内容而言)。

4

3 回答 3

25

根据Fragments API Guide,我们可以通过以下步骤在每个 Fragment 的基础上将项目添加到操作栏: 创建一个res/menu/fooFragmentMenu.xml包含菜单项的菜单项,就像您通常为标准菜单所做的那样。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/newAction"
        android:orderInCategory="1"
        android:showAsAction="always"
        android:title="@string/newActionTitle"
        android:icon="@drawable/newActionIcon"/>
</menu>

在 FooFragment 的 onCreate 方法的顶部,表明它有自己的菜单项要添加。

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

覆盖 onCreateOptionsMenu,您将在其中扩充片段的菜单并将其附加到您的标准菜单。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fooFragmentMenu, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

在您的片段中覆盖 onOptionItemSelected,仅当宿主 Activity/FragmentActivity 的相同方法发现它没有选择案例时才会调用它。

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case R.id.newAction:
            ...
            break;
    }
    return super.onOptionsItemSelected(item);
}
于 2013-08-14T05:19:15.690 回答
0

setRetainInstance(true);当您的片段附加到活动时,请尝试使用片段。这样,您的片段将保留其当前值并在设备旋转时调用生命周期。

于 2013-08-14T05:09:00.413 回答
-3

编辑:这是一个快速而肮脏的修复,请参阅下面的es0329 的答案以获得更好的解决方案。

尝试将此属性添加到您activity的 android 清单中的标记中:

android:configChanges="orientation|screenSize"
于 2013-08-14T04:07:19.613 回答