Java 安卓碎片不能保存它们的状态
我正在尝试创建自定义选项卡导航。单击每个选项卡,它将替换屏幕中的片段。在MainActivity.java上,我创建每个片段的一个副本(我认为,通过这种方式,我可以在任何地方使用每个片段的一个副本) 单击tab按钮时,它将旧片段替换为当前片段(handleClickmethod) WhereRootFragment:Java 安卓碎片不能保存它们的状态,java,android,android-fragments,Java,Android,Android Fragments,我正在尝试创建自定义选项卡导航。单击每个选项卡,它将替换屏幕中的片段。在MainActivity.java上,我创建每个片段的一个副本(我认为,通过这种方式,我可以在任何地方使用每个片段的一个副本) 单击tab按钮时,它将旧片段替换为当前片段(handleClickmethod) WhereRootFragment: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, B
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* Inflate the layout for this fragment */
View view = inflater.inflate(R.layout.fragment_where_root, container, false);
FragmentTransaction transaction = getFragmentManager()
.beginTransaction();
transaction.replace(R.id.where_root_frame, MainActivity.whereMainFragment);
transaction.addToBackStack(null);
transaction.commit();
return view;
}
wheremain片段
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_where_main,
container, false);
return rootView;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* Inflate the layout for this fragment */
View view = inflater.inflate(R.layout.fragment_where_root, container, false);
// Use child fragment manager to manage WhereMainFragment
FragmentTransaction transaction = getChildFragmentManager()
.beginTransaction();
transaction.replace(R.id.where_root_frame, MainActivity.whereMainFragment);
transaction.addToBackStack(null);
transaction.commit();
return view;
}
结果:
[StartApp]->[1.其中:显示]->[2.提要:显示]->[3.其中:未显示]->[4.提要:显示已保存状态]->[5.另一个片段:按假设为空]->[6.提要:未显示]
问题:如何解决这个问题?如何使片段保存其状态?有些链接可能对您有用: ->你可能不得不使用 -> ->你可能想要这个 ->最好的
其中rootfragment
由属于活动的片段管理器管理。之所以出现此问题,是因为使用了相同的片段管理器来管理WhereMainFragment
,它是WhereRootFragment
的子级
WhereMainFragment
应由属于WhereRootFragment
的片段管理器管理。要在片段中获取子片段管理器,请使用
WhereRootFragment
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_where_main,
container, false);
return rootView;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* Inflate the layout for this fragment */
View view = inflater.inflate(R.layout.fragment_where_root, container, false);
// Use child fragment manager to manage WhereMainFragment
FragmentTransaction transaction = getChildFragmentManager()
.beginTransaction();
transaction.replace(R.id.where_root_frame, MainActivity.whereMainFragment);
transaction.addToBackStack(null);
transaction.commit();
return view;
}
这正是您想要删除的
transaction\u feed.addToBackStack(null)
来自onClick事件。@PratikButani,我已经按照你所说的做了尝试,但在WhereRootFragment
而不是getFragmentManager
使用getChildFragmentManager时没有帮助,因为WhereMainFragment`是WhereRootFragment
的孩子。谢谢你的回答,但这种方式不适合我。因为每个片段将包含许多视图,在其他片段中。有没有办法在不恢复每个视图状态的情况下自动处理此问题?
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* Inflate the layout for this fragment */
View view = inflater.inflate(R.layout.fragment_where_root, container, false);
// Use child fragment manager to manage WhereMainFragment
FragmentTransaction transaction = getChildFragmentManager()
.beginTransaction();
transaction.replace(R.id.where_root_frame, MainActivity.whereMainFragment);
transaction.addToBackStack(null);
transaction.commit();
return view;
}