android 如果edittext位于TextInputlayout内部,则将drawableLeft添加到editText会将提示向右移动

hvvq6cgz  于 2023-03-21  发布在  Android
关注(0)|答案(3)|浏览(119)

x1c 0d1x我在TextInputLayout中创建了一个EditText。我在代码运行时将drawableLeft设置为EditText,但是一旦我添加了drawableLeft,TextInputLayout中的浮动提示就会向右移动,留下与可绘制宽度相等的空间。但是我不希望提示中出现该空间,所以请帮助我解决这个问题!!

p8ekf7hl

p8ekf7hl1#

TextInputLayout使用一个库限制的helper类-CollapsingTextHelper-来操作它的提示文本。这个helper的示例是私有的,并且没有任何与它的布局相关的属性被公开,所以我们需要使用一点反射来访问它。此外,它的属性在每次TextInputLayout布局时被设置和重新计算。因此子类化TextInputLayout、覆盖其onLayout()方法并在那里进行调整是有意义的。

import android.content.Context
import android.graphics.Rect
import android.util.AttributeSet
import com.google.android.material.textfield.TextInputLayout

class CustomTextInputLayout @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = com.google.android.material.R.attr.textInputStyle
) : TextInputLayout(context, attrs, defStyleAttr) {

    private val collapsingTextHelper = try {
        TextInputLayout::class.java.getDeclaredField("collapsingTextHelper")
            .apply { isAccessible = true }.get(this)
    } catch (e: Exception) {
        null
    }

    private val recalculateMethod = collapsingTextHelper?.let { helper ->
        try {
            helper.javaClass.getDeclaredMethod("recalculate")
        } catch (e: Exception) {
            null
        }
    }

    private val collapsedBounds = collapsingTextHelper?.let { helper ->
        try {
            helper.javaClass.getDeclaredField("collapsedBounds")
                .apply { isAccessible = true }.get(helper) as Rect
        } catch (e: Exception) {
            null
        }
    }

    override fun onLayout(
        changed: Boolean,
        left: Int,
        top: Int,
        right: Int,
        bottom: Int
    ) {
        super.onLayout(changed, left, top, right, bottom)

        val edit = editText ?: return
        val helper = collapsingTextHelper ?: return
        val recalculate = recalculateMethod ?: return
        val bounds = collapsedBounds ?: return

        bounds.left = edit.left + edit.paddingLeft
        try {
            recalculate.invoke(helper)
        } catch (e: Exception) {
            // fail silently
        }
    }
}

自定义类是常规TextInputLayout的直接替代。例如:

<com.example.app.CustomTextInputLayout
    android:id="@+id/text_input_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Model (Example i10, Swift, etc.)"
    app:hintTextAppearance="@style/TextLabel">

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableLeft="@drawable/bmw"
        android:text="M Series" />

</com.example.app.CustomTextInputLayout>

h5qlskok

h5qlskok2#

是的,这是我最近遇到的一个常见问题。我用简单的一行代码解决了它:使用drawble padding在hint和drawbleleft之间添加一个填充。如果你在运行时添加drawble,只需在xml中添加drawblepadding,或者你可以动态添加drawble填充。

juud5qan

juud5qan3#

editText.setCompoundDrawablePadding(your padding value);

试试看,然后告诉我。对我很有效。

相关问题