Android 布局参数仅更改宽度和高度

Android Layout Params change ONLY width and height

我知道如何使用 LayoutParams 设置视图的宽度和高度,方法如下:

android.view.ViewGroup.LayoutParams params = button.getLayoutParams();
params.width = height/7;
params.height = height/10;
button.setLayoutParams(params);

现在,只要我想将相同的高度和宽度应用到另一个按钮,我就需要创建另一个 LayoutParams 或覆盖现有的布局参数,如下所示:

android.view.ViewGroup.LayoutParams params2 = but2.getLayoutParams();
params2.width = height/7;
params2.height = height/10;
but2.setLayoutParams(params2);

我的应用程序中有大约 50 个按钮,我怀疑获取所有参数以仅更改宽度和高度的代码是否被认为是好的代码 - 我想保留剩余的参数(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 的具体参数,其余的保持不变。因此,如果您的 Views 在 xml 中的设置不同,您 需要 调用 getLayoutParams() 并修改返回的对象。如果他们在 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 应用相同的布局参数,您可以这样做:

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
}

如果您只想更改一个参数:

view.getLayoutParams().width = 400;
view.requestLayout();
view.updateLayoutParams {
    width = LayoutParams.WRAP_CONTENT
    height = LayoutParams.WRAP_CONTENT
}