6

縦向きモードでは、私のViewPager3 つのフラグメント A、B、C がありますが、横向きモードでは、2 つのフラグメント A と C しかありません。したがってFragmentStatePagerAdapter、モードごとに 2 つの を作成します。問題は、画面の向きが変更され、ViewPager元の向きの以前のフラグメントを復元して使用する場合です。たとえば、向きを縦向きから横向きに変更ViewPagerすると、A と C ではなく A、B の 2 つのフラグメントが表示されるようになりました。これが発生する理由はわかっていますが、これに対する適切な解決策を見つけることができません。

私の現在の回避策は、ViewPagerフラグメントの再利用を防ぐために (例: 縦向きの場合は id/viewpager_portrait、横向きのレイアウトの場合は id/viewpager_landscape)、異なる ID を使用することですが、古いフラグメントは破棄されず、メモリに保持されるため、メモリ リークが発生します。 .

アクティビティで super.onCreate(null) を呼び出す、またはアクティビティでのフラグメントを削除するなどの回避策を試しましたonCreateが、すべてアプリがクラッシュします。ViewPageronSaveInstanceState

だから私の質問はFragmentStatePagerAdapter、向きが変わったときに1つまたは複数のフラグメントを再利用しないようにする方法ですか?

どんな助けでも大歓迎です。少し早いですがお礼を。

4

4 に答える 4

3

問題はおそらく、Android によって提供される の組み込みPagerAdapter実装Fragmentが、アイテムが一定のままであると想定しているため、Fragmentに追加されたすべてのへのインデックスベースの参照を保持して再利用することViewPagerです。これらの参照は、構成の変更またはプロセスの強制終了により(およびs) が再作成されFragmentManagerた後でも維持されます。ActivityFragment

あなたがする必要があるのはPagerAdapter、カスタムタグをそれぞれに関連付け、を (インデックスベースではなく) タグベースの形式でFragment格納する独自の実装を作成することです。Fragmentメソッドと一緒にインデックスに基づいてタグを提供するための抽象メソッドを追加した後、既存のものの 1 つからこれの汎用実装を派生させることができますgetItem()。もちろん、Fragment以前の構成で追加された孤立/未使用のを削除する必要がありますViewPager(理想的にはその状態を保持しながら)。

ソリューション全体を自分で実装したくない場合はArrayPagerAdapterCWAC-Pagerライブラリの を使用して、ほとんど労力をかけずに合理的な実装を提供できます。Fragment初期化時に、提供されたタグに基づいて関連するものを切り離し、必要に応じてアダプターから削除/追加することもできます。

于 2014-05-31T07:43:17.637 に答える
1

アクティビティで OnConfigurationChanged() をオーバーライドします (マニフェストのアクティビティに android:configChanges="orientation" も追加します)。この方法で向きの変更を手動で管理します。あとは、OnOrientaionChanged でアダプターを変更するだけです (現在の位置も追跡します)。この方法では、単一のレイアウト、単一の ViewPager を使用し、フラグメントがリサイクルされないことを心配する必要はありません (まあ、それを補うための作業はたくさんあります)。幸運を!

于 2014-06-06T11:34:13.633 に答える
1

getItemPosition()Adapter をオーバーライドして を返しPOSITION_NONEます。したがって、ViewPager が再作成されると が呼び出され、ここからgetItemPosition()戻ってきたので が呼び出されます。this から新しいフラグメントを返す必要があります。参照: http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#getItemPosition%28java.lang.Object%29POSITION_NONEgetItem()getItem()

于 2014-06-05T10:21:35.340 に答える