【问题标题】:Get height of outline box in TextInputLayout获取TextInputLayout中轮廓框的高度
【发布时间】:2020-03-16 18:56:50
【问题描述】:

我想要什么:

我正在构建一个如下所示的组件,其中+- 按钮的高度需要与 TextInputLayout 的轮廓高度匹配。

我尝试了什么:

似乎没有公共 api 可以让我获得轮廓的高度。 但是,在TextInputLayout 中有private MaterialShapeDrawable boxBackground;,但它是私有的。

如何使我的按钮与轮廓的高度相匹配?

【问题讨论】:

    标签: android android-textinputlayout material-components material-components-android android-textinputedittext


    【解决方案1】:

    我建议您从google material guidelines 开始查找默认大小。

    以下不会得到轮廓的高度,但无论如何它都会对齐它,因为我之前使用过类似的东西。

    在您的组件中,您可以在 init 或初始化组件的任何位置将 GlobalLayoutListener 添加到 viewTreeObserver,这样您就可以获得正确的 TextInputLayout 大小,否则您将始终为 0。 在 OnGlobalLayout() 方法中,您必须进行一些计算。

    1. 你必须找出TextInputLayout中EditText的大小。
    2. 随着 EditText 的大小,您必须增加按钮的高度/宽度
    3. 通过使用文档,我假设 Error/HelperText 可见时将始终将小部件的大小增加 16。
    4. 所以得到 textInputLayout 的测量大小并减去 EditText 的大小。那应该是您的按钮新的顶部填充,但是因为当 Error/HelperText 可见时,它会改变小部件的大小并使您的布局错位,因此您可以检查 TextInputLayout helperText/error 是否为空或空,并使用上面的假设当这些视图可见时可以减去 16dp,它会将视图向下推,与 EditText 正确对齐,而不是与 Hint 对齐。

    例如。

    初始化或初始化它的任何地方

    init {
    
        viewTreeObserver.addOnGlobalLayoutListener(object :
            ViewTreeObserver.OnGlobalLayoutListener {
            override fun onGlobalLayout() {
                textInputLayout.editText?.measuredHeight?.let {           
                    val topMargin = 16.dpToPx() //Mentioned in the step #3
                    val value = if (!textInputLayout.helperText.isNullOrEmpty()) {
                        (textInputLayout.measuredHeight - topMargin) - it
                    } else {
                        textInputLayout.measuredHeight - it
                    }
    
                    increaseButtonSize(it, value)
    
                }
                viewTreeObserver.removeOnGlobalLayoutListener(this)
            }
        })
    
    }
    

    增加按钮的大小

    fun increaseButtonSize(size: Int, padding: Int) {
    
        val lessButtonParams: LayoutParams = lessButton.layoutParams as LayoutParams
        lessButtonParams.setMargins(lessButtonParams.leftMargin, padding, lessButtonParams.rightMargin, lessButtonParams.bottomMargin)
        lessButtonParams.height = size
    
        lessButton.layoutParams = lessButtonParams
    
        val moreButtonParams: LayoutParams = moreButton.layoutParams as LayoutParams
        params.setMargins(moreButtonParams.leftMargin, padding, moreButtonParams.rightMargin, moreButtonParams.bottomMargin)
        params.height = size
    
        moreButton.layoutParams = params
    
    }
    

    【讨论】:

    • 这行得通,谢谢!!仅供参考,在我的小部件中,我允许用户通过自定义属性在 TextInputLayout 上帮助文本等,但请确保在通过 viewTreeObserver 设置高度之后设置它们,否则按钮将与轮廓不匹配
    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2019-11-23
    • 2012-06-23
    • 2018-09-12
    • 1970-01-01
    • 2010-10-20
    • 2020-12-08
    相关资源
    最近更新 更多