我試圖建立一個應用程序,顯示在縱向和橫向模式的書。所以顯然有1頁顯示在肖像和2景觀。每種模式的作品都不錯,但是當我將縱向從縱向改變爲橫向時,viewPager嘗試從縱向模式獲取2頁,而不是試圖從橫向模式獲取2張雙頁... 實際上FragmentStatePagerAdapter保留了2個以縱向創建的片段,並在爲橫向模式創建2個雙頁之前使用它們。如果我再次在肖像模式下切換,FragmentStatePagerAdapter使用之前在橫向模式下創建的2個片段,因此我再次看到1個雙頁而不是1個單頁等。如果我繼續切換方向,由於FragmentStatePagerAdapter從來沒有,我得到一個OutOfMemoryError在方向改變時沖洗它是碎片。方向改變與片段活動內viewPager
這裏有2用例更容易理解:
- 我在縱向模式下啓動viewPager
- 我看到第1頁確定
- 我刷到右,我看到第2頁確定
- 我刷卡向右,我看第3頁好
- 我將屏幕旋轉到風景模式
- 我看到第3頁錯誤
- 我刷到右,我看到第4頁錯誤
我刷到右,我看到第5和第6行
我在縱向模式下啓動viewPager
- 我看到第1頁確定
- 我滑動到右邊,我看到頁2 OK
- 我滑動到右邊,我看到頁3 OK
- 我滑動到右邊,我看到第4頁確定
- 我刷到右,我看到第5頁確定
- 我旋轉屏幕爲橫向模式
- 我見第5頁錯誤
- 我向左滑動,我看到第4頁錯誤
我刷到走了,我看行2頁和第3
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; } }
我讀過框架中的FragmentManager負責保存狀態並恢復尋呼機所做的任何活動片段。所以我想,當方向改變時,FragmentManager說
嘿!我已經有2項創建的,所以我並不需要製造新聞, 讓讓他們
但實際上它從舊的定向模式的2項(頁/雙頁)。所以我需要找到一種方法來刪除FragmentManager在方向更改時保存的片段。
我也測試了this method。這個問題似乎涉及到this one
問候
你是怎麼解決這個問題的? – Wayne 2014-04-18 06:03:00