103

向けに開発する場合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上記のコードなどを使用してビューを取得しますか?

4

6 に答える 6

174

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

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

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

于 2013-04-05T01:07:39.433 に答える
27

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

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

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

于 2011-12-23T15:52:58.883 に答える
3

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

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

于 2011-12-23T15:55:18.223 に答える
3
  1. シナリオ アクティビティ分割画面 - 左右の画面部分を処理する 1 つのレイアウトと 1 つのアクティビティがあります。
  2. シナリオ FragmentActivity メイン画面に 1 つのレイアウト、左に 1 つ、右に 1 つ

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

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

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

しかし、それはあなたのプロジェクトをより大きくします。しかし、大規模なプロジェクトを作成すると、多くを保存できます。同じ Fragments または同じ Fragment アクティビティを使用できるためです。

そして、この断片は少し遅れて現れるので、新しい方法で考えようとしなければならないと思います. アクティビティを FragmentActivity に変換してみてください。後で再利用可能なコードを見つけて、それから Fragment を作成してみてください。

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

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

私の意見では、それは良いことですが、Googleが教えてくれる理由ではありません.

于 2013-01-18T15:38:01.317 に答える
0

CustomView で Fragment または Activity を使用する場合に 1 つのケースを追加します。

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

于 2013-11-05T01:41:49.900 に答える
-2

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

于 2015-07-24T19:54:46.857 に答える