【问题标题】:Changing the actionbar menu state depending on fragment根据片段更改操作栏菜单状态
【发布时间】:2014-06-01 23:43:26
【问题描述】:

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

在我的 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 ...因此,当片段清晰可见时,菜单项被隐藏(就显示的内容而言屏幕上)。

【问题讨论】:

  • 不确定,但您是在纵向和横向模式下使用相同的片段,还是在横向模式下也添加一些其他片段?当它重新初始化时旋转时,您确定它已附加到 FragmentActivity。您可以使用 fragment.isAdded() 进行检查?
  • 是的,在我做的活动 onCreate 方法中:this.myFragment = new MyListFragment();然后 this.myFragment 在整个活动中被引用

标签: android


【解决方案1】:

基于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);
}

【讨论】:

  • 那我们如何提供后退/向上按钮导航呢?
  • 可能您是 Google Android 团队成员。太神了!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    android:configChanges="orientation|screenSize"
    

    【讨论】:

    • 我想知道 android 开发者是否能够放弃这个约定。此处发布的其他解决方案要好得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多