パラメータを次のように指定できるため、XMLファイルの操作は簡単でした。
<Android:layout_width="fill_parent" Android:layout_height="wrap_content">
しかし、コードで指定していると混乱します。ビューごとに、を使用してパラメーターを指定します
view.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT));
相対レイアウト、フレームレイアウトなどとして指定するオプションがあることがわかります。現在、画像、テキスト、グリッドビューなどのすべてのビューに線形レイアウトを使用しています。ビューパラメータは、親要素のレイアウトに基づいて定義する必要がありますか?または、ビューがたとえばframelayoutの子である場合でも、線形レイアウトとして指定しても問題ありませんか?申し訳ありませんが、違いがわかりませんでした。
すべてのレイアウトクラス(LinearLayout
、RelativeLayout
など)はViewGroup
を拡張します。
ViewGroup
クラスには、LayoutParams
とMarginLayoutParams
の2つの静的内部クラスがあります。そして、ViewGroup.MarginLayoutParams
は実際にはViewGroup.LayoutParams
を拡張します。
レイアウトクラスでは、子ビューに関連付けるために追加のレイアウト情報が必要になる場合があります。このために、彼らは内部の静的LayoutParams
クラスを定義します。たとえば、LinearLayout
には次のものがあります。
public class LinearLayout extends ViewGroup {
...
public static class LayoutParams extends ViewGroup.MarginLayoutParams {
...
}
}
RelativeLayout
についても同じです:
public class RelativeLayout extends ViewGroup {
...
public static class LayoutParams extends ViewGroup.MarginLayoutParams {
...
}
}
ただし、LinearLayout.LayoutParams
とRelativeLayout.LayoutParams
は完全に異なる独立したクラスです。それらは、子ビューに関するさまざまな追加情報を格納します。
たとえば、LinearLayout.LayoutParams
はweight
値を各ビューに関連付けることができますが、RelativeLayout.LayoutParams
はできません。 RelativeLayout.LayoutParams
と同じことです。above
、below
、alightWithParent
などの値を各ビューに関連付けることができます。そして、LinearLayout.LayoutParams
にはこれらの機能がありません。
したがって、一般に、ビューを正しく配置およびレンダリングするには、囲んでいるレイアウトからLayoutParams
を使用する必要があります。ただし、すべてのLayoutParams
には同じ親クラスViewGroup.LayoutParams
があることに注意してください。また、そのクラスで定義されている機能(WRAP_CONTENT
やFILL_PARENT
など)のみを使用すると、間違ったLayoutParams
クラスを使用してレイアウトを指定した場合でも、機能するコードを取得できます。 params。
レイアウトを変更するビューの数に応じて、ヘルパーメソッドを作成し、変更するビューを、変更する高さと幅の値とともにメソッドに渡す方がよいと思います。
public void setWidthHeight(View v, int width, int height){
LayoutParams lp;
lp = v.getLayoutParams();
lp.width = width;
lp.height = height;
v.setLayoutParams(lp);
}
ここで幅と高さを設定すると、xmlの同じ値と一致しないことに注意してください。つまり、Android:layout_width = "32dp"はlp.width = 32と同じではありません。
また、lpと呼ばれるLayoutParams型変数は、ビューによって返される型である必要があります...ビューによって返される型を確認し、その型をインポートステートメントにインポートします。