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

10

我知道如何使用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[...]

非常感谢您的提前帮助。


所有的按钮宽度和高度都一样吗? - iRuth
宽度不等于高度,但是按钮的高度等于按钮+1的高度,按钮的宽度也等于按钮+1的宽度。 - user2875404
这是针对所有按钮吗?还是只针对其中的2个? - iRuth
所有的按钮都是一样的。抱歉使用了数学符号;无论你看哪个按钮,下一个都具有相同的参数。 - user2875404
通过XML。实际上,它是RelativeLayout的自定义类,但现在这并不重要。 - user2875404
显示剩余3条评论
6个回答

34
使用方法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);

5
在Kotlin中,我们可以更简短、更优雅地完成这个任务。
view.layoutParams = view.layoutParams.apply {
    width = LayoutParams.MATCH_PARENT
    height = LayoutParams.WRAP_CONTENT
}

1
这很好,虽然我更喜欢扩展函数,因为它可以自动执行 setLayoutParams。(我会发布另一个答案) - aaaidan

5
如果你只想更改一个参数:
view.getLayoutParams().width = 400;
view.requestLayout();

2

由于我目前无法评论其他人的问题: 我为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
}

更新:现在这是一个KTX扩展 - Stephen Talley

1
作为其他答案所说:您需要获取 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 简直棒极了。


0
view.updateLayoutParams {
    width = LayoutParams.WRAP_CONTENT
    height = LayoutParams.WRAP_CONTENT
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接