在自定义视图组的 onLayout 方法中调用 setLayoutParams() 没有任何作用
Calling setLayoutParams() in onLayout method of custom view group does nothing
我正在扩展 RelativeLayout 并想在 onLayout 方法中设置我的 childViews 的位置。所以这是代码:
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
val margin = Math.round(beautyButton!!.measuredWidth * 1.75).toInt()
beautyButton!!.visibility = View.GONE
var params = defaultSeekbar!!.layoutParams as RelativeLayout.LayoutParams
params.setMargins(margin,0,margin,0)
params.addRule(CENTER_IN_PARENT)
params.removeRule(ALIGN_PARENT_START)
params.removeRule(START_OF)
var params2 = beautySeekbar!!.layoutParams as RelativeLayout.LayoutParams
params2.setMargins(margin,0,margin,0)
params2.addRule(CENTER_IN_PARENT)
params2.removeRule(ALIGN_PARENT_START)
params2.removeRule(START_OF)
super.onLayout(changed, l, t, r, b)
}
我想根据按钮的大小设置搜索栏的位置。
而这什么都不做。我也试过类似的方法,但结果是一样的。
defaultSeekbar!!.layout(margin,defaultSeekbar!!.measuredWidth,margin,defaultSeekbar!!.measuredHeight)
谁能帮我弄清楚如何在将子视图绘制到屏幕之前设置它们的位置?
先谢谢大家的解答!
您缺少一些代码。您不能只检索 View 的 LayoutParams 然后修改它们,因为框架需要某种方式来知道它们已经更新。
添加这些行:
defaultSeekbar!!.layoutParams = params
beautySeekbar!!.layoutParams = params2
请记住,Kotlin 喜欢将 Java setter/getter 方法转换为它所谓的 属性 访问语法,它们看起来像变量。要注意的是 View#setLayoutParams()
不只是更改视图中的变量。它还会调用其他一些东西,以便框架知道该视图已更改。
另一件事。我猜你正在做 !!
因为你没有立即初始化 SeekBars。您可以使用惰性初始化语法,如果它适合您的情况(我不知道,因为您没有发布该代码):
defaultSeekbar by lazy { findViewById<WhateverClass>(R.id.whatever) }
beautySeekbar by lazy { findViewById<WhateverClass>(R.id.whatever2) }
它们只有在被调用后才会被初始化,然后那个实例将保留。
我正在扩展 RelativeLayout 并想在 onLayout 方法中设置我的 childViews 的位置。所以这是代码:
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
val margin = Math.round(beautyButton!!.measuredWidth * 1.75).toInt()
beautyButton!!.visibility = View.GONE
var params = defaultSeekbar!!.layoutParams as RelativeLayout.LayoutParams
params.setMargins(margin,0,margin,0)
params.addRule(CENTER_IN_PARENT)
params.removeRule(ALIGN_PARENT_START)
params.removeRule(START_OF)
var params2 = beautySeekbar!!.layoutParams as RelativeLayout.LayoutParams
params2.setMargins(margin,0,margin,0)
params2.addRule(CENTER_IN_PARENT)
params2.removeRule(ALIGN_PARENT_START)
params2.removeRule(START_OF)
super.onLayout(changed, l, t, r, b)
}
我想根据按钮的大小设置搜索栏的位置。 而这什么都不做。我也试过类似的方法,但结果是一样的。
defaultSeekbar!!.layout(margin,defaultSeekbar!!.measuredWidth,margin,defaultSeekbar!!.measuredHeight)
谁能帮我弄清楚如何在将子视图绘制到屏幕之前设置它们的位置?
先谢谢大家的解答!
您缺少一些代码。您不能只检索 View 的 LayoutParams 然后修改它们,因为框架需要某种方式来知道它们已经更新。
添加这些行:
defaultSeekbar!!.layoutParams = params
beautySeekbar!!.layoutParams = params2
请记住,Kotlin 喜欢将 Java setter/getter 方法转换为它所谓的 属性 访问语法,它们看起来像变量。要注意的是 View#setLayoutParams()
不只是更改视图中的变量。它还会调用其他一些东西,以便框架知道该视图已更改。
另一件事。我猜你正在做 !!
因为你没有立即初始化 SeekBars。您可以使用惰性初始化语法,如果它适合您的情况(我不知道,因为您没有发布该代码):
defaultSeekbar by lazy { findViewById<WhateverClass>(R.id.whatever) }
beautySeekbar by lazy { findViewById<WhateverClass>(R.id.whatever2) }
它们只有在被调用后才会被初始化,然后那个实例将保留。