x1c 0d1x我在TextInputLayout中创建了一个EditText。我在代码运行时将drawableLeft设置为EditText,但是一旦我添加了drawableLeft,TextInputLayout中的浮动提示就会向右移动,留下与可绘制宽度相等的空间。但是我不希望提示中出现该空间,所以请帮助我解决这个问题!!
p8ekf7hl1#
TextInputLayout使用一个库限制的helper类-CollapsingTextHelper-来操作它的提示文本。这个helper的示例是私有的,并且没有任何与它的布局相关的属性被公开,所以我们需要使用一点反射来访问它。此外,它的属性在每次TextInputLayout布局时被设置和重新计算。因此子类化TextInputLayout、覆盖其onLayout()方法并在那里进行调整是有意义的。
TextInputLayout
CollapsingTextHelper
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>
h5qlskok2#
是的,这是我最近遇到的一个常见问题。我用简单的一行代码解决了它:使用drawble padding在hint和drawbleleft之间添加一个填充。如果你在运行时添加drawble,只需在xml中添加drawblepadding,或者你可以动态添加drawble填充。
drawble padding
drawbleleft
drawblepadding
juud5qan3#
editText.setCompoundDrawablePadding(your padding value);
试试看,然后告诉我。对我很有效。
3条答案
按热度按时间p8ekf7hl1#
TextInputLayout
使用一个库限制的helper类-CollapsingTextHelper
-来操作它的提示文本。这个helper的示例是私有的,并且没有任何与它的布局相关的属性被公开,所以我们需要使用一点反射来访问它。此外,它的属性在每次TextInputLayout
布局时被设置和重新计算。因此子类化TextInputLayout
、覆盖其onLayout()
方法并在那里进行调整是有意义的。自定义类是常规
TextInputLayout
的直接替代。例如:h5qlskok2#
是的,这是我最近遇到的一个常见问题。我用简单的一行代码解决了它:使用
drawble padding
在hint和drawbleleft
之间添加一个填充。如果你在运行时添加drawble,只需在xml中添加drawblepadding
,或者你可以动态添加drawble填充。juud5qan3#
试试看,然后告诉我。对我很有效。