style - textinputlayout android
TextInputLayout y AutoCompleteTextView (3)
A partir de la respuesta de chessdork, pensé que me gustaría profundizar más en cómo puedes incorporar un autocompletado con una sugerencia en tu proyecto. Aquí están los pasos exactos que solía hacer para que funcione:
1) Asegúrese de tener la implementation ''com.android.support:design:26.1.0''
en sus dependencias de Gradle. El nombre exacto del paquete será ligeramente diferente según la versión de su SDK.
2) Copie la clase TextInputAutoCompleteTextView
de la respuesta de @ chessdork y póngala en una clase pública dentro de su proyecto.
3) Lugar donde desea que el texto de edición de relleno automático esté en su diseño XML. Debería estar estructurado así:
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="16dp">
<mycompany.views.TextInputAutoCompleteTextView
android:id="@+id/myAutoFill"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/myHint"/>
</android.support.design.widget.TextInputLayout>
Estoy usando TextInputLayout
en mi aplicación de Android para lograr ese efecto de etiqueta flotante en mis campos de entrada. Sé que también debería utilizar TextInputEditText
para permitir que se muestren sugerencias cuando se encuentra en modo horizontal y la entrada llena toda la pantalla.
Sin embargo, en algunos de mis campos de entrada tengo autocompletado usando AutoCompleteTextView
(que IMO tiene un nombre realmente incoherente: "TextView" en lugar de "EditText" - pero esa es otra historia) y eso obviamente se hereda directamente de EditText
. Por lo tanto, no tiene la misma funcionalidad que TextInputEditText
trae.
Así que me pregunto si hay una manera de lograr la misma funcionalidad de sugerencia en el paisaje (sin crear mi propia implementación de TextInputAutoCompleteTextView
, y también evitar las advertencias de pelusas que se producen). ¿Me estoy perdiendo de algo? Supongo que entiendo que no hicieron versiones personalizadas de todas las subclases directas e indirectas de EditText
para esta cosa específica, ¿entonces se espera que yo haga las mías?
Ambas respuestas (@chessdork y @Shn_Android_Dev) ayudan a lograr el comportamiento correcto de un AutocompletarTextView (ACTV) dentro de un TextInputLayout (TIL), sin embargo, descubrí que no había espacio entre el inicio / final del TIL y el ACTV dentro de él. Como se puede ver en la siguiente imagen:
Lo que hice para resolver el problema fue agregar un par de valores de relleno al inicio y al final de TextInputAutoCompleteTextView
, los valores que funcionaron para mí son 12dp al principio y 8dp al final, pero por supuesto, puedes jugar con eso y Consigue el efecto deseado. Tomando el ejemplo de @Shn_Android_Dev, el TextInputAutoCompleteTextView
terminaría como:
<mycompany.views.TextInputAutoCompleteTextView
android:id="@+id/myAutoFill"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="12dp"
android:paddingEnd="8dp"
android:hint="@string/myHint"/>
Y la vista ahora se ve así:
Un poco tarde, pero sí, tendrás que rodar tu propia implementación. La buena noticia es que esto es bastante sencillo. Así es como se implementó TextInputEditText
:
En consecuencia, esto es lo que podría parecer TextInputAutoCompleteTextView
.
public class TextInputAutoCompleteTextView extends AppCompatAutoCompleteTextView {
public TextInputAutoCompleteTextView(Context context) {
super(context);
}
public TextInputAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TextInputAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
final InputConnection ic = super.onCreateInputConnection(outAttrs);
if (ic != null && outAttrs.hintText == null) {
// If we don''t have a hint and our parent is a TextInputLayout, use it''s hint for the
// EditorInfo. This allows us to display a hint in ''extract mode''.
final ViewParent parent = getParent();
if (parent instanceof TextInputLayout) {
outAttrs.hintText = ((TextInputLayout) parent).getHint();
}
}
return ic;
}
}