TextInputLayout анимация перекрывает текст, когда текст установлен программно

Я использую TextInputLayout с библиотекой поддержки дизайна 22.2.1.

Я программно устанавливаю значение EditText, и когда появляется экран, я вижу, что подсказка TextInputLayout перекрывает текст внутри, прежде чем перемещаться в плавающее положение.

Вот простой макет:

    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="hint1" />

    </android.support.design.widget.TextInputLayout> 

В моем Activity:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        EditText e1 = (EditText) findViewById(R.id.editText1);
        e1.setText("TEXT TEST 1");
   }

Кто-нибудь знает обходное решение?

enter image description here

Ответы

Ответ 1

В настоящее время единственный способ избежать этого поведения - добавить программный код EditText.

  • Создайте TextInputLayout без EditText. Программно или через инфляцию XML - не имеет значения, но она должна быть пустой.
  • Создайте EditText и установите его текст на все, что вам нужно.
  • Добавьте EditText в TextInputLayout.

Вот пример:

TextInputLayout til = (TextInputLayout) findViewById(R.id.til);
til.setHint(R.string.hint);

EditText et = new EditText(getContext());
et.setText(value);

til.addView(et);

ОБНОВЛЕНО 21/08/2015 С ДИЗАЙН-БИБЛИОТЕКОЙ V23:

В библиотеке поддержки дизайна v23 вы можете отключить анимацию:

Просто используйте метод setHintAnimationEnabled:

textInputLayout.setHintAnimationEnabled(boolean)

Здесь проблема Google Tracker.

Ответ 2

Недавно я столкнулся с этой проблемой при использовании DialogFragment. Чтобы решить, просто отключите анимацию подсказки, если у вас есть значение в поле, прежде чем устанавливать значение поля. Порядок важен.

Например,

TextInputLayout layout = (TextInputLayout) findViewById(R.id.text_layout);
TextInputEditText edit = (TextInputEditText) findViewById(R.id.text_edit);

String fieldValue = "Something";

layout.setHintAnimationEnabled(fieldValue == null);
edit.setText(fieldValue);

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