get6.0 (int id)은 Android 6.0 Marshmallow에서 더 이상 사용되지 않습니다 (API 23).


718

Resources.getColor(int id)메소드는 더 이상 사용되지 않습니다.

@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
    return getColor(id, null);
}

어떻게해야합니까?


26
ContextCompat.getColor (context, R.color.color_name) 사용
Ashokchakravarthi Nagarajan

위에서 언급 한이 방법으로 : getColor (context, R.color.your_color); "문맥"을 얻는 방법은 명확하지 않습니다. 내 경우에는 안드로이드 스튜디오 3.2에 컨텍스트를 넣는 것만으로는 작동하지 않습니다. 나는 이것이 나를 위해 작동한다는 것을 알았다. .setTextColor (Color.RED).
Harry

답변:


1347

Android 지원 라이브러리 23부터
새로운 getColor () 메소드가 추가되었습니다 ContextCompat.

공식 JavaDoc의 설명 :

특정 자원 ID와 연관된 색상을 리턴합니다.

M부터 시작하여 반환 된 색상은 지정된 컨텍스트 테마에 맞게 스타일이 지정됩니다.


그래서 전화하십시오 :

ContextCompat.getColor(context, R.color.your_color);


ContextCompat.getColor() GitHub 에서 소스 코드를 확인할 수 있습니다 .


1
이것은 해결책처럼 보이지만 "여기서 리소스 ID 대신 확인 된 색상을 전달해야합니다"라는 오류가 발생하면 어떻게해야합니까? Lint가 지원 라이브러리의 새로운 API를 인식하지 못하기 때문에 어쩌면 @SuppressWarnings ( "ResourceAsColor") 주석을 추가하는 것이 좋을까요? 나는 그것을별로 좋아하지 않습니다.
Stan

1
@Stan 님, "ResourceAsColor"Lint를 트리거하는 메소드 호출을 코드 스 니펫에 제공 할 수 있습니까?
araks

"int color = ContextCompat.getColor (this, R.color.orange);" 그런 다음 "span = new ForegroundColorSpan (color);"입니다. 빨간색으로 밑줄이 그어진 단어는 "컬러"인데 여기서 "new ForegroundColorSpan ()"에 전달합니다.
Stan

1
@MonicaLabbao 아 ... 죄송합니다, 귀하의 의견을 오해했습니다! :)
araks

3
ContextCompatApi23이 마크 오류는 ContextCompat
Webserve가

498

tl; dr :

ContextCompat.getColor(context, R.color.my_color)

설명:

Support V4 Library의 일부인 ContextCompat.getColor () 를 사용해야 합니다 (이전의 모든 API에서 작동 함).

ContextCompat.getColor(context, R.color.my_color)

지원 라이브러리를 아직 사용하지 않는 경우 dependencies앱 내부 의 배열에 다음 행을 추가 해야합니다 build.gradle(참고 : 이미 appcompat (V7) 라이브러리를 사용하는 경우 선택 사항 임 ).

compile 'com.android.support:support-v4:23.0.0' # or any version above

테마에 관심이있는 경우 설명서에서 다음을 지정합니다.

M부터 시작하여 반환 된 색상은 지정된 컨텍스트 테마에 맞게 스타일이 지정됩니다.


4
정답으로 선택해야합니다. Android 문서의 지정된 링크에서 " 시작 위치 M, 반환 된 색상은 지정된 컨텍스트 테마에 따라 스타일이 지정됩니다. "라고 표시되어 있습니다.
Bugs Happen

1
'com.android.support:appcompat-v7:23.0.1'컴파일
G O'Rilla

@G O'Rilla 설명서에서 볼 수 있듯이이 ContextCompat클래스는 SupportV4에서 제공됩니다. AppcompatV7은 SupportV4를 사용하므로 작동합니다. 그들은에서 말하는 것처럼 지원 라이브러리 문서 , This library depends on the v4 Support Library. If you are using Ant or Eclipse, make sure you include the v4 Support Library as part of this library's classpath.. 따라서 AppcompatV7답 을 넣지 않는 것이 좋습니다 .
Melvin

1
감사합니다 @Melvin, 여기에 내 예제가 있습니다 : int colorTwitterBlue = ContextCompat.getColor (this, R.color.color_twitter_blue); composeTweetAlertDialog.getButton (AlertDialog.BUTTON_NEGATIVE) .setTextColor (colorTwitterBlue); composeTweetAlertDialog.getButton (AlertDialog.BUTTON_POSITIVE) .setTextColor (colorTwitterBlue);
Lara Ruffle Coles

1
@ 멜빈. 정확히 무엇을 의미하는 것은 '색상이 지정된 문맥의 주제에 따라 스타일링 될 것입니다'. 하나의 소리는 테마에 따라 동일한 색 ID에 대해 다른 색을 정의 할 수 있습니다. 이것이 정확히 어떻게 이루어 집니까?
RobertoCuba

47

getColor 만 지원 라이브러리를 포함하고 싶지 않으므로 다음과 같은 것을 사용하고 있습니다

public static int getColorWrapper(Context context, int id) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return context.getColor(id);
    } else {
        //noinspection deprecation
        return context.getResources().getColor(id);
    }
}

코드가 제대로 작동하고 더 이상 사용되지 않는 getColorAPI <23에서 사라질 수 없다고 생각합니다 .

그리고 이것이 제가 Kotlin에서 사용하고있는 것입니다 :

/**
 * Returns a color associated with a particular resource ID.
 *
 * Wrapper around the deprecated [Resources.getColor][android.content.res.Resources.getColor].
 */
@Suppress("DEPRECATION")
@ColorInt
fun getColorHelper(context: Context, @ColorRes id: Int) =
    if (Build.VERSION.SDK_INT >= 23) context.getColor(id) else context.resources.getColor(id);

4
소스 코드를 보면 지원 라이브러리가이를 수행하는 방식과 동일합니다. API> = 21을 대상으로 하므로이 몇 줄에 대한 전체 jar을 포함하고 싶지 않습니다. 더 이상 사용되지 않는 호출 위에 "// noinspection deprecation"을 추가하여 Android Studio에서 경고를 표시하지 않을 수 있습니다. 그리고 애플리케이션 컨텍스트가 아닌 활동 컨텍스트를 사용하십시오. 그렇지 않으면 테마 정보가 유실 될 수 있습니다.
personne3000

2
지원 라이브러리가 더 확실한 증거 선택이 될 수는 있지만 정답이어야합니다. 이것이 지원 라이브러리를 포함하는 유일한 이유라면이 두 줄을 포함하는 것이 더 좋습니다.
anthonymonori

30

Android Marshmallow에서는 많은 메소드가 더 이상 사용되지 않습니다.

예를 들어 색상을 사용하려면

ContextCompat.getColor(context, R.color.color_name);

또한 드로어 블 사용하기

ContextCompat.getDrawable(context, R.drawable.drawble_name);

3
변수 컨텍스트는 어디에서 왔습니까? 초기화해야합니까? 나는 그것을 작동시킬 수 없다. 나에게는 Androind가 갈 길이 멀다. 그것은 XML 리소스에서 af 색상을 얻는 데 어려움을 겪고있는 내 f 마음을 날려 버립니다! 와우
ColdTuna

29

모든 Kotlin 사용자의 경우 :

context?.let {
    val color = ContextCompat.getColor(it, R.color.colorPrimary)
    // ...
}

실제로이어야합니다 val color = ContextCompat.getColor(context, R.color.colorPrimary). "it"변수는 무엇이든 될 수 있지만 Context 이어야합니다 .
Scott Biggs 1

it이 경우에는 null이 아닌지 확인하는 데 context사용 context?.let {하기 때문에 context입니다. 이 함수 getColor()는 널이 아닌 컨텍스트 만 허용합니다. 에 대한 자세한 내용은 여기를 읽어 let그것을 사용하는 방법 : kotlinlang.org/docs/reference/scope-functions.html#let
폴 Spiesberger

4

Kotlin의 RecyclerView에서

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    fun bind(t: YourObject, listener: OnItemClickListener.YourObjectListener) = with(itemView) {
        textViewcolor.setTextColor(ContextCompat.getColor(itemView.context, R.color.colorPrimary))
        textViewcolor.text = t.name
    }
}

1

Android 지원 라이브러리에서 getColor(Resources, int, Theme)방법을 사용하십시오 ResourcesCompat.

int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);

나는 그것이 당신이 질문 getColor(Context, int)ContextCompat이후 의 것보다 당신의 질문을 더 잘 반영한다고 생각합니다 Resources. API 레벨 23 이전에는 테마가 적용되지 않고 메소드가 호출 getColor(int)되지만 더 이상 사용되지 않는 경고가 표시되지 않습니다. 테마도 있습니다 null.


1
Theme 인수로 null을 전달하면 반환 된 색상의 스타일이 현재 테마에 맞지 않습니다. 따라서 잘못되었을 수 있습니다.
araks


1

현재 분getColor() 이라면 API 레벨은 23이며 문자열 리소스를 얻는 데 사용 하는 것처럼 간단하게 사용할 수 있습니다getString() .

//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()

23 이하의 API 레벨을 제한 할 수 있습니다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    textView.setTextColor(getColor(R.color.green));
} else {
    textView.setTextColor(getResources().getColor(R.color.green));
}

그러나 간단하게 유지하려면 다음과 같이 받아 들일 수있는 답변으로 할 수 있습니다.

textView.setTextColor(ContextCompat.getColor(context, R.color.green))

에서 자원 .

에서 ContextCompat AndroidX .

에서 ContextCompat 지원


0

나도 좌절했다. 나의 필요는 매우 간단했다. 내가 원했던 것은 리소스의 ARGB 색상뿐이므로 간단한 정적 메서드를 작성했습니다.

protected static int getARGBColor(Context c, int resId)
        throws Resources.NotFoundException {

    TypedValue color = new TypedValue();
    try {
        c.getResources().getValue(resId, color, true);
    }
    catch (Resources.NotFoundException e) {
        throw(new Resources.NotFoundException(
                  String.format("Failed to find color for resourse id 0x%08x",
                                resId)));
    }
    if (color.type != TYPE_INT_COLOR_ARGB8) {
        throw(new Resources.NotFoundException(
                  String.format(
                      "Resourse id 0x%08x is of type 0x%02d. Expected TYPE_INT_COLOR_ARGB8",
                      resId, color.type))
        );
    }
    return color.data;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.