8

我試圖建立一個應用程序,顯示在縱向和橫向模式的書。所以顯然有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

問候

+0

你是怎麼解決這個問題的? – Wayne 2014-04-18 06:03:00

回答

-1

嘗試定向限制,以縱向或橫向mode.Because我們只能在精確模式下使用視圖尋呼機。