Làm thế nào để có được màu nhấn theo lập trình?


87

Làm cách nào để lấy bộ màu nhấn trong các kiểu, như bên dưới, theo chương trình?

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

3
Bất kỳ ai bỏ phiếu từ chối sẽ thực sự cảm thấy rất tự do để đăng suy nghĩ của họ trong bình luận ...
Jakob

Câu trả lời:


130

Bạn có thể tìm nạp nó từ chủ đề hiện tại theo cách này:

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

Còn phiên bản hỗ trợ thì sao?
DariusL

4
Đây là phiên bản hỗ trợ.
rciovati

chúng ta có thể đặt chuỗi RGB trong colorPrimary trong styles.xml hoặc Colors.xml không ??
Tanveer Bulsari

2
Điều này đang trả về một số âm cho tôi. Đây có còn là cách hợp lệ để lấy màu nhấn không?
Naveed vào

1
TypedValue.data tham chiếu đến những gì?
GPack

45

Cái này cũng có tác dụng với tôi:

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

Tôi nhận được cùng một vấn đề cũng trong giải pháp này, giá trị negetive, và nó rơi :(
batsheva

2
Giá trị âm là ổn. Đó là một màu sắc!
copolii

nhưng ứng dụng của tôi bị lỗi với xói mòn không tìm thấy tài nguyên ... điều này không xảy ra khi tôi đặt một màu thông thường! nên giá trị không phải là tốt
batsheva

Sau đó, giá trị âm sẽ đến từ đâu nếu tài nguyên không được tìm thấy? Tất cả những gì tôi đang nói là 0xff2506ac (ví dụ) là số âm và giá trị màu hợp lệ.
copolii

2
Giá trị âm mà bạn nhận được là màu thực không phải là id tài nguyên. Không sử dụng nó làm id tài nguyên.
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
Đây là câu trả lời duy nhất không dựa vào việc nhập lớp ứng dụng R, đây là lý tưởng để xây dựng các chế độ xem tùy chỉnh.
Allan Veloso

12

Dành cho những bạn sử dụng Kotlin

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

11

Tôi có một phương thức tĩnh trên lớp utils để lấy màu từ chủ đề hiện tại. Hầu hết các trường hợp là colorPrimary, colorPrimaryDark và voiceColor, nhưng bạn có thể nhận được nhiều hơn thế.

@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

Đây là công việc của tôi:

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

Sử dụng:

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

2
Các String.format()giúp giải thích làm thế nào để chuyển đổi các giá trị số nguyên âm thành một chuỗi hex màu.
Mr-IDE

1
Đây là một giải pháp tốt hơn / chung chung hơn nhiều so với câu trả lời được chấp nhận cho câu hỏi này!
Nilesh Pawar


1

Giải pháp Kotlin:

    context.obtainStyledAttributes(TypedValue().data, intArrayOf(R.attr.colorAccent)).let {
        Log.d("AppLog", "color:${it.getColor(0, 0).toHexString()}")
        it.recycle()
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.