これは直感に反するように思えるかもしれませんが、TextInputLayout
のフローティングラベルヒントを無効にするか削除する方法はありますか?単にTextInputLayout
の代わりにEditText
を使用する理由は、TextInputLayout
が提供するカウンターのためです。
ここに私がこれまでに持っているものがあります:
<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>
呼び出すことができるサポートライブラリのバージョン23.2.0以降
setHintEnabled(false)
または、TextInputLayout xmlに次のように配置します。
app:hintEnabled="false"
この名前は、すべてのヒントを削除するように思わせるかもしれませんが、フローティングヒントを削除するだけです。
関連ドキュメントと問題: http://developer.Android.com/reference/Android/support/design/widget/TextInputLayout.html#setHintEnabled(boolean)
これを達成するには、次の3つの方法があります。
1TextInputLayout
の_Android:hint
_をスペース__
_文字に設定し、EditText
で_Android:hint="This is my cool hint"
_を設定したままにします。
_<Android.support.design.widget.TextInputLayout
....
....
Android:hint=" "> <<----------
<EditText
....
....
Android:hint="This is my cool hint"/> <<----------
</Android.support.design.widget.TextInputLayout>
_
これは、TextInputLayout
が_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);
}
_
_Android:hint=" "
_を設定すると、if (TextUtils.isEmpty(mHint))
はfalse
に評価され、EditText
はそのヒントを保持します。
2 2番目のオプションは、TextInputLayout
をサブクラス化し、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);
}
}
}
_
次に、設計サポートライブラリからのものではなく、カスタムCTextInoutLayout
を使用します。
_<your.package.name.CTextInputLayout
....
.... > <<----------
<EditText
....
....
Android:hint="This is my cool hint"/> <<----------
</your.package.name.CTextInputLayout>
_
3番目、おそらく最も簡単な方法は、次の呼び出しを行うことです。
_// 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.");
_
Com.google.Android.materialを使用すると、非表示にできます
<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>