web-dev-qa-db-fra.com

TextInputLayout et AutoCompleteTextView

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? 

19
sindrenm

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

https://Android.googlesource.com/platform/frameworks/support.git/+/master/design/src/Android/support/design/widget/TextInputEditText.Java

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;
    }
}
24
chessdork

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

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:

 Example of how there is no space between the ACTV and the TIL

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:

 Example with the correct spacing

0
Seven