with viewpager pageradapter fragments example configchanges android android-fragments android-viewpager fragment screen-orientation

android - pageradapter - Cambio de orientación con viewPager dentro de FragmentActivity



fragments viewpager example (1)

Intente limitar la orientación al retrato o al modo Paisaje. Porque podemos usar la vista del buscapersonas solo en el modo exacto.

Intento crear una aplicación que muestre un libro en modo retrato y paisaje. Entonces, obviamente, hay 1 página mostrada en el retrato y 2 en el paisaje. Cada uno de los modos funciona bastante bien, pero cuando cambio la orientación de vertical a horizontal, viewPager intenta obtener 2 páginas del modo vertical en lugar de intentar obtener 2 páginas dobles desde el modo horizontal ... De hecho, FragmentStatePagerAdapter mantiene los 2 fragmentos creado en vertical y los usa antes de crear 2 páginas dobles para el modo horizontal . Si cambio de nuevo en modo vertical, FragmentStatePagerAdapter usa los 2 fragmentos creados previamente en modo horizontal para volver a ver 1 página doble en lugar de 1 sola página, etc. Si continúo cambiando de orientación, obtengo un OutOfMemoryError debido al hecho de que FragmentStatePagerAdapter nunca enjuague sus fragmentos en el cambio de orientación.

Aquí hay 2 casos de uso para una comprensión más fácil:

  • lanzo ViewPager en modo vertical
  • veo la página 1 de acuerdo
  • deslizo hacia la derecha y veo que la página 2 está bien
  • deslizo hacia la derecha y veo la página 3 de acuerdo
  • giro la pantalla al modo horizontal
  • veo la página 3 mal
  • deslizo hacia la derecha y veo la página 4 mal
  • deslizo hacia la derecha y veo la página 5 y 6 de acuerdo

  • lanzo ViewPager en modo vertical

  • veo la página 1 de acuerdo
  • deslizo hacia la derecha y veo que la página 2 está bien
  • deslizo hacia la derecha y veo la página 3 de acuerdo
  • deslizo hacia la derecha y veo la página 4 de acuerdo
  • deslizo hacia la derecha y veo la página 5 de acuerdo
  • giro la pantalla al modo horizontal
  • veo la página 5 mal
  • deslizo hacia la izquierda y veo la página 4 mal
  • deslizo hacia la izquierda y veo la página 2 y 3 bien

    public class PlayerFragmentActivity extends FragmentActivity { private Intent mIntent; private ViewPager mPortraitPager; private ViewPager mLandscapePager; private Boolean mIsLandscape; private String mKey; private int mNbPages; private int mNbDoublePages; private PageFactory mPageFactory; private DoublePageFactory mDoublePageFactory; private PagerAdapter mPagerAdapter; @Override protected void onStop(){ super.onStop(); mPagerAdapter = null; mDoublePageFactory = null; mPageFactory = null; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_activity_player); mIntent = getIntent(); mKey = mIntent.getStringExtra("key"); mNbPages = mIntent.getIntExtra("nbPages", 0); mNbDoublePages = DoublePageFactory.getDoublePageNumFromPageNum(mNbPages); Resources res = getResources(); mIsLandscape = (res.getConfiguration().orientation == 1) ? false : true; mPortraitPager = (ViewPager) findViewById(R.id.portraitPager); mLandscapePager = (ViewPager) findViewById(R.id.landscapePager); mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager()); if (mIsLandscape) { mDoublePageFactory = new DoublePageFactory(this, mKey, mNbPages, res.getInteger(R.integer.nb_page_columns), res.getInteger(R.integer.nb_page_columns)); mPortraitPager.setVisibility(View.GONE); mLandscapePager.setAdapter(mPagerAdapter); mPortraitPager.setAdapter(null); } else { mPageFactory = new PageFactory(this, mKey, this.mNbPages, res.getInteger(R.integer.nb_page_columns), res.getInteger(R.integer.nb_page_columns)); mLandscapePager.setVisibility(View.GONE); mPortraitPager.setAdapter(mPagerAdapter); mLandscapePager.setAdapter(null); } } public class MyPagerAdapter extends FragmentStatePagerAdapter { public MyPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { Bundle args = new Bundle(); if(mIsLandscape){ Fragment doublePageFragment = new DoublePageFragment(); args.putInt(DoublePageFragment.ARG_DOUBLEPAGE_NUM, position + 1); doublePageFragment.setArguments(args); return doublePageFragment; }else{ Fragment pageFragment = new PageFragment(); args.putInt(PageFragment.ARG_PAGE_NUM, position + 1); pageFragment.setArguments(args); return pageFragment; } } @Override public int getCount() { return (mIsLandscape) ? mNbDoublePages:mNbPages; } /* j''ai essayé cette méthode mais ça ne fonctionne pas :( */ @Override public void destroyItem(ViewGroup container, int position, Object object) { FragmentManager manager = ((Fragment) object).getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); trans.remove((Fragment) object); trans.commit(); super.destroyItem(container, position, object); } @Override public int getItemPosition(Object object){ return PagerAdapter.POSITION_NONE; } @Override public CharSequence getPageTitle(int position) { return "p." + position + 1; } } public boolean isLandscape() { return mIsLandscape; } public ImageView getSinglePage(int position) { return mPageFactory.getPage(position); } public LinearLayout getDoublePage(int position) { return mDoublePageFactory.getDoublePage(position); } } public class PageFragment extends Fragment { private PlayerFragmentActivity mPlayerFragmentActivity; public static final String ARG_PAGE_NUM = "page_number"; public static final String ARG_WOBOOK_DIRECTORY = "book_directory"; public static final String ARG_NB_PAGE_COLUMNS = "nb_page_columns"; public static final String ARG_NB_PAGE_ROWS = "nb_page_rows"; @Override public ImageView onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mPlayerFragmentActivity = ((PlayerFragmentActivity) getActivity()); return mPlayerFragmentActivity.getSinglePage(getArguments().getInt(ARG_PAGE_NUM)); } @Override public void onStop(){ super.onStop(); mPlayerFragmentActivity = null; }

    }

    public class DoublePageFragment extends Fragment { private PlayerFragmentActivity mPlayerFragmentActivity; public static final String ARG_DOUBLEPAGE_NUM = "double_page_number"; public static final String ARG_WOBOOK_DIRECTORY = "book_directory"; public static final String ARG_NB_PAGE_COLUMNS = "nb_page_columns"; public static final String ARG_NB_PAGE_ROWS = "nb_page_rows"; @Override public LinearLayout onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mPlayerFragmentActivity = ((PlayerFragmentActivity) getActivity()); return mPlayerFragmentActivity.getDoublePage(getArguments().getInt(ARG_DOUBLEPAGE_NUM)); } @Override public void onStop(){ super.onStop(); mPlayerFragmentActivity = null; } }

He leído que FragmentManager en el marco se ocupa de guardar el estado y restaurar cualquier fragmento activo que haya creado el localizador. Así que supongo que cuando la orientación cambia, el FragmentManager dice

Oye ! Ya tengo 2 elementos creados, así que no necesito crear noticias, vamos a obtenerlas

Pero, de hecho, obtiene los 2 elementos (página / doble página) del antiguo modo de orientación. Así que necesito encontrar una forma de eliminar los fragmentos guardados por FragmentManager cuando se produce el cambio de orientación.

También probé este método . El problema parece estar relacionado con este

Atentamente