プログラムでアクセントカラーを取得するにはどうすればよいですか?


87

以下のようなスタイルで設定されたアクセントカラーをプログラムで取得するにはどうすればよいですか?

    <item name="android:colorAccent">@color/material_green_500</item>

3
反対票を投じた人は、コメントに自分の考えを投稿してください...
Jakob

回答:


130

次の方法で、現在のテーマから取得できます。

private int fetchAccentColor() {
    TypedValue typedValue = new TypedValue();

    TypedArray a = mContext.obtainStyledAttributes(typedValue.data, new int[] { R.attr.colorAccent });
    int color = a.getColor(0, 0);

    a.recycle();

    return color;
}

サポートバージョンはどうですか?
DariusL 2015

4
これはサポートバージョンです。
rciovati 2015

styles.xmlまたはcolors.xmlのcolorPrimaryにRGB文字列を設定できますか?
Tanveer Bulsari 2016年

2
これは私にとって負の数を返しています。これはまだアクセントカラーを取得するための有効な方法ですか?
2017年

1
どのtypedValue.dataが参照していますか?
GPack 2017年

45

これは私にも役立ちました:

public static int getThemeAccentColor (final Context context) {
    final TypedValue value = new TypedValue ();
    context.getTheme ().resolveAttribute (R.attr.colorAccent, value, true);
    return value.data;
}

私はこの解決策でも同じ問題を抱えています、否定的な価値、そしてそれは落ちます:(
batsheva 2017年

2
負の値でも構いません。色です!
copolii 2017年

しかし、私のアプリケーションは、リソースが見つからないか、エロアで固まります...これは、通常の色を付けたときに発生しません!そのため、値は
適切で

それでは、リソースが見つからない場合、負の値はどこから来るのでしょうか?私が言っているのは、(たとえば)0xff2506acは負の数であり、有効な色の値であるということだけです。
copolii 2017年

2
取得する負の値、リソースIDではなく実際の色 です。リソースIDとして使用しないでください。
copolii

28
private static int getThemeAccentColor(Context context) {
    int colorAttr;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        colorAttr = android.R.attr.colorAccent;
    } else {
        //Get colorAccent defined for AppCompat
        colorAttr = context.getResources().getIdentifier("colorAccent", "attr", context.getPackageName());
    }
    TypedValue outValue = new TypedValue();
    context.getTheme().resolveAttribute(colorAttr, outValue, true);
    return outValue.data;
}

2
これは、カスタムビューの構築に理想的なアプリRクラスのインポートに依存しない唯一の答えです。
Allan Veloso

12

Kotlinを使用している方へ

fun Context.themeColor(@AttrRes attrRes: Int): Int {
    val typedValue = TypedValue()
    theme.resolveAttribute (attrRes, typedValue, true)
    return typedValue.data
}

11

現在のテーマから色を取得するために、utilsクラスに静的メソッドがあります。ほとんどの場合、colorPrimary、colorPrimaryDark、accentColorですが、さらに多くの情報を取得できます。

@ColorInt
public static int getThemeColor
(
        @NonNull final Context context,
        @AttrRes final int attributeColor
)
{
    final TypedValue value = new TypedValue();
    context.getTheme ().resolveAttribute (attributeColor, value, true);
    return value.data;
}

7

これについての私の見解は次のとおりです。

public static String getThemeColorInHex(@NonNull Context context, @NonNull String colorName, @AttrRes int attribute) {
    TypedValue outValue = new TypedValue();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        context.getTheme().resolveAttribute(attribute, outValue, true);
    } else {
        // get color defined for AppCompat
        int appCompatAttribute = context.getResources().getIdentifier(colorName, "attr", context.getPackageName());
        context.getTheme().resolveAttribute(appCompatAttribute, outValue, true);
    }
    return String.format("#%06X", (0xFFFFFF & outValue.data));
}

使用法:

    String windowBackgroundHex = getThemeColorInHex(this, "windowBackground", android.R.attr.windowBackground);
    String primaryColorHex = getThemeColorInHex(this, "colorPrimary", R.attr.colorPrimary);

2
String.format()は、負の整数値を16進カラー文字列に変換する方法を説明するのに役立ちます。
Mr-IDE

1
これは、この質問に対して受け入れられている回答よりもはるかに優れた/一般的な解決策です!
Nilesh Pawar 2018


1

Kotlinソリューション:

    context.obtainStyledAttributes(TypedValue().data, intArrayOf(R.attr.colorAccent)).let {
        Log.d("AppLog", "color:${it.getColor(0, 0).toHexString()}")
        it.recycle()
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.