48 votes

TextInputLayout et AutoCompleteTextView

J'utilise TextInputLayout dans mon application Android afin d'obtenir un effet d'étiquette flottante pour mes champs de saisie. Je sais que je devrais utiliser la méthode TextInputEditText afin de permettre l'affichage d'indices en mode paysage lorsque la zone de saisie remplit tout l'écran.

Cependant, dans certains de mes champs de saisie, j'ai obtenu une autocomplétion en utilisant AutoCompleteTextView (dont le nom IMO est vraiment incohérent - "TextView" au lieu de "EditText" - mais c'est une autre histoire) et qui hérite évidemment directement de EditText . Il n'a donc pas la même fonctionnalité que TextInputEditText apporte.

Je me demande donc s'il existe un moyen d'obtenir la même fonctionnalité (sans créer mes propres TextInputAutoCompleteTextView ) et d'éviter les avertissements lint qui sont produits. Ai-je raté quelque chose ? Je suppose que je comprends qu'ils n'ont pas fait de versions personnalisées de toutes les sous-classes directes et indirectes de EditText pour cette question spécifique, suis-je censé faire la mienne ?

38voto

chessdork Points 1363

Un peu tard, mais oui, vous devrez mettre en place votre propre implémentation. La bonne nouvelle, c'est que c'est assez simple. Voici comment TextInputEditText a été mis en œuvre :

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

En conséquence, voici ce que TextInputAutoCompleteTextView pourrait ressembler à ceci.

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

7voto

Shn_Android_Dev Points 455

En m'appuyant sur la réponse de chessdork, j'ai pensé aller plus en détail sur la façon dont vous pouvez incorporer 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 d'avoir implementation 'com.android.support:design:26.1.0' dans vos dépendances gradle. Le nom exact du paquet est légèrement différent selon la version de votre SDK.

2) Copier le TextInputAutoCompleteTextView de la réponse de @chessdork et placez-la dans une classe publique de votre projet.

3) Placez le texte d'édition du remplissage automatique à l'endroit où vous souhaitez qu'il se trouve dans votre présentation XML. Il doit être structuré comme suit :

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

3voto

Seven Points 1636

Les deux réponses (@chessdork et @Shn_Android_Dev) aident à obtenir le comportement correct d'une 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/la fin du TIL et l'ACTV qui s'y trouve, comme vous pouvez le voir dans l'image suivante :

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

Pour résoudre ce problème, j'ai ajouté quelques valeurs de remplissage au début et à la fin de l'élément TextInputAutoCompleteTextView Les valeurs qui ont fonctionné pour moi sont 12dp au début et 8dp à la fin, mais vous pouvez bien sûr jouer avec cela et obtenir l'effet désiré. En prenant l'exemple de @Shn_Android_Dev, la fonction TextInputAutoCompleteTextView se retrouverait :

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

La vue se présente maintenant comme suit :

Example with the correct spacing

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X