ビューではなくAndroidでフラグメントを使用する利点は何ですか?


102

のために開発するとき Androidに、ターゲット(または最小)SDKを4(API 1.6)に設定し、Android互換パッケージ(v4)を追加して、のサポートを追加できFragmentsます。昨日私はこれを行いFragments、カスタムクラスからのデータを視覚化するために正常に実装しました。

私の質問はこれです:Fragments単にカスタムオブジェクトからビューを取得してAPI 1.5をサポートするのではなく、を使用する利点は何ですか?

たとえば、クラスFoo.javaがあるとします。

public class Foo extends Fragment {

    /** Title of the Foo object*/
    private String title;
    /** A description of Foo */
    private String message;

    /** Create a new Foo
     * @param title
     * @param message */
    public Foo(String title, String message) {
        this.title = title;
        this.message = message;
    }//Foo

    /** Retrieves the View to display (supports API 1.5. To use,
     * remove 'extends Fragment' from the class statement, along with
     * the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}) 
     * @param context Used for retrieving the inflater */
    public View getView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//getView 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//onCreateView

}//Foo

どちらの方法も、List<Foo>表示する(たとえば、プログラムでそれぞれにを追加するScrollView)アクティビティで作成および操作するのが非常に簡単であるため、Fragments本当に非常に便利です。上記のコードなどを通じてビューを取得していますか?


2
フラグメントはUIを持っている必要はなく、単に再利用可能な動作にすることができます。その場合、ビューは冗長になります。
Philipp Reichart、2011

私は別の質問でこれに答えました。stackoverflow.com/a/14912608/909956 T; drを参照してください。フラグメントにより、カスタムビューの実装に依存するよりも再利用可能なコンポーネントを作成できる場合があります。理由については、リンクを参照してください。
numan salati 2013

回答:


172

フラグメントを使用する主な理由は、バックスタックとライフサイクル機能のためです。それ以外の場合は、カスタムビューの方が軽量で実装が簡単です。

最初は、実際にカスタムビューを使用して電話/タブレットアプリを作成しようとしました。シングルパネルからスプリットパネルに切り替えても、すべてスマートフォンとタブレットで機能するように見えました。困ったのは、戻るボタンとライフサイクルでした。ビューを手動で更新するだけだったので...ビューの履歴とその状態を追跡するものは何もありませんでした。そのため、戻るボタンが期待どおりに機能せず、アプリを回転させるなどのライフサイクルイベント中に最新の状態を再現することも困難でした。これを修正するには、カスタムビューをフラグメントでラップし、FragmentManagerを使用して、以前の状態を保存して再作成する必要がありました。

私が1年前に同様の質問に投稿したことを答えた後、私は気づきました: https : //stackoverflow.com/a/11126397/618881


14
とても良い答えです。私はちょうどフラグメントは以降の4.2またはサポートライブラリREV 11ネストすることができることを追加したい
KAR

2
更新をありがとう@Karlo。概念的には可能だとは思いませんでしたが、getChildFragmentManager()を通じてプライベートFragmentManagerを使用して回避しました。ああ、それはAPI 17であり、11ではなく、サポートライブラリを通じて利用できます。
ヘンリー

2
私はこの質問をもう一度見ていましたが、私の経験も変わりました。これは、メリットとデメリットの両方をよく理解できる回答であり、非常に役立ちます。ありがとう!
フィル

2
この回答を+1したいのですが、そうすると現在のスコアが台無しになります。その上、70は私の好きな数ではありません。
Behnam 2014年

1
昨年、私はFragmentsが余分な通常の機能を提供しないとも思っていましたが、アクティビティをクリックして戻ったときに、ダウンロードされたすべての画像を失っていたので、キャッシュ実装を追加する必要があったので、今、断片は非常に簡単かもしれません
Shirish Herwade

27

フラグメントは2つのシナリオで有用だと思います。いくつかのデバイス/方向のビューを分割し、それらを2つのアクティビティに表示し、すべてのコンテンツを他のデバイスの1つに表示する場合です。これは、タブレットや携帯電話の横向きモードの場合の使用例です。たとえば、アイテムのリストと詳細を1つの画面に表示します。電話またはポートレートモードでは、1つの部分だけを表示します。

別のユースケースは、再利用可能なビューです。したがって、さまざまなアクティビティに表示されるいくつかのビューがあり、いくつかのアクションも実行する場合、この動作をフラグメントに入れて再利用できます。もちろん、カスタムウィジェットでもそれができるでしょう。

すべてのビューでFragmentsを使用する理由は見当たらないので、オーバーヘッドになるだけだと思います。私はそれらを最初の使用例でのみ使用しており、ここではそれは単純化であると言います。


ありがとう、これは間違いなく役に立ちました。私はビューを使い続け、再利用できるように独自の「バックスタック」を作成すると思います。
Phil

3

AndroidはAndroid 3.0(APIレベル11)でフラグメントを導入しました。これは主に、タブレットなどの大画面でより動的で柔軟なUIデザインをサポートするためです。タブレットの画面はハンドセットの画面よりもはるかに大きいため、UIコンポーネントを組み合わせたり交換したりする余地があります。フラグメントを使用すると、ビュー階層への複雑な変更を管理する必要なしに、このようなデザインを実現できます。アクティビティのレイアウトをフラグメントに分割することで、実行時にアクティビティの外観を変更し、それらの変更をアクティビティによって管理されるバックスタックに保存できるようになります。

ここでもっと読むことができます。


私はすべてのドキュメントを読みましたが、タブレットやバックスタックなど、それらの利点をよりよく説明するものを探していました
Phil

3
  1. シナリオアクティビティ分割画面-左右の画面部分を処理する1つのレイアウトと1つのアクティビティがあります
  2. シナリオFragmentActivityには、メイン画面用に1つのレイアウト、左用に1つ、右用に1つのレイアウトがあります。

単純なアプリケーションの場合は、シナリオ1が適しています。

複数のFragmentと複数のFragmentActivitiesが必要で、それぞれを組み合わせることができる場合は、シナリオ2が適しています。また、フラグメント間の相互作用を行うことができます。

分割画面のFragmentactivityを持っているので、「Intent Extras」で呼び出して、フラグメントフラグメントをロードするようにfragmentActivityに指示できます。フラグメントはマニフェストではないので良いので、再利用可能なフラグメントとFragmentActvityを作成できます。

ただし、プロジェクトが大きくなります。しかし、大規模なプロジェクトを作成すると、多くを節約できます。同じフラグメントまたは同じフラグメントアクティビティを使用できるからです。

そして、私はこの断片が少し遅れて来るので、あなたは新しい方法で考えてみる必要があります。多分ちょうどあなたの活動をFragmentActivityに変換してみてください。後で再利用可能なコードを見つけて、それからフラグメントを作成してください。

その便利ですが、私は今どのように知りません。しかし、私にはいくつかのアイデアがあります。

これは常に問題です。Androidチームは何かを考えましたが、何が良いのか誰も知りません。昔のようにほとんど学んでいないので、新しいことがいくつかあります。

私の意見では、グーグルが教えてくれるのは良いことですが、理由はありません。


0

CustomViewでフラグメントまたはアクティビティを使用する場合は、1つのケースを追加します。

CursorLoaderを使用して特定のビュー、ListViewまたはTextViewを監視し、バックエンドでContentProviderのデータが更新されるたびに表示値を更新する場合(最も一般的なケースは、リモートデータベース/クラウドから定期的にデータをポーリングすることによってローカルデータベースを更新するサービスがある場合) )


-2

上記のすべてのコメントで言及されていない大きなことの1つは、Androidがアクティビティを強制終了し、デバイスの向きを変更するなどの操作を行った場合でも、フラグメントがメモリに常駐し続けることです。これはパフォーマンス上の理由で行われますが、フラグメントがどこからともなく再作成されていることを確認するためにのみフラグメントが破棄されることを予期していた場合、予期しない結果になる可能性もあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.