隐藏PreferenceFragment上的选项菜单

时间:2015-08-05 23:59:58

标签: android android-fragments android-optionsmenu

我有一个包含多个片段的应用。

只有A片段有一个选项菜单。 可以从片段B(其扩展了listfragment)启动片段。

所以B片段没有选项菜单,如果我从中选择一个项目,片段A将通过选项菜单启动,如果返回,片段B仍然没有选项菜单。

问题是,如果我从导航抽屉中选择“设置”菜单(扩展首选项碎片),而当前窗口是片段A,则会显示设置片段,其中包含片段A中的选项菜单。但是,如果我从导航抽屉中选择“设置”菜单我当前的窗口是片段B,C,D(没有选项菜单)一切正常。

片段A:

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

    inflater.inflate(R.menu.menu_station, menu);
}

设置片段:

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

    setHasOptionsMenu(true);

    sharedPreferenceSettings = new SharedPreferenceSettings(getActivity());

    addPreferencesFromResource(R.xml.settings);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_settings, container, false);
}

问题出在哪里?

修改

经过数小时的调试后,我找到了解决方案。问题是片段事务的fragmentManager不同。对于设置片段,我使用了getSupportFragmentManager(),对于其他人 - fragmentManager()。这会导致一些片段移动到后栈。

2 个答案:

答案 0 :(得分:5)

我看到两个代码嫌疑人。 片段A的代码建议:

2015-08-12 14:00:00      2015-08-12 16:00:00
2015-08-19 14:00:00      2015-08-19 16:00:00 
2015-08-26 14:00:00      2015-08-26 16:00:00  

注意:

    在充气后,
  • @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_station, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); ... } 通常被调用。这没有很好的记录,所以我不确定有什么区别。许多人认为最佳答案的相关SO帖子是@ Android Options Menu in Fragment
  • super.onCreateOptionsMenu()在相同的片段中完成而不是设置片段。片段保存自己的数据和状态。您无法轻易修改片段之间的状态。

答案 1 :(得分:3)

从阅读您的帖子,我认为您应该使用临时片段布局替换为所需的片段。 代码建议:

FragmentManager fragManager = this.getSupportFragmentManager();

MyFragment myFragment = MyFragment.newInstance();
FragmentTransaction fragmentTransaction = fragManager.beginTransaction();

FragmentTransaction transaction = this.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.sample_content_fragment, myFragment, "MyFrag");
transaction.addToBackStack(null);       // support the Back key
transaction.commit();

布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/sample_main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
...
    <FrameLayout
          android:id="@+id/sample_content_fragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
        />
...
</LinearLayout>

注意:

  • 临时片段布局称为sample_content_fragment。这是维护一个片段堆栈的父容器。
  • 此技术仅使用一个片段堆栈来管理而不是多个堆栈。