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>

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

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

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

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
}

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

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

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.