프로그래밍 방식으로 강조 색상을 얻는 방법은 무엇입니까?


89

프로그래밍 방식으로 아래와 같이 스타일에 설정된 강조 색상을 어떻게 가져올 수 있습니까?

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

4
다운 투표가 매우 무료 참으로 느껴야한다 누군가는 ... 코멘트에 자신의 의견을 게시하려면
야콥

답변:


131

다음과 같은 방법으로 현재 테마에서 가져올 수 있습니다.

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

2
이것은 나를 위해 음수를 반환합니다. 이것이 여전히 강조 색상을 얻는 유효한 방법입니까?
Naveed

1
어떤 typedValue.data가 참조합니까?
GPack 2017-06-15

45

이것은 나에게도 효과적이었습니다.

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

나는이 솔루션, negetive 값도 같은 문제를 얻을, 그것은 :( 폭포
batsheva

2
음수 값은 괜찮습니다. 색이에요!
copolii

그러나 내 응용 프로그램은 eroor 찾을 수없는 리소스로 크래시됩니다 ... 이것은 내가 일반 색상을 넣을 때 발생하지 않습니다! 그래서 값이 잘되지 않습니다
batsheva

그렇다면 리소스를 찾을 수없는 경우 음수 값은 어디에서 오는 것일까 요? 내가 말하는 것은 0xff2506ac (예를 들어)가 음수이고 유효한 색상 값이라는 것입니다.
copolii

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

13

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

8

이것에 대한 나의 견해는 다음과 같습니다.

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


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.