amarkovits
amarkovits

Reputation: 776

Add a fragment to FrameLayout and hide the fragment below

Situation:

I have an activity with a FrameLayout in which I change fragments. I use:

getSupportFragmentManager().beginTransaction() .replace(R.id.content, fragment) .addToBackStack("name") .commit)

All works fine the problem is when I go back in the stack the previous fragment is reloaded and all the data is lost.

Possible solution:

Question:

How can i use '.add(R.id.content,fragment)' and somehow hide the fragment below it so it won't overlay and I can go back to the previous fragment in the state I left it.

Upvotes: 0

Views: 1667

Answers (2)

yasser karimi
yasser karimi

Reputation: 329

for save data
you can use Activity when replacing fragments, activity is live .

        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);

    }

second fragment:

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

    }

Upvotes: 0

DeeV
DeeV

Reputation: 36045

First I would say that there's no need to add the fragment to the backstack if you don't want the user to go back to a previous fragment.

To answer the other question, the FragmentManager has a "hide" method that you can use to keep a fragment in the FragmentManager, but hide it from the user. Then use "show" to reveal it again.

final Fragment oldFragment = methodToGetFragment();
getSupportFragmentManager().beginTransaction()
    .add(R.id.content, fragment)
    .hide(oldFragment)
    .addToBackStack("name")
    .commit)

Like stated in the first sentence, the Fragment is going to be popped and the old fragment will be shown when the user presses "back". If you don't want that to happen, then simply remove addToBackStack().

Upvotes: 1

Related Questions