在 FrameLayout 中添加一个 fragment 并隐藏下面的 fragment
Add a fragment to FrameLayout and hide the fragment below
情况:
我有一个带有 FrameLayout 的 activity,我可以在其中更改片段。
我使用:
getSupportFragmentManager().beginTransaction()
.replace(R.id.content, fragment)
.addToBackStack("name")
.commit)
一切正常,问题是当我返回堆栈时,前一个片段被重新加载,所有数据都丢失了。
可能的解决方案:
- 恢复片段状态 - 我想避免这种情况,因为大部分数据都是从服务器检索的,这会花费很多时间
- 使用
.add(R.id.content, fragment)
而不是 .add(R.id.content, fragment)
但在这种情况下,我的片段必须具有纯色背景,否则它们会相互重叠。问题是由于某些设计限制,我无法设置坚实的背景。
问题:
我如何使用“.add(R.id.content,fragment)”并以某种方式隐藏它下面的片段,这样它就不会覆盖,我可以回到我离开它时的前一个片段.
首先我要说的是,如果您不希望用户返回到上一个片段,则无需将片段添加到后台堆栈。
为了回答另一个问题,FragmentManager 有一个 "hide" 方法,您可以使用该方法将片段保留在 FragmentManager 中,但对用户隐藏它。然后用"show"再次显示出来
final Fragment oldFragment = methodToGetFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.content, fragment)
.hide(oldFragment)
.addToBackStack("name")
.commit)
如第一句所述,将弹出片段,并在用户按下 "back" 时显示旧片段。如果您不希望这种情况发生,只需删除 addToBackStack()
。
用于保存数据
您可以在替换片段时使用 Activity,activity 是实时的。
public class MotherActivity extends ActionBarActivity {
private Data data = null;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_adv);
Fragment oldFragment = methodToGetFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.content, fragment)
.hide(oldFragment)
.addToBackStack("name")
.commit)
}
public void setData(Data data){
....
}
public void getData(){
....}
}
public class FirstFragment extends Fragment {
private AdvActivity act;
......
public void onAttach(Activity activity) {
super.onAttach(activity);
// get data from internet
Data data=getData();
// and save data in mother activity
activity.setData(data);
}
第二个片段:
public class SecondFragment extends Fragment {
private AdvActivity act;
private Data data;
......
public void onAttach(Activity activity) {
super.onAttach(activity);
// get data from mother activity
data=activity.getData();
}
情况:
我有一个带有 FrameLayout 的 activity,我可以在其中更改片段。 我使用:
getSupportFragmentManager().beginTransaction()
.replace(R.id.content, fragment)
.addToBackStack("name")
.commit)
一切正常,问题是当我返回堆栈时,前一个片段被重新加载,所有数据都丢失了。
可能的解决方案:
- 恢复片段状态 - 我想避免这种情况,因为大部分数据都是从服务器检索的,这会花费很多时间
- 使用
.add(R.id.content, fragment)
而不是.add(R.id.content, fragment)
但在这种情况下,我的片段必须具有纯色背景,否则它们会相互重叠。问题是由于某些设计限制,我无法设置坚实的背景。
问题:
我如何使用“.add(R.id.content,fragment)”并以某种方式隐藏它下面的片段,这样它就不会覆盖,我可以回到我离开它时的前一个片段.
首先我要说的是,如果您不希望用户返回到上一个片段,则无需将片段添加到后台堆栈。
为了回答另一个问题,FragmentManager 有一个 "hide" 方法,您可以使用该方法将片段保留在 FragmentManager 中,但对用户隐藏它。然后用"show"再次显示出来
final Fragment oldFragment = methodToGetFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.content, fragment)
.hide(oldFragment)
.addToBackStack("name")
.commit)
如第一句所述,将弹出片段,并在用户按下 "back" 时显示旧片段。如果您不希望这种情况发生,只需删除 addToBackStack()
。
用于保存数据
您可以在替换片段时使用 Activity,activity 是实时的。
public class MotherActivity extends ActionBarActivity {
private Data data = null;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_adv);
Fragment oldFragment = methodToGetFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.content, fragment)
.hide(oldFragment)
.addToBackStack("name")
.commit)
}
public void setData(Data data){
....
}
public void getData(){
....}
}
public class FirstFragment extends Fragment {
private AdvActivity act;
......
public void onAttach(Activity activity) {
super.onAttach(activity);
// get data from internet
Data data=getData();
// and save data in mother activity
activity.setData(data);
}
第二个片段:
public class SecondFragment extends Fragment {
private AdvActivity act;
private Data data;
......
public void onAttach(Activity activity) {
super.onAttach(activity);
// get data from mother activity
data=activity.getData();
}