将一个片段添加到FrameLayout并隐藏下面的片段

时间:2015-08-07 15:08:22

标签: android fragment

情况:

我有一个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>

2 个答案:

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

    }