android 在充气前获取xml中的按钮大小声明

ca1c2owp  于 11个月前  发布在  Android
关注(0)|答案(1)|浏览(74)

我正在创建一个自定义按钮MyButton扩展MaterialButton。用例是,有2个大小的按钮 * 大 * 和 * 小 *,大按钮将是全宽(类似于match_parent)和小按钮将有一些minWidth让我们说100dp,最重要的是,它们将有不同的填充不同的文本大小.在为MyButton编写自定义类时,我如何检查xml中提到的layout_heightlayout_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
           }

        }
    }

字符串

vzgqcmou

vzgqcmou1#

我通常使用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_widthlayout_height,而不知道其确切大小,只需检查LayoutParams即可。

if (yourview.layoutParams.height == ViewGroup.LayoutParams.MATCH_PARENT) {
    // Do something
}

相关问题