我有一个包含多个片段的应用。
只有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()。这会导致一些片段移动到后栈。
答案 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
。这是维护一个片段堆栈的父容器。