web-dev-qa-db-ja.com

Androidレイアウトパラメータは幅と高さのみを変更します

次のようにして、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[...]

よろしくお願いします。

9
user2875404

メソッド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);
28
Bartek Lipinski

Kotlinでは、より短く、よりエレガントに行うことができます。

view.layoutParams = view.layoutParams.apply {
    width = LayoutParams.MATCH_PARENT
    height = LayoutParams.WRAP_CONTENT
}
1
comm1x

他の回答が述べているように、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
}

同じレイアウトパラメータを複数のViewsに適用したい場合は、次のようにします。

listOf(button, button2, button3).forEach { b ->
    b.alterLayoutParams {
        it.width = height / 7
        it.height = height / 10
    }
}

PS。 Kotlinは素晴らしいものです。

1
aaaidan

まだ他の人にはコメントできないので、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
}
1
Jolan Rensen