web-dev-qa-db-ja.com

フラグメントとカスタムビューAndroid

フラグメントとカスタムビューは同様の機能を実現できます。フラグメントを使用すると、フラグメントがカスタムビューと比較して再利用しやすくなります。フラグメントはカスタムビューに取って代わるものですか、それとも特定の目的のための拡張機能ですか?

たとえば、次のコードはfragmentです。

public class TestFragment extends Fragment {

    private TextView tv_name;
    private Button btn_play;
    private Button btn_delete;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.testfragment, container, false);
    }

    @Override
    public void onStart() {
        super.onStart();

        tv_name = (TextView)getView().findViewById(R.id.tv_name);
        btn_play = (Button)getView().findViewById(R.id.btn_play);
        btn_delete = (Button)getView().findViewById(R.id.btn_delete);

    }
}

カスタムビューのコード:

public class TestCustomView extends LinearLayout {

    private TextView tv_name;
    private Button btn_play;
    private Button btn_delete;

    public TestCustomView(Context context, AttributeSet attrs){
        super(context, attrs);

        setOrientation(LinearLayout.HORIZONTAL);
        setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        tv_name = new TextView(context);
        addView(tv_name);

        btn_play = new Button(context);
        addView(btn_play);

        btn_delete = new Button(context);
        addView(btn_delete);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.testfragment, container, false);
    }
}

TestFragmentTestCustomViewの両方は、TextViewButtonsで構成されるビューを作成し、Framelayout/fragmentcom.packagename.TestCustomViewのタグを使用して、アクティビティのxmlレイアウトファイルで宣言しますが、フラグメントを使用する利点は何ですか?

47
Kai Y

フラグメントはさまざまなシナリオで使用できますが、最も使用されるのは次のとおりです。

  • ビューの周りのラッパー
  • ヘッドレスフラグメント-ビューなし=>一般的にはあまり役に立たないが、使用できる
  • 保持可能なフラグメント-上記のいずれかです。 Fragment.setRetainInstance(true) を使用することにより、 Fragment.onDestroy() をバイパスできます。つまり、設定変更時にフラグメントデータを保持できますが、フラグメントビュー構造は依然として破棄/再作成されます。
  • アクティビティバックスタックに追加できます。つまり、簡単な[戻る]ボタンを前の状態に復元します。

フラグメントが首の完全な痛みである場合があります、そして、彼らがより速く結果を達成できる場合があります。

一部のカスタムでより柔軟な状況では、フラグメントが乱雑になる可能性があり、フラグメントを管理するのは困難です。そのため、ビューを直接処理することは、場合によっては非常に便利で便利です。しかし、すべては要件に基づいています。

Viewには独自のライフサイクルがあり、保存されたインスタンスの状態を保存/再作成できます。もう少し作業が必要ですが、オプションもあります。

27
Dimitar Genov

カスタムビューにはシンプルさという利点があり、主な目的はデータを画面に表示することです。さらに多くのことを行うには、他のコンポーネントに依存する必要があります。

フラグメントは、1つ以上のビューを使用して、特定の目的を持つUIの一部を表示する機能ユニットとして機能します。フラグメントはアクティビティライフサイクルに接続され、ビューをデータで埋めるためにローダーを含めて制御できます。また、サブフラグメントを含めることもできます。最後に、合成バックスタックに追加することもできます。彼らは多くのことをすることができ、学ぶのはやや複雑です。

ご覧のように、フラグメントには、カスタムビューよりもアクティビティとの共通点が多くあります。

補足として、フラグメントはヘッドレス(UIなし)にすることもできます。ヘッドレスフラグメントは、アクティビティライフサイクルに依存する非ビジュアル機能を別のコンポーネントにカプセル化する方法を提供します。

17
BladeCoder

フラグメントには独自のライフサイクルがあり、必要なものに応じて障害またはボーナスになる場合があります。

フラグメントは、onResumeやonSavedInstanceStateなどのライフサイクルメソッドを取得します。これは、アプリケーションの状態遷移の処理に役立ちます。カスタムビューを使用している場合は、そのようなことを自分で処理する必要があります。

フラグメントの使用に反対する人々がいます。読むことをお勧めします https://corner.squareup.com/2014/10/advocating-against-Android-fragments.html

15
Malthan