在膨胀之前获取 xml 中声明的属性值

问题描述 投票:0回答:1

我正在创建一个自定义按钮

MyButton
扩展
MaterialButton
。用例是按钮有两种尺寸:largesmall,大按钮将是全宽(类似于
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
           }

        }
    }
android kotlin android-layout material-design
1个回答
0
投票

我通常使用

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
}
© www.soinside.com 2019 - 2024. All rights reserved.