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

时间:2015-02-02 01:09:00

标签: android view params

我知道如何使用LayoutParams通过执行以下操作来设置视图的宽度和高度:

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

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

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[...]

提前多多感谢。

6 个答案:

答案 0 :(得分:27)

使用方法getLayoutParams()的整个目的是从View中获取现有的(保留所有规则和内容)。然后,您可以修改那些LayoutParams的特定参数,并保持其余部分不被修改。因此,如果您的getLayoutParams()在xml中的设置不同,则需要来调用Views并修改返回的对象。如果他们在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);

答案 1 :(得分:1)

Kotlin 中,我们可以做得更短更优雅:

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

答案 2 :(得分: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简直太棒了。

答案 3 :(得分:0)

由于我尚无法评论其他人: 我为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
}

答案 4 :(得分:0)

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

view.getLayoutParams().width = 400;
view.requestLayout();

答案 5 :(得分:0)

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