根据片段更改操作栏菜单状态

时间:2013-08-14 03:29:56

标签: android

我正在尝试显示/隐藏操作栏中的项目,具体取决于哪些片段可见。

在我的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 ...因此当片段清晰可见时隐藏菜单项(至于显示的是什么)在屏幕上。)

3 个答案:

答案 0 :(得分:25)

根据Fragments API Guide,我们可以基于每个片段向操作栏添加项目,步骤如下: 创建一个包含菜单项的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);
}

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

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

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

android:configChanges="orientation|screenSize"