我在textinputlayout中创建了一个edittext。在运行时,我在代码中将DrawableLeft设置为EditText,但只要添加DrawableLeft,textInputLayout中的浮动提示就会向右移动,留下与DrawableWidth相等的空间。但我不想在暗示空间,所以帮我解决这个问题!!
最佳答案
TextInputLayout
使用helper类来操作其提示文本。这个助手的实例是私有的,并且与它的布局相关联的属性都没有公开,因此我们需要使用一个小的反射来访问它。此外,它的属性在每次布局CollapsingTextHelper
时都会被设置和重新计算,因此对TextInputLayout
进行子类划分、重写其TextInputLayout
方法并在那里进行调整是有意义的。
import android.content.Context;
import android.graphics.Rect;
import android.support.design.widget.TextInputLayout;
import android.util.AttributeSet;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class CustomTextInputLayout extends TextInputLayout {
private Object collapsingTextHelper;
private Rect bounds;
private Method recalculateMethod;
public CustomTextInputLayout(Context context) {
this(context, null);
}
public CustomTextInputLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
adjustBounds();
}
private void init() {
try {
Field cthField = TextInputLayout.class.getDeclaredField("mCollapsingTextHelper");
cthField.setAccessible(true);
collapsingTextHelper = cthField.get(this);
Field boundsField = collapsingTextHelper.getClass().getDeclaredField("mCollapsedBounds");
boundsField.setAccessible(true);
bounds = (Rect) boundsField.get(collapsingTextHelper);
recalculateMethod = collapsingTextHelper.getClass().getDeclaredMethod("recalculate");
}
catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) {
collapsingTextHelper = null;
bounds = null;
recalculateMethod = null;
e.printStackTrace();
}
}
private void adjustBounds() {
if (collapsingTextHelper == null) {
return;
}
try {
bounds.left = getEditText().getLeft() + getEditText().getPaddingLeft();
recalculateMethod.invoke(collapsingTextHelper);
}
catch (InvocationTargetException | IllegalAccessException | IllegalArgumentException e) {
e.printStackTrace();
}
}
}
这个自定义类是常规
onLayout()
的替换项,您可以用同样的方式使用它。例如:<com.mycompany.myapp.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">
<android.support.design.widget.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.mycompany.myapp.CustomTextInputLayout>
笔记:
在移动到材质组件库中,helper类和边界的字段名已经删除了
TextInputLayout
前缀表示法。如注释中所述,它们现在分别命名为m
和collapsingTextHelper
。从api级别28(pie)开始,有一些Restrictions on non-SDK interfaces,包括反射,可以访问sdk中通常不可访问的成员。然而,各种可用的文档似乎表明,对您自己包中的组件的反射是不被禁止的。由于支持库不是平台sdk的一部分,并且在构建时会合并到您的包中,因此此解决方案应该仍然有效。实际上,最近的测试没有发现任何问题,这仍然可以在可用的pie模拟器上正常工作。
关于android - 如果edittext位于TextInputlayout内,则将drawableLeft添加到EditText会将提示向右移动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39530520/