Disable/Remove floating label hint text in TextInputLayout XML Disable/Remove floating label hint text in TextInputLayout XML android android

Disable/Remove floating label hint text in TextInputLayout XML


Starting version 23.2.0 of the Support Library you can call

setHintEnabled(false)

or putting it in your TextInputLayout xml as such :

app:hintEnabled="false"

Though the name might makes you think it removes all hints, it just removes the floating one.

Related docs and issue: http://developer.android.com/reference/android/support/design/widget/TextInputLayout.html#setHintEnabled(boolean)

https://code.google.com/p/android/issues/detail?id=181590


There may be three ways to go about achieving this:

1 Set android:hint on TextInputLayout to a space _ character, and keep android:hint="This is my cool hint" set on the EditText.

<android.support.design.widget.TextInputLayout    ....    ....    android:hint=" ">       <<----------    <EditText        ....        ....        android:hint="This is my cool hint"/>    <<----------</android.support.design.widget.TextInputLayout>

This works because TextInputLayout performs the following check before using the EditText's hint:

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

By setting android:hint=" ", if (TextUtils.isEmpty(mHint)) evaluates to false, and the EditText retains its hint.

2 Second option would be to subclass TextInputLayout and override its addView(View child, int index, ViewGroup.LayoutParams params) method:

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

Then use your custom CTextInoutLayout instead of the one from the design support library:

<your.package.name.CTextInputLayout    ....    .... >       <<----------    <EditText        ....        ....        android:hint="This is my cool hint"/>    <<----------</your.package.name.CTextInputLayout>

3 Third, and probably the most straight-forward way would be to make the following calls:

// 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.");


With com.google.android.material you can hide by

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