android – Viewpager的内容在轮换时丢失了

前端之家收集整理的这篇文章主要介绍了android – Viewpager的内容在轮换时丢失了前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个项目,它有一个MainActivity,它托管一个片段,通过Viewpager托管另外两个片段.它在首次启动时看起来很好,但是当我旋转时,Viewpager中的两个片段都会丢失.我已经尝试将getFragmentManager更改为getChildFragmentManager,但我会得到一个非法状态异常:无法保留嵌套在其他片段中的fragements.

MainActivity.java

  1. import android.app.ActionBar;
  2. import android.os.Bundle;
  3. import android.view.MenuItem;
  4. import android.widget.ArrayAdapter;
  5. import android.widget.ListView;
  6.  
  7. import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
  8. import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;
  9.  
  10. public class MainActivity extends SlidingFragmentActivity {
  11. @TargetApi(11)
  12. @Override
  13. public void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15.  
  16. setContentView(R.layout.activity_main);
  17. getSupportFragmentManager()
  18. .beginTransaction()
  19. .replace(R.id.mainContentFrame,new WorkOutsContainerFrag())
  20. .commit();
  21.  
  22.  
  23. setBehindContentView(R.layout.menu);
  24.  
  25. ActionBar actionBar = getActionBar();
  26.  
  27. populate();
  28.  
  29. SlidingMenu menu = getSlidingMenu();
  30.  
  31. menu.setMode(SlidingMenu.LEFT);
  32. menu.setShadowWidthRes(R.dimen.shadow_width);
  33. menu.setShadowDrawable(R.drawable.shadow);
  34. menu.setBehindWidthRes(R.dimen.slidingmenu_offset);
  35. menu.setFadeDegree(0.35f);
  36. menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
  37. menu.setSlidingEnabled(false);
  38. setSlidingActionBarEnabled(true);
  39.  
  40. actionBar.setDisplayHomeAsUpEnabled(true);
  41.  
  42.  
  43.  
  44. }
  45.  
  46.  
  47. @Override
  48. public boolean onOptionsItemSelected(MenuItem item) {
  49. switch (item.getItemId()) {
  50. case android.R.id.home:
  51. toggle();
  52. return true;
  53. default:
  54. return super.onOptionsItemSelected(item);
  55. }
  56. }
  57.  
  58. private void populate() {
  59.  
  60. ListView lv = (ListView) findViewById(R.id.listView1);
  61. String[] values = new String[] { "Workouts","Information","Ladders"};
  62. ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,android.R.id.text1,values);
  63. lv.setAdapter(adapter);
  64.  
  65.  
  66. }

}

WorkoutsContainerFrag.java:

  1. import android.os.Bundle;
  2. import android.support.v4.app.Fragment;
  3. import android.support.v4.app.FragmentManager;
  4. import android.support.v4.app.FragmentPagerAdapter;
  5. import android.support.v4.view.ViewPager;
  6. import android.util.TypedValue;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10.  
  11. import com.astuetz.PagerSlidingTabStrip;
  12.  
  13. public class WorkOutsContainerFrag extends Fragment {
  14.  
  15. private PagerSlidingTabStrip tabs;
  16. private ViewPager pager;
  17. private WorkoutsPagerAdapter adapter;
  18.  
  19. @Override
  20. public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
  21. View view = inflater.inflate(R.layout.workoutscontainer,container,false);
  22.  
  23. setRetainInstance(true);
  24.  
  25. tabs = (PagerSlidingTabStrip) view.findViewById(R.id.workoutstabs);
  26. pager = (ViewPager) view.findViewById(R.id.workoutspager);
  27. adapter = new WorkoutsPagerAdapter(getFragmentManager());
  28.  
  29. pager.setAdapter(adapter);
  30.  
  31. final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,4,getResources()
  32. .getDisplayMetrics());
  33. pager.setPageMargin(pageMargin);
  34.  
  35. tabs.setViewPager(pager);
  36.  
  37. return view;

}

  1. private GymWorkoutsFragment gymWorkoutsFragment;
  2. private OCWorkoutsFragment ocWorkoutsFragment;
  3.  
  4. public class WorkoutsPagerAdapter extends FragmentPagerAdapter {
  5.  
  6. private final String[] TITLES = {"Gym Workouts","OC Workouts"};
  7.  
  8. public WorkoutsPagerAdapter(FragmentManager fm) {
  9. super(fm);
  10. }
  11.  
  12.  
  13. @Override
  14. public CharSequence getPageTitle(int position) {
  15. return TITLES[position];
  16. }
  17.  
  18. @Override
  19. public int getCount() {
  20. return TITLES.length;
  21. }
  22.  
  23. @Override
  24. public Fragment getItem(int position) {
  25. switch (position) {
  26. case 0:
  27. gymWorkoutsFragment = new GymWorkoutsFragment();
  28. return (Fragment)gymWorkoutsFragment;
  29.  
  30. case 1:
  31. ocWorkoutsFragment = new OCWorkoutsFragment();
  32. return (Fragment)ocWorkoutsFragment;
  33.  
  34. }
  35. return null;
  36. }

}
}

解决方法

答案实际上非常简单,就是用FragmentStatePagerAdapter替换FragmentPagerAdapter

猜你在找的Android相关文章