在TextInputLayout中获取轮廓框的高度

时间:2019-11-20 23:10:01

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

我想要的是:

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

enter image description here

我尝试过的事情:

似乎没有公共api能让我了解轮廓的高度。 但是,在TextInputLayout中有private MaterialShapeDrawable boxBackground;,但它是私有的。

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

2 个答案:

答案 0 :(得分:2)

我建议您从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是否为null或为空。当这些视图可见时,可以减去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

}

答案 1 :(得分:0)

好问题!最好的选择是找到TextInput的DP,然后使用match parent方法将加法和减法按钮设置为与高度匹配。然后,您想将宽度设置为您的个人喜好,然后您的应用程序应该可以工作。如果您有任何问题,请阅读this,了解有关TextInputs的信息。如果仍然卡住,请切换到相对布局,然后将所有按钮的内容视图设置为常规按钮的dp。您随时可以估算。祝你好运!