1. ホーム
  2. android

[解決済み] AndroidでViewsではなくFragmentを使用するメリットは何ですか?

2022-12-03 05:02:05

質問

を開発する場合 Android を開発する場合、ターゲット (または最小) の sdk を 4 (API 1.6) に設定し、android compatibility package (v4) を追加して、以下のサポートを追加することができます。 Fragments . 昨日、私はこれを実行し、無事に Fragments を実装し、カスタムクラスからのデータを可視化することに成功しました。

私の質問はこれです。 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 は本当に便利なのか、それとも上のコードのようにViewを取得するための過度な簡略化に過ぎないのでしょうか?

どのように解決するのですか?

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

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

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