web-dev-qa-db-ja.com

DrawableCompatの色合いは、ロリポップ以前では機能しません

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を行うと、すべてのプラットフォームで動作しますが、フォーカスが設定/左/などされるとすぐに戻って来ないという問題があります...色合い(そして、誰かが余分なクレジットを探している場合は、本当に色合いをフォーカス状態と非フォーカス状態に適用するのが好きです笑)

ありがとう!

37
Jason T.

wrap()を呼び出すと、元のDrawableは内部で新しいDrawableWrapperにラップされ、古いデバイスに色付けを実装するために使用されます。動作させるには、返されたDrawableEditTextに戻す必要があります。

_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);
    }
}
_
66
Xaver Kapeller