web-dev-qa-db-ja.com

フラグメントのonCreateViewとonViewCreatedの違い

これら2つの方法の本質的な違いは何ですか? TextViewを作成するとき、パフォーマンスのために1つを使用する必要がありますか?

編集:との違いは何ですか

onCreateView() {
  root = some view
  View v = new View(some context);
  root.add(v);
  return root;
}


onViewCreated() {
  View v = new View(some context);
  getView().add(v);
}
90
Smith

onCreateViewでビューを初期化する際にクラッシュが発生します。

onCreateViewでレイアウトを拡張する必要がありますが、findViewByIdonCreateViewを使用して他のビューを初期化しないでください。

ビューが適切に初期化されないことがあるためです。そのため、常にfindViewByIdonViewCreatedを使用し(ビューが完全に作成された場合)、ビューをパラメーターとして渡します。

onViewCreatedは、ビューが完全に作成されていることを確認します。

onViewCreated Androidドキュメント

onCreateViewAndroid.view.LayoutInflater, Android.view.ViewGroupAndroid.os.Bundle)が返された直後、ただし保存された状態がビューに復元される前に呼び出されます。これにより、サブクラスは、ビュー階層が完全に作成されたことがわかると、自身を初期化できます。ただし、この時点では、フラグメントのビュー階層はその親にアタッチされていません。

51
Xar E Ahmer

onViewCreatedonCreateViewTextViewを含むすべてのオブジェクトを初期化および作成するメソッド)の直後に呼び出されるため、パフォーマンスの問題ではありません。

開発者サイトから:

onViewCreated(ビュービュー、バンドルsavedInstanceState)

OnCreateView(LayoutInflater、ViewGroup、Bundle)が返された直後、ただし保存された状態がビューに復元される前に呼び出されます。これにより、サブクラスは、ビュー階層が完全に作成されたことがわかると、自身を初期化できます。ただし、この時点では、フラグメントのビュー階層はその親にアタッチされていません。

ソース: Fragment#onViewCreated

34
u3l

onViewCreatedのフィールドにサブビューを割り当てることをお勧めします。これは、フレームワークが自動的にnullチェックを実行して、フラグメントのビュー階層が適切に作成および拡張されていることを確認するためです(XMLレイアウトファイルを使用している場合)。

コードスニペット: FragmentManger.Java

// This calls onCreateView()
f.mView = f.performCreateView(f.getLayoutInflater(f.mSavedFragmentState), null, f.mSavedFragmentState);

// Null check avoids possible NPEs in onViewCreated
// It's also safe to call getView() during or after onViewCreated()
if (f.mView != null) {
    f.mView.setSaveFromParentEnabled(false);
    if (f.mHidden) f.mView.setVisibility(View.GONE);
    f.onViewCreated(f.mView, f.mSavedFragmentState);
}
24
orangemako

onCreateViewは、膨張したビューを返します。 OnViewCreatedonCreateViewの直後に呼び出され、getには拡張ビューのパラメーターがあります。戻りタイプはvoidです

12
Blackbelt

onCreateView()は、アクティビティおよび実行のonCreate()と同等のフラグメントです実行中ビューの作成。
onViewCreated()実行ビューが作成されました。

should I use one over the other for performance?NO。パフォーマンスが向上したという証拠はありません。

実際にFramentsにもonCreate()メソッドがあります。

しかし、それはまれに使用済みです(私は決して使用せず、そのための良いユースケースを見つけません)。
私は常にonCreateView()の代わりにフラグメントでonCreate()を使用します。
そして、私はそれで満足しています。

4
Fantômas

これらの主な違いは、kotlin.inonCreateView()を使用するとき、XMLファイルで表示するためにアクセスするたびに、使用する必要があると思いますfindViewByIdしかし、onViewCreatedでは、呼び出すだけでビューにアクセスできますそれのID。

1

onCreateViewは、レイアウトを作成してビューを膨張させるためにフラグメントで使用されます。 onViewCreatedは、上記の方法で作成されたビューを参照するために使用されます。最後に、onActivityCreatedでアクションリスナーを定義することをお勧めします。

1
Salu Khadka

onViewCreatedを使用する主な理由は、onViewCreateに入るべきビュー階層のインフレーション/作成ロジックから初期化ロジックを分離するためです。他のすべてのパフォーマンス特性は同じに見えます。

0
AmeyaB