web-dev-qa-db-ja.com

DrawableCompat setTintがAPI 19で機能しない

DrawableCompatを使用して、以下のようにDrawableを着色します。着色はAPI 19で機能していないようです。サポートライブラリバージョン23.3.0を使用しています

Drawable drawable = textView.getCompoundDrawables()[drawablePosition];
if (drawable != null) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
            drawable.setTint(color);
        } else {
            DrawableCompat.setTint(DrawableCompat.wrap(drawable), color);
        }
    }
24
rahulrv

私も同じ問題を抱えていました。 https://stackoverflow.com/a/30928051 の投稿を組み合わせ、SupportLib 23.4.0でAPI 17、19、21、22、23およびN Preview 3を試して解決策を見つけました。

それが言及されている場合でも、compat-classはLollipop以前のデバイス用のフィルターを使用する( https://stackoverflow.com/a/27812472/2170109 を参照)、それは機能しません。

次に、自分でAPIを確認し、テスト済みのすべてのAPI(17以降)で機能する次のコードを使用します。

    // https://stackoverflow.com/a/30928051/2170109
    Drawable drawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.vector));
    image.setImageDrawable(drawable);

    /*
     * need to use the filter | https://stackoverflow.com/a/30880522/2170109
     * (even if compat should use it for pre-API21-devices | https://stackoverflow.com/a/27812472/2170109)
     */
    int color = ContextCompat.getColor(context, R.color.yourcolor);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        DrawableCompat.setTint(drawable, color);

    } else {
        drawable.mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN);
    }
29
hardysim

動作API 15-25 AppCompat Support Libraryを使用(24.1.1以降でテスト済み)。

public static Drawable getTintedDrawable(@NonNull final Context context,
                                         @DrawableRes int drawableRes, @ColorRes int colorRes) {
    Drawable d = ContextCompat.getDrawable(context, drawableRes);
    d = DrawableCompat.wrap(d);
    DrawableCompat.setTint(d.mutate(), ContextCompat.getColor(context, colorRes));
    return d;
}
16
localhost

ドローアブルをラップした後、その上でmutate()を呼び出す必要があると思います。これを参照してください: https://stackoverflow.com/a/30928051/3032209

1
Yair Kukielka

Honor 4Xでは、私には答えがありません。だから私はもっと検索してこれを見つけました:

ドローアブルに.invalidateSelf()によって自身を更新するように要求するだけです

private void setTint(Drawable drawable, int color) {
    DrawableCompat.setTint(drawable, color);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop)
        drawable.invalidateSelf();
}

リソース:API 21でのDrawableCompat.setTint()のヒント

0
Mohammad7G
val textInput = EditText(context)

val drawable = ContextCompat.getDrawable(context, R.drawable.your_drawable)
        drawable?.let { myDrawable ->
            DrawableCompat.setTint(myDrawable, ContextCompat.getColor(context, R.color.your_color))
            textInput.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, myDrawable, null)
        }
0
Crazy

@ localhost 回答に基づく

Drawable d = DrawableCompat.wrap(ContextCompat.getDrawable(this, R.drawable.ic_rate));
DrawableCompat.setTint(d, Color.parseColor("#AAAAAA"));
l.setLogo(d);

私はAPI 19> 25を試してみましたが、うまくいきます

0
JFouad

私は次のヘルパーメソッドを作成して、濃淡のあるドローアブルを設定しました。これは、少なくともAPIレベル16からxまで機能します。色はテーマカラーであるため、属性によって解決されます。

  public static Drawable getTintedDrawable(int drawableResourceId, int colorAttribute) {
    YourApplication = YourApplication.getInstance();
    Drawable drawable = ContextCompat.getDrawable(application, drawableResourceId);
    drawable = DrawableCompat.wrap(drawable);
    int tintColor = ContextCompat.getColor(application, application.getThemedResourceId(colorAttribute));
    DrawableCompat.setTint(drawable, tintColor);
    return drawable;
  }

Drawable.wrapがなければ、それはより高いバージョンでは機能しますが、APIレベル16では機能しません。

0
Diego Frehner