在PreferenceFragment上隐藏选项菜单

我有一个有几个片段的应用程序。

只有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); } 

哪里有问题?

编辑:

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

我看到两个代码嫌疑人。 片段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); ... } 

笔记:

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

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

 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(); 

布局中

  ...  ...  

笔记:

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