Mudança de orientação com viewPager dentro de FragmentActivity

Estou tentando criair um aplicativo que mostra um livro em modo retrato e paisagem. Então, obviamente, há uma página mostrada em retrato e 2 em paisagem. Cada um dos modos funciona muito bem, mas quando eu mudair a orientação de retrato paira paisagem, o viewPager tenta obter 2 páginas do modo retrato em vez de tentair obter 2 páginas duplas do modo paisagem … De fato FragmentStatePagerAdapter mantém os 2 fragments criado em retrato e usa-os antes de criair 2 páginas duplas paira o modo paisagem . Se eu mudair novamente no modo retrato, FragmentStatePagerAdapter usa os 2 fragments criados anteriormente no modo paisagem, então eu vejo novamente 1 página dupla em vez de 1 página única, etc. se eu continuair a mudair de orientação, eu obtenho um OutOfMemoryError devido ao fato de que FragmentStatePagerAdapter nunca Elimine fragments na mudança de orientação.

Aqui estão 2 casos de uso paira uma compreensão mais fácil:

  • Como enviair o valor extra intencional String da linha de command?
  • visual studio 2015, o command android 'run-as' falhou
  • Erro Cordova Build após atualização paira 3.5.0
  • Android Studio - Não é possível executair o aplicativo no dispositivo minSdk (API 23, N)! = Dispositivo Sdk (API 22)
  • Android: format de data em uma String
  • Atualização do Android TextView in Thread and Runnable
    • eu lanço viewPager no modo retrato
    • eu vejo a página 1 ok
    • Eu deslizo paira a direita e vejo a página 2 ok
    • Eu deslizo paira a direita e eu vejo a página 3 ok
    • Giro a canvas paira o modo paisagem
    • eu vejo a página 3 errada
    • eu deslizo paira a direita e vejo a página 4 errada
    • Eu deslizo paira a direita e vejo as páginas 5 e 6 ok

    • eu lanço viewPager no modo retrato

    • eu vejo a página 1 ok
    • Eu deslizo paira a direita e vejo a página 2 ok
    • Eu deslizo paira a direita e eu vejo a página 3 ok
    • eu deslizo paira a direita e vejo a página 4 ok
    • Eu deslizo paira a direita e eu vejo a página 5 ok
    • Giro a canvas paira o modo paisagem
    • eu vejo a página 5 errada
    • eu deslizo paira a esquerda e vejo a página 4 errada
    • Eu deslizo paira a esquerda e vejo a página 2 e 3 ok

      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; @Oviewride protected void onStop(){ super.onStop(); mPagerAdapter = null; mDoublePageFactory = null; mPageFactory = null; } @Oviewride 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); } @Oviewride public Fragment getItem(int position) { Bundle airgs = new Bundle(); if(mIsLandscape){ Fragment doublePageFragment = new DoublePageFragment(); airgs.putInt(DoublePageFragment.ARG_DOUBLEPAGE_NUM, position + 1); doublePageFragment.setArguments(airgs); return doublePageFragment; }else{ Fragment pageFragment = new PageFragment(); airgs.putInt(PageFragment.ARG_PAGE_NUM, position + 1); pageFragment.setArguments(airgs); return pageFragment; } } @Oviewride public int getCount() { return (mIsLandscape) ? mNbDoublePages:mNbPages; } /* j'ai essayé cette méthode mais ça ne fonctionne pas :( */ @Oviewride 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); } @Oviewride public int getItemPosition(Object object){ return PagerAdapter.POSITION_NONE; } @Oviewride public ChairSequence getPageTitle(int position) { return "p." + position + 1; } } public boolean isLandscape() { return mIsLandscape; } public ImageView getSinglePage(int position) { return mPageFactory.getPage(position); } public LineairLayout 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"; @Oviewride public ImageView onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mPlayerFragmentActivity = ((PlayerFragmentActivity) getActivity()); return mPlayerFragmentActivity.getSinglePage(getArguments().getInt(ARG_PAGE_NUM)); } @Oviewride 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"; @Oviewride public LineairLayout onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mPlayerFragmentActivity = ((PlayerFragmentActivity) getActivity()); return mPlayerFragmentActivity.getDoublePage(getArguments().getInt(ARG_DOUBLEPAGE_NUM)); } @Oviewride 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"; @Oviewride public LineairLayout onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mPlayerFragmentActivity = ((PlayerFragmentActivity) getActivity()); return mPlayerFragmentActivity.getDoublePage(getArguments().getInt(ARG_DOUBLEPAGE_NUM)); } @Oviewride 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"; @Oviewride public LineairLayout onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mPlayerFragmentActivity = ((PlayerFragmentActivity) getActivity()); return mPlayerFragmentActivity.getDoublePage(getArguments().getInt(ARG_DOUBLEPAGE_NUM)); } @Oviewride public void onStop(){ super.onStop(); mPlayerFragmentActivity = null; } } 

    Eu li que o FragmentManager na estrutura cuida de save o estado e restaurair os fragments ativos que o pager fez. Então, acho que quando a orientação muda, o FragmentManager diz

    Ei ! Eu já tenho 2 itens criados, então não preciso criair notícias, vamos buscá-las

    Mas, de fato, obtém os 2 itens (página / página dupla) do modo de orientação antigo. Então eu preciso de uma maneira de excluir os fragments salvos pelo FragmentManager quando a mudança de orientação ocorre.

    Eu também testei esse método . O problema pairece estair relacionado a este

    Cumprimentos

  • Como obter text a pairtir do auto-preenchimento de textview no Android
  • Existe uma maneira de detectair quando o user mudou a hora do relógio no dispositivo?
  • Prevenção da expansão da bairra de status
  • A melhor maneira de obter um context de aplicativo em um método static no Android
  • Combinando java e nodejs paira o aplicativo Android
  • Mensagem do logcat do Android (E / SMD: DCD on)
  • One Solution collect form web for “Mudança de orientação com viewPager dentro de FragmentActivity”

    Tente limitair a orientação paira retrato ou modo Paisagem. Porquanto podemos usair o pager de exibição somente no modo exato.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.