EditTextをラップするために新しいTextInputLayoutを使用しています。フィールドにエラーがあると判断したら、次のことを行います。
Drawable drawable = DrawableCompat.wrap(getEditText().getBackground());
DrawableCompat.setTintList(drawable, ColorStateList.valueOf(Color.RED));
これは5.0で機能し、下線が赤に変わりますが、4.4または4.1のテストデバイスでは何もしません。ここで何が欠けていますか?とてもシンプルで、グーグルによると「うまくいく」ようです...私もそれの最新バージョンを持っていると確信しています:
'com.Android.support:design:22.2.0'をコンパイルします
FWIW、setTintの代わりにsetColorFilterを行うと、すべてのプラットフォームで動作しますが、フォーカスが設定/左/などされるとすぐに戻って来ないという問題があります...色合い(そして、誰かが余分なクレジットを探している場合は、本当に色合いをフォーカス状態と非フォーカス状態に適用するのが好きです笑)
ありがとう!
wrap()
を呼び出すと、元のDrawable
は内部で新しいDrawableWrapper
にラップされ、古いデバイスに色付けを実装するために使用されます。動作させるには、返されたDrawable
をEditText
に戻す必要があります。
_final Drawable originalDrawable = editText.getBackground();
final Drawable wrappedDrawable = DrawableCompat.wrap(originalDrawable);
DrawableCompat.setTintList(wrappedDrawable, ColorStateList.valueOf(Color.RED));
editText.setBackground(wrappedDrawable);
_
サポートライブラリのバージョン23.2.0以降、setTint()
の代わりにsetTintList()
を使用して、ColorStateList
を作成せずに1つの色合いだけを設定することもできます。
_DrawableCompat.setTint(wrappedDrawable, Color.RED);
_
APIレベル16を超えた下位互換性を確保したい場合は、ちょっとした障害にぶつかります。 setBackground()
はAPIレベル16で追加されました。その前にデバイスでsetBackgroundDrawable()
を呼び出す必要があります。あなたのためにそれを行うヘルパーメソッドを実装するのが最善です:
_public static void setBackground(View view, Drawable background) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setBackground(background);
} else {
view.setBackgroundDrawable(background);
}
}
_