情况:
我有一个FrameLayout活动,我在其中更改了片段。 我用:
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)'并以某种方式隐藏它下面的片段,这样它就不会叠加,我可以回到我离开它的状态中的前一个片段。 / p>
答案 0 :(得分:2)
首先我要说的是,如果您不希望用户返回到之前的片段,则无需将片段添加到Backstack。
为了回答另一个问题,FragmentManager有一个" hide"可用于在FragmentManager中保留片段但将其隐藏在用户之外的方法。然后使用" show"再次透露它。
final Fragment oldFragment = methodToGetFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.content, fragment)
.hide(oldFragment)
.addToBackStack("name")
.commit)
如第一句中所述,片段将被弹出,当用户按下"返回"时将显示旧片段。如果您不希望这种情况发生,那么只需删除addToBackStack()
即可。
答案 1 :(得分:0)
用于保存数据
你可以在替换片段时使用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();
}