在TextInputLayout中获取轮廓框的高度

问题描述 投票:3回答:2

我想要的是:

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

enter image description here

我尝试过的事情:

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

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

android android-textinputlayout material-components material-components-android android-textinputedittext
2个回答
0
投票

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


0
投票

我建议您从design docs开始查找默认大小。

以下内容不会获得轮廓的高度,但是无论如何都会使它对齐。

在您的组件中,可以将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或您初始化的任何地方

init {

    viewTreeObserver.addOnGlobalLayoutListener(object :
        ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            textInputLayout.editText?.measuredHeight?.let {           
                val topMargin = 16.dpToPx()
                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

}
© www.soinside.com 2019 - 2024. All rights reserved.