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

Jas*_*son 7 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);
} 
Run Code Online (Sandbox Code Playgroud)

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

es0*_*329 25

基于片段API指南,我们可以基于每个片段将操作栏添加到操作栏,步骤如下:创建一个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>
Run Code Online (Sandbox Code Playgroud)

在FooFragment的onCreate方法的顶部,指示它有自己的菜单项要添加.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    ...
}
Run Code Online (Sandbox Code Playgroud)

覆盖onCreateOptionsMenu,您将在其中夸大片段的菜单并将其附加到标准菜单.

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

覆盖片段中的onOptionItemSelected,只有当主机Activity/FragmentActivity的相同方法看到它没有选择的大小写时,才会调用它.

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case R.id.newAction:
            ...
            break;
    }
    return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)


小智 -3

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

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

android:configChanges="orientation|screenSize"
Run Code Online (Sandbox Code Playgroud)

  • 我想知道 Android 开发者是否能够放弃这个约定。这里发布的另一个解决方案要好得多。 (2认同)