我知道如何使用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[...]
提前多多感谢。
答案 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
}