web-dev-qa-db-ja.com

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

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

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

たとえば、クラス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も同様です。本当にそんなに便利なのでしょうか、それとも上記のコードのように、ビューを取得するための過度に単純化された単純化ですか?

102
Phil

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

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

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

166
Henry

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

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

すべてのビューにフラグメントを使用する理由は見当たりませんが、それは単なるオーバーヘッドになると思います。私はそれらを最初のユースケースでのみ使用していますが、ここでは単純化すると言います。

27
Maria Neumayer

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

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

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

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

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

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

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

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

その便利ですが、今どのように私は知らない。しかし、私はいくつかのアイデアを持っています。

これは常に問題です。 Androidチームは何かを考えて、何が良いのか誰も知らない。私たちはそれがそうであったようにほとんど学ばないので、ここにそれはいくつかの新しいものが来る。

私の意見では、それは良いが、グーグルが私たちに言う理由ではありません。

3
Mertuarez

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

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

0
macio.Jun