次のようにして、LayoutParams
を使用してビューの幅と高さを設定する方法を知っています。
Android.view.ViewGroup.LayoutParams params = button.getLayoutParams();
params.width = height/7;
params.height = height/10;
button.setLayoutParams(params);
ここで、同じ高さと幅を別のボタンに適用したい場合は、別のLayoutParamを作成するか、次のように既存のものを上書きする必要があります。
Android.view.ViewGroup.LayoutParams params2 = but2.getLayoutParams();
params2.width = height/7;
params2.height = height/10;
but2.setLayoutParams(params2);
私のアプリケーションには約50個のボタンがあり、幅と高さのみを変更するためにすべてのParamsを取得することは良いコードとは思えない-残りのパラメーター(toLeftOf、[...])を保持したい。
パラメータの幅と高さのみを変更し、残りのパラメータは保持する方法はありますか?したがって、次のようになります。
Android.view.ViewGroup.LayoutParams params = button.getLayoutParams();
params.width = height/7;
params.height = height/10;
button.setLayoutParams(params);
button2.setLayoutParams(params);
button3.setLayoutParams(params);
butt[...]
よろしくお願いします。
メソッドgetLayoutParams()
を使用する目的は、View
から既存のルールを取得することです(すべてのルールとものを保持します)。次に、それらのLayoutParams
の特定のパラメーターを変更し、残りは変更しないでおくことができます。したがって、あなたは必要を呼び出してgetLayoutParams()
を呼び出し、Views
がxmlの設定が異なる場合に返されるオブジェクトを変更する必要があります。彼らがxmlでまったく同じルールを使用している場合は、前の例で書いたのと同じようにそれを行うことができます。
LayoutParams
を更新するプロセス全体をラップするメソッドを作成することをお勧めします。そのようです:
private void setDimensions(View view, int width, int height){
Android.view.ViewGroup.LayoutParams params = view.getLayoutParams();
params.width = width;
params.height = height;
view.setLayoutParams(params);
}
これにより、コードが大幅に簡素化されます。これは、幅と高さの適切な値を使用して、ボタンのすべてに対してこのメソッドを呼び出すことができるためです。
setDimensions(button, height/7, height/10);
setDimensions(button2, height/7, height/10);
setDimensions(button3, height/7, height/10);
Kotlinでは、より短く、よりエレガントに行うことができます。
view.layoutParams = view.layoutParams.apply {
width = LayoutParams.MATCH_PARENT
height = LayoutParams.WRAP_CONTENT
}
他の回答が述べているように、getLayoutParams()
を実行し、返されたLayoutParamsオブジェクトを変更し、それをsetLayoutParams()
する必要があります(これが妥当なAPIであるかどうかは議論の余地があります)。
しかし、comm1xが言うように、Kotlinはこれを本当にシンプルで読みやすくすることができます。
これはどう:
button.alterLayoutParams {
it.width = height / 7
it.height = height / 10
}
これには拡張関数が必要です:
private fun View.alterLayoutParams(callback: ((ViewGroup.LayoutParams) -> Unit)) {
val p = this.layoutParams
callback(p)
this.layoutParams = p
}
同じレイアウトパラメータを複数のView
sに適用したい場合は、次のようにします。
listOf(button, button2, button3).forEach { b ->
b.alterLayoutParams {
it.width = height / 7
it.height = height / 10
}
}
PS。 Kotlinは素晴らしいものです。
まだ他の人にはコメントできないので、Kotlinの小さくてエレガントな拡張関数を作成しました。
fun <T: ViewGroup.LayoutParams>View.layoutParams(run: T.() -> Unit) {
val params = layoutParams as T
run(params)
layoutParams = params
}
たとえば、constraintLayoutのビューの使用例は次のとおりです。
view.layoutParams<ConstraintLayout.LayoutParams> {
width = LayoutParams.WRAP_CONTENT
height = LayoutParams.WRAP_CONTENT
}
LayoutParamsの特定の実装が必要ない場合(特定のものを使用することをお勧めします)、拡張関数のより小さなバージョンを使用できます。
fun View.layoutParams(run: ViewGroup.LayoutParams.() -> Unit) {
val params = layoutParams
run(params)
layoutParams = params
}
..結果は次のようになります。
view.layoutParams {
width = LayoutParams.WRAP_CONTENT
height = LayoutParams.WRAP_CONTENT
}