2012-10-09 8 views
6

ViewPagerでビューまたはフラグメントを使用するかどうかについて質問があります。ViewPagerでビューまたはフラグメントを使用する

背景: 私はListViewを含むアクティビティAを持っています。各ListViewアイテムはアクティビティBを開きます。アクティビティBは、アクティビティAでタップされたListViewアイテムに応じて異なるコンテンツを表示します。 アクティビティBのコンテンツはListView内に表示されます。

質問:コンテンツを切り替えるためにアクティビティAとBの間を行き来するのではなく、アクティビティB内のコンテンツをすべて切り替えるために水平ビューのスワイプを実装する必要があります。 Activity BのListViewのインスタンスを多数作成し、ViewPager + PagerAdapterとともに使用することです。 ドキュメントに見つかったもう一つの潜在的な解決策(試してみません)は、そのListViewをFragmentに持ってきて、フラグメントの多くのインスタンスを作成し、ViewPager + FragmentPagerAdapterまたはFragmentStatePagerAdapterと共に使用することです。

私の質問は、それぞれのアプローチを使用する利点は何ですか? ListViewをFragmentに持ってくるか、ViewPagerでListViewを使うだけでいいですか?

おかげ

答えて

10

Fragmentは有用なアプローチであるあなたは、特定のView(またはグループの)に、いくつかのUIのビジネスロジックを結ぶたいとき、私は、と思います。ご存知のように、その個人Fragmentには、Activityと同じように、独自のライフサイクルコールバックなどがあります。

よりもむしろ単一PagerAdapterを介して単一Activityホスト多くListView Sを有し、Fragmentが単一ListView駆動背後にあるロジックに対処する必要があるため、Fragmentアプローチを使用するクリーナであってもよいです。

これは私が直面しているものと非常によく似た状況です。私はViewPagerの中にさまざまな垂直スクロールフォーム(多くの入力フィールドで構成されています)を表示しています。私の場合、Fragmentのアプローチになっています。私の場合、ViewPagerは、実際には、特定のページで完全に異なる種類のビューを表示する必要がある可能性があるからです。たとえば、最初の数ページでは、ユーザーの入力フォームが表示されることがあります。しかし最後のページにグラフが表示されます。そのグラフを駆動するには、別個の論理セットが必要です。これらの入力フォームと1つのグラフを1つのActivityから駆動するにはちょっと混乱します。私はおそらくビジネスロジックをいくつかのデリゲートクラスなどに入れる必要があります。だから、私にとってはFragmentが最終的にはっきりとした選択だった。私はInputFormFragmentGraphFragmentを持っていて、彼らはそれぞれが提供するViewのための適用可能なロジックだけを含んでいます。

近い将来、ViewPagerに別の種類のViewを表示することもできます。または、別のUIレイアウト、つまりViewPagerを使用せず、すべてを横に並べて表示するレイアウト(たとえば、大型タブレットで横向きモードで使用されるレイアウト)を使用することもできます。 Fragmentでは、物事ははるかにモジュール化されており、これを素早く行うようにコードを因数分解することができます。一方、単純なPagerAdapterとその中のListViewのすべてのロジックを含む単一のActivityを使用して目標を達成した場合、新しい種類のViewまたは特殊なタブレットレイアウトをサポートするために今後さらに多くの作業が必要になることがあります。私は言うだろう

一つは、物事はあなたが特別な要件がある場合は少し厄介な取得することができますFragmentPagerAdapterFragmentStatePagerAdapterを通じてViewPagerに自分自身をFragment秒を実現しましたさ。 Fragmentを管理することは時々トリッキーになる可能性があります。たとえば、私のUIの場合、Fragmentを含むViewPagerをプログラムで追加して削除する必要がありました。私はまた、使用しているアダプタが、Fragmentを一度表示すると破棄しないようにする必要がありました。なぜなら、特定の時点ですべてFragmentのデータを同時に収集する必要があったからです。さらに、FragmentonDestroy()を正しく通過するように、FragmentPagerAdatperを拡張して変更しなければならず、ViewPagerが削除されたときにFragmentManagerから削除されました。

Fragmentは、様々な画面サイズと向きのUIを構築する非常にモジュラーな方法を可能にし、個々のUI要素のビジネスロジックとライフサイクルをカプセル化する方法が優れています。しかし、あなたのシナリオが実際にはViewPagerの複数のListViewと同じくらい単純で、モジュール性が決して必要ないことがわかっている場合、Fragmentのオーバーヘッドは過度なものになる可能性があります。

+0

フラグメントから情報を収集することについては、インタフェースを作成する方が簡単ではないでしょうし、フラグメントホストがそれを実装するオブジェクトへの参照を持ち、インタフェース関数を使用してそのオブジェクトに情報を格納しますか? –

+0

私が正しいと理解しているのは、ViewPager内にすべてのフラグメントが残っていることを確実にするために巧妙なことをする必要がなく(いつでも殺されずに再び作成されるわけではない)、代わりに、彼らの状態を維持する。私はこれを行うことができたと私は良いアプローチになるだろうが、私の特定のアプリケーションの断片は非常に建設するために高価であることに同意するだろう。コーディングとパフォーマンスの両方の理由から、すべてのフラグメントが保持されていることを確認し、すべてのデータを一緒に提出するよう要求するのはより簡単でした。 – Trevor

関連する問題