LayoutInflaterはXMLファイルを入力として受け取り、そこからビューオブジェクトを構築します。 十分に公正私たちはLayoutInflaterが何をすべきかを理解しました。
inflate()文書は、特にattachToRootについて述べています。
boolean:膨張した階層をルートパラメータにアタッチする必要があるかどうか? Falseの場合、rootは、XML内のルートビューのLayoutParamsの正しいサブクラスを作成するためにのみ使用されます。
attachToRootがtrueに設定されている場合、最初のパラメータで指定されたレイアウトファイルは膨張され、2番目のパラメータで指定されたViewGroupに添付されます。
attachToRootがfalseの場合、最初のパラメータからのレイアウトファイルが膨張し、ビューとして返されます。 ルートは、XML内のルートビュー(最初のパラメータの)のLayoutParamsの正しいサブクラスを作成するためにのみ使用されることを意味します。
attachToRootにtrueを渡すと、レイアウトファイルの膨張したビューがその場でViewGroupに追加されます。 AttachToRootにfalseを渡すことは、レイアウトファイルから作成されたビューが他の方法でViewGroupに追加されることを意味します。
二つのシナリオでそれを打破してみましょう:
attachToRootをTrueに設定
- レイアウト幅とレイアウト高さをmatch_parentに設定して、XMLレイアウトファイルでボタンを指定したとします。
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/action_attach_to_root_true"
android:id="@+id/button_ok">
</Button>
- ここで、このボタンをアクティビティ内のLinearLayoutにプログラムで追加します。 LinearLayoutメンバー変数parentでは、次のようにボタンを追加するだけです:
inflater.inflate(R.layout.view_button, mLinearLayout, true);
- レイアウトリソースファイルからボタンを膨らませるように指定し、layoutinflaterにそれを親に添付することを伝えます。 ボタンがLinearLayoutに追加されることがわかっているため、レイアウトパラメータが尊重されます。 ボタンのレイアウトparamsタイプはLinearLayoutにする必要があります。LayoutParams。
2. attachToRootをFalseに設定
- attachToRootをfalseに設定する場合を見てみましょう。 このシナリオでは、inflate()の最初のパラメーターで指定されたビューは、この時点で2番目のパラメーターのViewGroupにアタッチされません。 レイアウトファイルから親にカスタムボタンを添付したい先のボタンの例を思い出してください。 AttachToRootにfalseを渡すことで、ボタンを親にアタッチすることができます。
Button btnAttachToRootFalse = (Button) inflater.inflate(R.layout.view_button,parent,false);
parent.addView(btnAttachToRootFalse);
- false attachToRootの例では、ビューを手動でViewGroupに追加するときにもう少し作業が必要です。 LinearLayoutにボタンを追加すると、attachToRootがtrueの場合、1行のコードでより便利でした。
- attachToRootがfalseであることを絶対に必要とするいくつかのシナリオを見てみましょう。 RecyclerViewの子は、attachtorootをfalseとして渡して膨らませる必要があります。 子ビューはonCreateViewHolder()で膨張します。 RecyclerViewsは、私たちではなく、子ビューをいつ膨らませて提示するかを決定する責任があります。 AttachToRootパラメータは、ViewGroupにビューを追加する責任がないときはいつでもfalseにする必要があります。
- inflate()に渡すルートViewGroupがないシナリオがいくつかあります。 AlertDialogのカスタムビューを作成するときは、その親にはまだアクセスできません。
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
LayoutInflater inflater = getActivity().getLayoutInflater();View rootView = inflater.inflate(R.layout.fragment_hello_dialog,null,false);builder.setView(rootView);
builder.setTitle("Alert");
builder.setPositiveButton("Ok", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});return builder.create();
- この場合、ルートViewGroupにnullを渡すことは問題ありません。 AlertDialogは、とにかくMatch_parentにlayoutparamsをオーバーライドすることが判明しました。 しかし、一般的な経験則は、あなたがそうすることができるならば、親を渡すことです。
だから要約する:
- ルートViewGroupパラメータに渡す親がある場合は、そうしてください。
- ルートViewGroupにnullを渡さないようにしてください。
- レイアウトファイルのビューをルートViewGroupにアタッチする責任がない場合は、attachToRootパラメータにfalseを渡します。
- は、ViewGroupに既にアタッチされているビューに対してtrueを渡さないでください。
- カスタムビューは、attachToRootにtrueを渡すのに適したユースケースです。
Sean Farrelに感謝します。LayoutInflaterに関する彼の素晴らしい記事についてここで私はいくつかの言葉で要約しようとしました。
コーディングについての幸せなコーディングと書き込み!
これが役に立った場合は、下の↑をクリックしてください。 技術のより多くの記事のための私に続いて下さい。