Bagaimana cara mendapatkan warna aksen secara terprogram?

89

Bagaimana seseorang mengambil set warna aksen dalam gaya, seperti di bawah ini, secara terprogram?

    <item name="android:colorAccent">@color/material_green_500</item>
Jakob
sumber
4
Siapa pun yang memilih down-voting harus merasa sangat bebas untuk memposting pemikiran mereka dalam komentar ...
Jakob

Jawaban:

132

Anda dapat mengambilnya dari tema saat ini dengan cara ini:

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;
}
rciovati.dll
sumber
Bagaimana dengan versi dukungan?
DariusL
4
Ini adalah versi dukungan.
rciovati
dapatkah kita mengatur string RGB di colorPrimary di styles.xml atau colors.xml ??
Tanveer Bulsari
2
Ini mengembalikan angka negatif untuk saya. Apakah ini masih cara yang valid untuk mendapatkan warna aksen?
Naveed
1
Apa typedValue.data mengacu pada?
GPack
45

Ini berhasil untuk saya juga:

public static int getThemeAccentColor (final Context context) {
    final TypedValue value = new TypedValue ();
    context.getTheme ().resolveAttribute (R.attr.colorAccent, value, true);
    return value.data;
}
copolii
sumber
Saya mendapatkan masalah yang sama juga dalam solusi ini, nilai negatif, dan jatuh :(
batsheva
2
Nilai negatif tidak masalah. Itu warna!
copolii
tetapi aplikasi saya macet dengan kesalahan tidak ada sumber daya yang ditemukan ... ini tidak terjadi ketika saya memberi warna biasa! jadi nilainya tidak baik
batsheva
Lalu dari manakah nilai negatif tersebut berasal jika sumber daya tidak ditemukan? Yang saya katakan adalah bahwa 0xff2506ac (misalnya) adalah angka negatif dan nilai warna yang valid.
copolii
2
Nilai negatif yang Anda dapatkan adalah warna sebenarnya bukan id sumber daya. Jangan gunakan itu sebagai id sumber daya.
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;
}
XYz Amos
sumber
2
Ini adalah satu-satunya jawaban yang tidak bergantung pada pengimporan aplikasi kelas R, yang ideal untuk membuat tampilan kustom.
Allan Veloso
13

Bagi Anda yang menggunakan Kotlin

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

Saya memiliki metode statis pada kelas utils untuk mendapatkan warna dari tema saat ini. Sering kali adalah colorPrimary, colorPrimaryDark, dan accentColor, tetapi Anda bisa mendapatkan lebih banyak lagi.

@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;
}
Sotti
sumber
8

Inilah pendapat saya tentang ini:

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));
}

Pemakaian:

    String windowBackgroundHex = getThemeColorInHex(this, "windowBackground", android.R.attr.windowBackground);
    String primaryColorHex = getThemeColorInHex(this, "colorPrimary", R.attr.colorPrimary);
Esdras Lopez
sumber
2
The String.format()membantu untuk menjelaskan bagaimana mengkonversi nilai integer negatif ke string warna hex.
Mr-IDE
1
Ini adalah solusi yang jauh lebih baik / umum daripada jawaban yang diterima untuk pertanyaan ini!
Nilesh Pawar
2

Solusi Kotlin:

    context.obtainStyledAttributes(TypedValue().data, intArrayOf(R.attr.colorAccent)).let {
        Log.d("AppLog", "color:${it.getColor(0, 0).toHexString()}")
        it.recycle()
    }
pengembang android
sumber
0

MaterialColors dapat digunakan dalam kasus ini jika Anda menginginkannya menjadi satu baris

            MaterialColors.getColor(context, R.attr.colorAccent,context.getResources().getColor(R.color.fall_back_color));

Argumen pertama adalah konteks. Argumen kedua adalah atribut yang perlu Anda dapatkan dan argumen ketiga adalah warna fallback jika atribut hilang atau terjadi kesalahan saat mendapatkan warna atribut

Ismail Iqbal
sumber