J'utilise TextInputLayout
dans mon application Android pour obtenir cet effet d'étiquette flottante soigné pour mes champs de saisie. Je sais que je devrais aussi utiliser TextInputEditText
pour permettre l’affichage de conseils lorsque vous êtes en mode Paysage et que les entrées remplissent tout l’écran.
Cependant, dans certains de mes champs de saisie, l'auto-complétion est en cours en utilisant AutoCompleteTextView
(dont le nom réellement incohérent - "TextView" au lieu de "EditText" - mais c'est une autre histoire) et qui hérite directement de EditText
. Ainsi, il n’a pas les mêmes fonctionnalités que TextInputEditText
apporte.
Je me demande donc s’il est possible d’obtenir la même fonctionnalité d’indication dans le paysage (sans ma propre implémentation TextInputAutoCompleteTextView
) et d’éviter également les avertissements de peluches produits. Est-ce que j'ai râté quelque chose? Je suppose que je comprends qu'ils n'ont pas créé de versions personnalisées de toutes les sous-classes directes et indirectes de EditText
pour cette chose spécifique, alors suis-je censé créer la mienne?
Un peu en retard, mais oui, vous devrez lancer votre propre implémentation. La bonne nouvelle est que cela est assez simple. Voici comment TextInputEditText
a été implémenté:
En conséquence, voici à quoi pourrait ressembler 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;
}
}
En me basant sur la réponse de chessdork, j’ai pensé expliquer plus en détail comment intégrer un remplissage automatique avec un indice dans votre projet. Voici les étapes exactes que j'ai utilisées pour le faire fonctionner:
1) Assurez-vous que vous avez implementation 'com.Android.support:design:26.1.0'
dans vos dépendances. Le nom exact du paquet sera légèrement différent selon la version de votre SDK.
2) Copiez la classe TextInputAutoCompleteTextView
à partir de la réponse de @ chessdork et mettez-la dans une classe publique de votre projet.
3) Placez l’endroit où vous voulez que le texte à remplir automatiquement soit dans votre mise en page XML. Il devrait être structuré comme ceci:
<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>
Les deux réponses (@chessdork et @Shn_Android_Dev) aident à obtenir le comportement correct d'un AutoCompleteTextView (ACTV) à l'intérieur d'un TextInputLayout (TIL), mais j'ai constaté qu'il n'y avait pas d'espace entre le début et la fin de TIL et l'ACTV. comme vous pouvez le voir dans l'image suivante:
Ce que j’ai fait pour résoudre le problème a été d’ajouter quelques valeurs de remplissage au début et à la fin de la TextInputAutoCompleteTextView
, les valeurs qui ont fonctionné pour moi sont 12dp au début et 8dp à la fin, mais bien sûr, vous pouvez jouer avec cela et Obtenez votre effet désiré. En prenant l'exemple de @Shn_Android_Dev, la TextInputAutoCompleteTextView
se retrouverait ainsi:
<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"/>
Et la vue ressemble maintenant à ceci: