web-dev-qa-db-fra.com

Désactiver / Supprimer le texte de repère d'étiquette flottante dans TextInputLayout XML

Cela peut sembler contre-intuitif, mais existe-t-il un moyen de désactiver ou de supprimer l'indicateur d'étiquette flottante dans TextInputLayout? La raison pour laquelle je veux utiliser TextInputLayout au lieu d'un EditText est pour le compteur fourni par TextInputLayout.

Voici ce que j'ai jusqu'à présent:

<Android.support.design.widget.TextInputLayout
            Android:id="@+id/textContainer"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:scrollbars="vertical"
            app:counterEnabled="true"
            app:counterMaxLength="100">

            <EditText
                Android:id="@+id/myEditText"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content" 
                Android:gravity="top|left"
                Android:inputType="textMultiLine|textCapSentences"
                Android:maxLength="100"
                Android:scrollbars="vertical"
                Android:hint="This is my cool hint"/>

        </Android.support.design.widget.TextInputLayout>
43
Micro

À partir de la version 23.2.0 de la bibliothèque de support, vous pouvez appeler

setHintEnabled(false)

ou le mettre dans votre XML TextInputLayout en tant que tel:

app:hintEnabled="false"

Bien que le nom puisse vous faire penser qu'il supprime tous les indices, il supprime simplement celui qui est flottant.

Documents et problèmes associés: http://developer.Android.com/reference/Android/support/design/widget/TextInputLayout.html#setHintEnabled (boolean)

https://code.google.com/p/Android/issues/detail?id=18159

109
Gauthier

Il peut y avoir trois façons d’y parvenir:

1 Définissez Android:hint Sur TextInputLayout sur un caractère d'espace _ Et laissez Android:hint="This is my cool hint" Défini sur le EditText .

<Android.support.design.widget.TextInputLayout
    ....
    ....
    Android:hint=" ">       <<----------

    <EditText
        ....
        ....
        Android:hint="This is my cool hint"/>    <<----------

</Android.support.design.widget.TextInputLayout>

Cela fonctionne car TextInputLayout effectue le contrôle suivant avant d'utiliser l'indicateur EditText's:

// If we do not have a valid hint, try and retrieve it from the EditText
if (TextUtils.isEmpty(mHint)) {
    setHint(mEditText.getHint());
    // Clear the EditText's hint as we will display it ourselves
    mEditText.setHint(null);
}

En définissant Android:hint=" ", if (TextUtils.isEmpty(mHint)) est évalué à false, et le EditText conserve son indice.

2 La deuxième option serait de sous-classer TextInputLayout et de remplacer sa méthode addView(View child, int index, ViewGroup.LayoutParams params):

public class CTextInputLayout extends TextInputLayout {

    public CTextInputLayout(Context context) {
        this(context, null);
    }

    public CTextInputLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        if (child instanceof EditText) {
            // cache the actual hint
            CharSequence hint = ((EditText)child).getHint();
            // remove the hint for now - we don't want TextInputLayout to see it
            ((EditText)child).setHint(null);
            // let `TextInputLayout` do its thing
            super.addView(child, index, params);
            // finally, set the hint back
            ((EditText)child).setHint(hint);
        } else {
            // Carry on adding the View...
            super.addView(child, index, params);
        }
    }
}

Puis utilisez votre CTextInoutLayout personnalisé à la place de celui de la bibliothèque de support de conception:

<your.package.name.CTextInputLayout
    ....
    .... >       <<----------

    <EditText
        ....
        ....
        Android:hint="This is my cool hint"/>    <<----------

</your.package.name.CTextInputLayout>

Troisièmement, et probablement le moyen le plus direct serait de faire les appels suivants:

// remove hint from `TextInputLayout`
((TextInputLayout)findViewById(R.id.textContainer)).setHint(null);
// set the hint back on the `EditText`
// The passed `String` could also be a string resource
((EditText)findViewById(R.id.myEditText)).setHint("This is my cool hinttt.");
31
Vikram

Avec com.google.Android.material, vous pouvez vous cacher en

<com.google.Android.material.textfield.TextInputLayout

               ....

               app:hintAnimationEnabled="false"
               app:hintEnabled="false"
               >

                <com.google.Android.material.textfield.TextInputEditText
                    ........
                    Android:hint="@string/label_hint"
                    />

</com.google.Android.material.textfield.TextInputLayout>
5
Campino