我正在创建一个自定义按钮
MyButton
扩展 MaterialButton
。用例是按钮有两种尺寸:large和small,大按钮将是全宽(类似于match_parent
),小按钮将有一些minWidth
,比如说100dp,最重要的是它们将具有不同的填充和不同的文本大小。
在为 MyButton
编写自定义类时,如何检查 xml 中提到的 layout_height
和 layout_width
是什么,以便我可以采取适当的操作来设置正确的 UI?
我尝试获取视图高度和宽度,但它们将以 0 的形式出现,因为那时它们尚未完全放置。 我也尝试过使用
doOnLayout{ }
但这也没有在 MyButton
类中被调用。
我还尝试了 button_size
的自定义属性,并基于该属性设置布局参数,但也不起作用。
所以我希望如果能以某种方式得到xml中声明的内容(主要是
layout_width
),这样我就可以相应地更新其他属性。
例如
open class MyButton @JvmOverloads constructor(
context: Context,
private val attributeSet: AttributeSet? = null,
private val styleAttribute: Int = com.google.android.material.R.attr.materialButtonStyle) :
MaterialButton(context, attributeSet, styleAttribute) {
init{
attributeSet?.let { parseAttr(it) }
}
private fun parseAttr(attr: AttributeSet) {
if (/* need to check if the declared layout_width is match_parent*/){
// set some padding and text style
} else {
// set some different padding and texy style
}
}
}
我通常使用
addOnGlobalLayoutListener
在视图完全渲染后执行操作:
像这样定义扩展:
fun View.runOnRendered(onRendered: () -> Unit) {
viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
viewTreeObserver.removeOnGlobalLayoutListener(this)
onRendered()
}
})
}
在你的
MyButton
init 方法中
init {
runOnRendered {
// Check your view width or height
}
}
--------------------已更新--------------------
如果您只想检查
layout_width
或layout_height
而不知道其确切尺寸,只需检查LayoutParams
if (yourview.layoutParams.height == ViewGroup.LayoutParams.MATCH_PARENT) {
// Do something
}