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