textinputedittext android

android - textinputedittext



TextInputLayout desactivar la animaciĆ³n (5)

Estoy usando TextInputLayout para implementar el patrón de etiqueta flotante. Sin embargo, cuando configuro el texto mediante programación en el texto de edición, todavía obtengo la animación de la etiqueta moviéndose del control a la etiqueta, de la misma forma que si el usuario la hubiera hecho clic.

No quiero esta animación aunque si la programo, ¿es esto posible? Aquí está mi código:

<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>

Y en el onResume hago:

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


A partir de v23 de las setHintAnimationEnabled soporte, se ha agregado un método setHintAnimationEnabled . Aquí están los documentos . Por lo tanto, puede establecer este nuevo atributo en false en el XML y luego programarlo en true después de que haya terminado de llenar el texto de edición. O simplemente manéjelo todo programáticamente, según sea necesario.

Entonces en tu ejemplo, eso se convertiría en algo como:

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);

Por supuesto, asegúrese de abrir su administrador de SDK de Android y actualizar su biblioteca de soporte de Android a rev. 23 y repositorio de soporte de Android para rev. 17 primero y luego agregue eso a build.gradle a través de:

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

Tenga en cuenta que, dado que la biblioteca de diseño depende de las bibliotecas de soporte de v4 y de AppCompat, éstas se incluirán automáticamente cuando agregue la dependencia de la biblioteca de diseño.


Compruebo ideas sobre la biblioteca de soporte v23: aún no funciona :( La inserción programática de EditText no se puede utilizar si desea utilizar labrary de enlace de datos

Como resultado de la investigación, encontré una solución sin desactivar completamente la animación:

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>

Actividad.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);

No se ve bien, pero funciona :)


Escribí un pequeño método para ejecutarlo después de cargar la jerarquía de vistas que deshabilita la animación en la pantalla inicial, pero la habilita después de las salas. Agregue esto a su Actividad Base / Fragmento / Vista y resolverá el problema.

private void setTextInputLayoutAnimation(View view) { if (view instanceof TextInputLayout) { TextInputLayout til = (TextInputLayout) view; til.setHintAnimationEnabled(false); til.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { til.getViewTreeObserver().removeOnPreDrawListener(this); til.setHintAnimationEnabled(true); return false; } }); return; } if (view instanceof ViewGroup) { ViewGroup group = (ViewGroup) view; for (int i = 0; i < group.getChildCount(); i++) { View child = group.getChildAt(i); setTextInputLayoutAnimation(child); } } }


He encontrado una manera (difícil de manejar) de hacer eso. Al buscar en el código fuente de TextInputLayout , descubrí que la única ocasión en que la clase no se actualiza es su sugerencia de animación cuando se le agrega el texto de EditText . El único obstáculo es que solo puede agregarlo una vez al diseño, una vez que esté allí, estará atado permanentemente y no hay forma de eliminarlo.

Así que aquí está la solución:

  1. Cree un TextInputLayout sin el EditText . Programáticamente o mediante inflación XML, no importa, pero tiene que estar vacío.
  2. Cree el EditText y configure su texto a lo que necesite.
  3. Agregue el EditText al TextInputLayout .

Aquí hay un ejemplo:

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);

Desafortunadamente, si desea configurar el texto a otra cosa sin la animación, tendrá que repetir todos estos pasos, excepto la creación de un nuevo EditText (el último se puede reutilizar). Espero que Google pueda solucionar esto, porque es realmente inconveniente, pero por ahora eso es lo que tenemos.

Actualización: esto, afortunadamente, se solucionó en la biblioteca de diseño 23.0.0, así que simplemente actualice a esa versión y no tendrá que hacer todas estas locuras.


Le daré un código simple y no tiene que hacer que todos programen simplemente el atributo xlm y eso es todo.

<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>

Espero que ayude