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);
Он выглядит не красиво, но он работает:)