8

ブックを肖像画とランドスケープモードで表示するアプリケーションを作成しようとしています。それで、明らかにポートレートで1ページ、風景で2ページが表示されます。それぞれのモードはかなりうまくいきますが、私は向きをポートレートからランドスケープに変更すると、viewPagerはポートレートモードから2ページを取得しようとします。 実際にFragmentStatePagerAdapterは2つのフラグメントをポートレートで作成し、それらを使用して、横モードの2つのページを作成します()。ポートレートモードでもう一度切り替えると、FragmentStatePagerAdapterは以前に横長モードで作成された2つのフラグメントを使用するので、1つの単一ページの代わりに1つのダブルページが再び表示されます。オリエンテーションの変更でその断片を洗い流す。FragmentActivity内のviewPagerでオリエンテーションが変更されました

ここ2ユースケースは、理解を容易にするためです:私は私が右にスワイプして、私は

  • ページ2がOKを参照私はスワイプ
  • ページ1は、[OK]を参照
  • ポートレートモードでviewPagerを起動

    • 右に、私はページ3を参照してくださいok
    • 私は画面を横長モードに回転させます
    • 私は3ページを参照してください間違った
    • 私は1ページOK
    • を参照してください、私はポートレートモードでviewPagerを起動し、[OK]

    • を私は右にスワイプし、私は5ページと6を参照してください

    • を私は右にスワイプし、私は4ページ、間違った
    • を見ます

    • 私は右にスワイプし、私は右にスワイプして、私は
    • ページ3がOKを参照私は右にスワイプし、私は4ページOK
    • を参照してください2ページOK
    • を見ます
    • iは、右にスワイプし、私は風景モードに画面を回転
    • は、私はOKページを参照してください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は

    と答えています。

    Hey!私はすでに は彼らに

    を取得することができます、私はニュースを作成する必要はありませんので、2つの項目が作成されましたが、実際には古い配向モードから2つのアイテム(ページ/見開きページ)を取得します。だから私は方向変更が発生すると、FragmentManagerによって保存されたフラグメントを削除する方法をfndする必要があります。

    私はthis methodもテストしました。問題は、我々は唯一の正確なモードでビューのページャを使用することができますポートレートや風景mode.Becauseのいずれかに方向を制限してくださいthis one

    敬具

  • +0

    この問題をどのように修正しましたか? – Wayne

    答えて

    -1

    に関連しているようです。

    関連する問題