TextInputLayout отключить анимацию

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

Мне не нужна эта анимация, хотя, если я ее программным способом, возможно ли это? Вот мой код:

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/root">

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

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

И в onResume я делаю:

    TextInputLayout root = (TextInputLayout)findViewById(R.id.root);
    EditText et = (EditText)root.findViewById(R.id.editText1);
    et.setText("Actual text");
    root.setHint("Hint");

Ответы

Ответ 1

Я нашел (громоздкий) способ сделать это. Заглянув в исходный код TextInputLayout, я обнаружил, что единственный случай, когда класс не обновляет его, подсказывает анимацию, когда к ней добавляется EditText. Единственное препятствие состоит в том, что вы можете добавить его только один раз в макет, как только он там, он будет постоянно привязан к нему, и нет способа удалить его.

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

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

Вот пример:

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

EditText fieldView = new EditText(hintView.getContext());
fieldView.setText(value);

hintView.addView(fieldView);

К сожалению, если вы хотите установить текст на что-то еще без анимации, вам придется повторить все эти шаги, за исключением создания нового EditText (последнее можно использовать повторно). Я надеюсь, что Google сможет это исправить, потому что это действительно неудобно, но пока что то, что у нас есть.

Обновление:, это, к счастью, исправлено в библиотеке дизайна 23.0.0, поэтому просто обновляйте эту версию, и вам не придется делать все это безумное.

Ответ 2

Начиная с v23 поддержки libs, был добавлен метод setHintAnimationEnabled . Ниже представлены документы. Таким образом, вы можете установить этот новый атрибут на false в XML, а затем программно установить его на true после того, как вы закончите заполнять editText. ИЛИ просто обрабатывайте все программно, при необходимости.

Итак, в вашем примере это станет чем-то вроде:

TextInputLayout root = (TextInputLayout)findViewById(R.id.root);
root.setHintAnimationEnabled(false);
root.setHint("Hint");

EditText et = (EditText)root.findViewById(R.id.editText1);
et.setText("Actual text");

// later...
root.setHintAnimationEnabled(true);

Конечно, обязательно откройте свой Android SDK Manager и обновите свою библиотеку поддержки Android до версии. 23 и репозитарий поддержки Android. 17, а затем добавьте это для сборки .gradle с помощью:

compile 'com.android.support:design:23.0.0'

Обратите внимание, что поскольку библиотека Design зависит от библиотек поддержки поддержки v4 и AppCompat, они автоматически включаются при добавлении зависимостей библиотеки Design.

Ответ 3

Я дам вам простой код, и вам не нужно делать все программно, просто добавляя атрибут xlm и все.

<android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:hintAnimationEnabled="true"
                app:passwordToggleEnabled="true">

                <EditText
                    android:id="@+id/password_field_activity_login"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@android:color/transparent"
                    android:hint="@string/password"
                    android:inputType="textPassword"
                    android:padding="10dp"
                    android:textColor="@color/color_holo_light_gray"
                    android:textColorHint="@color/color_holo_light_gray"
                    android:textCursorDrawable="@drawable/cursor_drawable" />

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

Надеюсь, что это поможет

Ответ 4

Я просматриваю идеи о библиотеке поддержки v23 - он пока не работает: (Программная вставка EditText непригодна для использования, если вы хотите использовать databinding labrary

В результате исследования я нашел решение без полного отключения анимации:

layout.xml

<android.support.design.widget.TextInputLayout
     android:id="@+id/text_til"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:hint="@string/product_title_placeholder">
     <android.support.design.widget.TextInputEditText
          android:id="@+id/text_tiet"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:text="@={bindingText}"/>
 </android.support.design.widget.TextInputLayout>

Activity.java

final TextInputLayout textLayout = (TextInputLayout) findViewById(R.id.text_til);
if(binding.getText() != null) {
   // disable animation
   textLayout.setHintAnimationEnabled(false);
   final TextInputEditText editText = (TextInputEditText) titleLayout.findViewById(R.id.text_tiet);
   editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
       @Override
       public void onFocusChange(View view, boolean b) {
           // enable animation after layout inflated
           textLayout.setHintAnimationEnabled(true);
           editText.setOnFocusChangeListener(null);
       }
   });
}
// manage focus for new binding object
((View)textLayout .getParent()).setFocusableInTouchMode(binding.getText() == null);

Он выглядит не красиво, но он работает:)