简体   繁体   中英

Saving State of Fragment

I have an Activity(Form) with 5 fragments. In my 3rd fragment i have a listview and an image button to get the images from my phone's gallery and put it in the listview. I have no problem with that.

Also, the images attached is staying there in the 3rd fragments listview when I swipe to my 2nd and 4th fragment and go back to my 3rd fragment.

But when i swipe to 1st and 5th fragment and go back to my 3rd fragment, the image attach on my 3rd fragment listview is gone. What could be the problem? Here's my code:

Fragment3:

public class Fragment3 extends Fragment implements OnClickListener {

    ListView lv;
    ArrayList<Uri> array_list = new ArrayList<Uri>();
    ArrayAdapter<Uri> array_adapter;

    final int RQS_LOADIMAGE = 0;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.frag3, container, false);

        ImageButton b = (ImageButton) v.findViewById(R.id.button_ai);
        b.setOnClickListener(this);

        array_adapter = new ArrayAdapter<Uri>(getActivity(), android.R.layout.simple_list_item_1, array_list);
        lv = (ListView) v.findViewById(R.id.list_ai);
        lv.setAdapter(array_adapter);

        return v;
    }

    @Override
    public void onClick(View arg0) {

        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, RQS_LOADIMAGE);
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

      if (requestCode == RQS_LOADIMAGE) {

          if(resultCode == Form.RESULT_OK) {
            Uri imageUri = data.getData();
            array_list.add(imageUri);
            array_adapter.notifyDataSetChanged();
          }
      }
    }

}

ActivityForm:

public class Form extends FragmentActivity {

    ViewPager viewPager = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_form);

        viewPager = (ViewPager) findViewById(R.id.pager);
        FragmentManager fragmentManager = getSupportFragmentManager();
        viewPager.setAdapter(new MyAdapter(fragmentManager));

    }

    public class MyAdapter extends FragmentStatePagerAdapter {

        public MyAdapter (FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int i) {
            Fragment fragment = null;

            if (i == 0)
            {
                fragment = new Fragment1();
            }
            if (i == 1)
            {
                fragment = new Fragment2();
            }
            if (i == 2)
            {
                fragment = new Fragment3();
            }
            if (i == 3)
            {
                fragment = new Fragment4();
            }
            if (i == 4)
            {
                fragment = new Fragment5();
            }
            return fragment;
        }

        @Override
        public int getCount() {
            return 5;
        }
    }

}

View Pager only cache 3 pages left/current/right by default.

you have to change it by adding following line in your code :-

pager.setOffscreenPageLimit(5);  //in your case, you have 5 fragments 

Viepagers only cache 3 pages: current, left and right. If your fragment falls off that list it will be recreated later. Use a FragmentStatePagerAdapter , this should fix your problems.

You can override onSaveInstanceState(Bundle) and save the state of your fragment in the bundle. Also override onViewCreated(View, Bundle) . It will have your saved data in the bundle, which you can use to restore your fragments state.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM