ブックを肖像画とランドスケープモードで表示するアプリケーションを作成しようとしています。それで、明らかにポートレートで1ページ、風景で2ページが表示されます。それぞれのモードはかなりうまくいきますが、私は向きをポートレートからランドスケープに変更すると、viewPagerはポートレートモードから2ページを取得しようとします。 実際にFragmentStatePagerAdapterは2つのフラグメントをポートレートで作成し、それらを使用して、横モードの2つのページを作成します()。ポートレートモードでもう一度切り替えると、FragmentStatePagerAdapterは以前に横長モードで作成された2つのフラグメントを使用するので、1つの単一ページの代わりに1つのダブルページが再び表示されます。オリエンテーションの変更でその断片を洗い流す。FragmentActivity内のviewPagerでオリエンテーションが変更されました
ここ2ユースケースは、理解を容易にするためです:私は私が右にスワイプして、私は
- 右に、私はページ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
敬具
この問題をどのように修正しましたか? – Wayne