隐藏PreferenceFragment上的选项菜单

bur*_*ius 9 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);
}
Run Code Online (Sandbox Code Playgroud)

设置片段:

@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);
}
Run Code Online (Sandbox Code Playgroud)

问题出在哪儿?

编辑:

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

The*_*oid 6

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

@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);
...
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • super.onCreateOptionsMenu()正常地充气之后被调用.这没有很好的记录,所以我不确定有什么区别.许多人认为最佳答案的相关SO帖子是Fragment中的@Android Options菜单.
  • setHasOptionsMenu(true)是在相同的片段而不是设置片段中完成的.片段保存自己的数据和状态.您无法轻松修改片段之间的状态.