TextInputLayout: как дать отступы или поля для подсказки?

Я должен использовать TextInputLayout библиотеки поддержки дизайна в моем проекте. Я хочу выделить пространство между hint и EditText в TextInputLayout . Я устанавливал margin и padding в TextInputLayout и даже внутри EditText но оба они не работают. Так как решить эту проблему. Здесь я прикрепляю снимок экрана и мое кодирование.

 ==============================Style================================= <style name="TextHint" parent="Base.TextAppearance.AppCompat"> <item name="android:textSize">18sp</item> <item name="android:textColor">@color/green</item> </style> =============================XML=================================== <android.support.design.widget.TextInputLayout android:layout_width="match_parent" app:hintTextAppearance="@style/TextHint" android:layout_marginTop="10dp" android:layout_marginLeft="30dp" android:layout_marginRight="30dp" android:layout_height="wrap_content"> <EditText android:layout_width="match_parent" android:layout_height="50dp" android:id="@+id/edttxtEmailAddress" android:singleLine="true" android:hint="@string/enter_valid_email" android:paddingLeft="20dp" android:textSize="20sp" android:background="@drawable/rounded_common"/> </android.support.design.widget.TextInputLayout> 

Введите описание изображения здесь

Solutions Collecting From Web of "TextInputLayout: как дать отступы или поля для подсказки?"

Решение, предложенное ganesh2shiv, работает по большей части, хотя я обнаружил, что он также децентрализует текст подсказки, отображаемый внутри EditText, когда он не сфокусирован.

Лучший трюк заключается в том, чтобы установить желаемый paddingTop в EditText, но также paddingTop дополнительные дополнения в фон EditText. Достаточно разумный способ сделать это – обернуть исходный фон в <layer-list> и установить атрибут <item android:top="..."> для соответствия paddingTop вашего EditText.

 <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="@dimen/floating_hint_margin" android:background="@drawable/bg_edit_text" /> </android.support.design.widget.TextInputLayout> 

И файл bg_edit_text.xml :

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:top="@dimen/floating_hint_margin"> <your original background; can be <bitmap> or <shape> or whatever./> </item> </layer-list> 

Я искал решение этого вопроса за последние пару дней. После разрыва моих волос часами я наконец нашел простой способ обхода. Я заметил, что если у вас есть пользовательский фон, установленный в EditText, атрибут android: paddingTop simple не работает, чтобы изменить интервал b / w текста подсказки и отредактировать текст (я действительно не знаю, почему). Поэтому, если вы установили пользовательский фон в свой EditText, вы можете использовать атрибут android: translationY в EditText .

Итак, вот ваше решение:

 <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="30dp" android:layout_marginRight="30dp" android:layout_marginTop="10dp" app:hintTextAppearance="@style/TextHint"> <EditText android:id="@+id/edttxtEmailAddress" android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/rounded_common" android:hint="@string/enter_valid_email" android:paddingLeft="20dp" android:translationY="10dp" android:singleLine="true" android:textSize="20sp" /> </android.support.design.widget.TextInputLayout> 

Надеюсь, поможет. 🙂


Обновление: Мои искренние извинения за последнее обновление. В последнее время я очень занят. Если вы еще не поняли, позвольте мне сказать вам, что этот ответ прямо уродливый и неправильный . В ретроспективе я думаю, что, вероятно, был пьян, когда писал. Как уже упоминалось другими, он может обрезать нижнюю область фона editText, но также есть уродливое исправление: вы можете установить высоту (родительского) textInputLayout более крупным (насколько велика ваша предполагаемая находка, Error, yuck!), Чем (child) editText. Надеюсь, вы все поймете, что это будет безумие, поэтому, пожалуйста, не делайте этого. Проверьте ответ, написанный @Radu Topor, это, безусловно, лучшее и чистое решение этого вопроса. Благодарю.

Я попробовал изменения дополнений, но это не работает.

Простым обходным путем является изменение высоты TIL:

 android:layout_height="wrap_content" 

К (например)

 android:layout_height="50dp" 

Это может не дать тот же результат во всех размерах экрана.

И добавить

 android:gravity="bottom" 

Чтобы вывести текст вниз.

Ответ @RaduTopor хорош, но я думаю, что нам также нужно добавить android: bottom, иначе он также децентрует текст подсказки, отображаемый внутри EditText, когда он не сфокусирован

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:top="@dimen/floating_hint_margin" android:bottom="@dimen/floating_hint_margin"> <your original background; can be <bitmap> or <shape> or whatever./> </item> </layer-list> 

Прежде чем (ответ RaduTopor):

Не центрированный

После:

в центре

Я сделал специальный класс с целью добавления пустого представления над EditText, таким образом добавив дополнение для подсказки. Вы можете использовать его как простой TextInputLayout.

 public class PaddingTextInputLayout extends TextInputLayout { public View paddingView; public PaddingTextInputLayout(Context context) { super(context); } public PaddingTextInputLayout(Context context, AttributeSet attrs) { super(context, attrs); } public PaddingTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void addView(View child, int index, ViewGroup.LayoutParams params) { super.addView(child, index, params); refreshPaddingView(); } public void addPaddingView(){ paddingView = new View(getContext()); int height = (int) getContext().getResources() .getDimension(R.dimen.edittext_text_input_layout_padding); ViewGroup.LayoutParams paddingParams = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, height); super.addView(paddingView, 0, paddingParams); } public void refreshPaddingView(){ if (paddingView != null) { removeView(paddingView); paddingView = null; } addPaddingView(); } } 

Эта реализация очень проста и глупа, вы можете ее улучшить.

Просто добавьте к своему настраиваемому фону EditText

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <padding android:top="4dp"/> // your padding value </shape> </item> // customize your background items if you need </layer-list> <android.support.design.widget.TextInputLayout ...> <android.support.design.widget.TextInputEditText ... android:background="@style/your_custom_background"/> 

Затем примените его к вашему EditText и увеличьте высоту вашего EditText с помощью дополнительного значения, если вы используете фиксированную высоту

Я думаю, вы должны это учитывать:

Библиотека дизайна имеет интересный подход к настройке EditText : она не меняет его напрямую. Вместо этого TextInputLayout используется для переноса EditText и предоставления улучшений.

Первый, отображающий плавающую метку, когда пользователь вводит что-то в поле, выполняется автоматически. TextInputLayout находит EditText среди своих дочерних TextWatcher и присоединяется к нему как TextWatcher , поэтому он может определить, когда поле было изменено и анимация движения намека с его обычного места в EditText на позицию плавающей метки над ним.

Второе улучшение, отображающее сообщение об ошибке, требует небольшого изменения кода. Вместо того, чтобы устанавливать ошибку в EditText, ошибка должна быть установлена ​​в TextInputLayout . Это связано с тем, что для TextInputLayout нет автоматического способа уведомления, если ошибка установлена ​​в EditText . Вот как выглядит макет:

 <android.support.design.widget.TextInputLayout android:id="@+id/username_text_input_layout" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/username_edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/username_hint"/> </android.support.design.widget.TextInputLayout> 

Обратите внимание, что для идентификаторов макета EditText и TextInputLayout требуются идентификаторы макетов. В этом фрагменте нам нужно настроить TextInputLayout для отображения ошибок:

 TextInputLayout usernameTextInputLayout = (TextInputLayout) view.findViewById(R.id.username_text_input_layout); usernameTextInputLayout.setErrorEnabled(true); ... usernameTextInputLayout.setError(R.string.username_required);