gpt4 book ai didi

android - 如果 edittext 在 TextInputlayout 中,则将 drawableLeft 添加到 EditText 会将提示向右移动

转载 作者:可可西里 更新时间:2023-11-01 19:10:11 27 4
gpt4 key购买 nike

enter image description here我在 TextInputLayout 中制作了一个 EditText。我在运行时在我的代码中将 drawableLeft 设置为 EditText,但是一旦我添加 drawableLeft,TextInputLayout 内的 float 提示就会向右移动,使空间等于可绘制宽度。但是我不想在暗示中有那个空间,所以请帮我解决这个问题!!

最佳答案

TextInputLayout 使用辅助类 - CollapsingTextHelper - 来操作其提示文本。这个助手的实例是私有(private)的,并且没有暴露与其布局关联的任何属性,因此我们需要使用一点反射来访问它。此外,每次布局 TextInputLayout 时都会设置和重新计算其属性,因此子类 TextInputLayout 覆盖其 onLayout() 是有意义的方法,并在那里进行调整。

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();
}
}
}

此自定义类是常规 TextInputLayout 的直接替代品,您将以相同的方式使用它。例如:

<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>

screenshot


注意事项:

  • 在迁移到 Material Components 库时,辅助类和边界的字段名称已删除 m 前缀表示法。如评论中所述,它们现在分别命名为 collapsingTextHelpercollapsedBounds

  • 从 API 级别 28 (Pie) 开始,有某些 Restrictions on non-SDK interfaces ,包括反射,以访问 SDK 中通常无法访问的成员。然而,各种可用的文档似乎表明不禁止对您自己的包中的组件进行反射。由于支持库不是平台 SDK 的一部分,并在构建时合并到您的包中,因此该解决方案应该仍然有效。事实上,最近的测试没有发现任何问题,并且这在可用的 Pie 模拟器上仍然可以正常工作。

关于android - 如果 edittext 在 TextInputlayout 中,则将 drawableLeft 添加到 EditText 会将提示向右移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39530520/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com