Я создал EditText внутри TextInputLayout. Я устанавливаю drawableLeft в EditText во время выполнения в моем коде, но как только я добавляю drawableLeft, плавающий подсказку внутри TextInputLayout сдвигается вправо, оставляя пространство равным ширине. Но я не хочу этого места в подсказке, так что помогите мне решить это!Добавление drawableLeft в EditText сдвигает подсказку вправо, если edittext находится внутри TextInputlayout
ответ
TextInputLayout
использует вспомогательный класс - CollapsingTextHelper
- для управления текстом подсказки. Экземпляр этого помощника является закрытым, и ни один из атрибутов, связанных с его компоновкой, не отображается, поэтому нам нужно будет немного подумать, чтобы получить к нему доступ. Кроме того, его свойства устанавливаются и пересчитываются каждый раз, когда выкладывается 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>
Его не работает теперь возвращается ошибка ** CollapsingTextHelper не является публичной в android.support.design.widget; невозможно получить из внешнего пакета ** –
Просто удалите 'CollapsingTextHelper'' import' в верхней части класса. На самом деле это не используется нигде в этом примере. Я просто забыл очистить импорт, прежде чем я разместил, по-видимому. –
Спасибо за его работу. –
Да, это общая проблема, с которой я столкнулся в последнее время. Я решил ее с помощью простого кода одной строки: Поместите отступы между вашим подсказкой и drawbleleft
с помощью drawble padding
. Если вы добавляете drawble во время выполнения, просто добавьте drawblepadding
в xml перед рукой или вы можете динамически добавлять отложенную прокладку.
editText.setCompoundDrawablePadding(your padding value);
Попробуйте и дайте мне знать. Это сработало для меня.
- 1. Невозможно использовать drawable в EditText внутри TextInputLayout
- 2. «Элемент EditText не разрешен здесь» внутри TextInputLayout
- 3. Почему drawableLeft появляется вне EditText?
- 4. TextInputLayout не влияет на программную подсказку в EditText
- 5. TextInputLayout и EditText проблема с двумя подсказками
- 6. Установить размер шрифта EditText в TextInputLayout программно
- 7. Подсказка TextInputLayout и EditText видима
- 8. TextInputLayout EditText gravity не работает
- 9. Позиционирующий намек в многострочном файле EditText - TextInputLayout
- 10. Текст TextInputLayout перемещается параллельно тексту EditText
- 11. Изменить цвет подсказки EditText при использовании TextInputLayout
- 12. Переместить текст в EditText вправо
- 13. Отображение курсора внутри EditText, когда фокус не находится на EditText
- 14. Изображение с помощью drawableLeft не помещается внутри поля EditText
- 15. Добавить/удалить EditText в/из TextInputLayout
- 16. Пролистайте внутри EditText, который находится в ScrollView
- 17. Как изменить размер подсказки EditText в TextInputLayout
- 18. Как стилизовать виджет EditText в TextInputLayout
- 19. Ошибка TextInputLayout после ввода значения в edittext
- 20. TextInputLayout Счетчик EditText запускает экран в LinearLayout
- 21. Настроить размер EditText на подсказку
- 22. Android: TextInputLayout не будет центрировать подсказку
- 23. TextInputLayout EditText nextFocusRight не работает как следует
- 24. android: TextInputLayout hides drawableRight of child EditText
- 25. Добавление Charecters в EditText
- 26. DrawableLeft получает совпадение с подсказкой с использованием TextInputLayout android
- 27. TextInputLayout, EditText Подсказка Анимация, Скрыть Подсказка
- 28. Я не могу использовать TextInputLayout для EditText
- 29. Изменить шрифт плавающей метки EditText и TextInputLayout
- 30. Добавление editText в customView
пожалуйста, напишите ваш XML –
Использование _setCompoundDrawablePadding_ – Piyush