컬러 리소스에서 color-int 가져 오기


448

컬러 리소스에서 color-int를 얻는 방법이 있습니까? 리소스 (R.color.myColor)에 정의 된 색상의 개별 빨강, 파랑 및 녹색 구성 요소를 가져 와서 세 개의 탐색 막대의 값을 특정 수준으로 설정할 수 있습니다.

답변:


928

당신이 사용할 수있는:

getResources().getColor(R.color.idname);

사용자 정의 색상을 정의하는 방법은 여기를 확인하십시오.

http://sree.cc/google/android/defining-custom-colors-using-xml-in-android

EDIT (1) : 이후 getColor(int id)되고 사용되지 않는 지금,이 사용해야합니다 :

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

(지원 라이브러리 23에 추가됨)

편집 (2) :

아래 코드는 마시멜로 사전 및 사후에 모두 사용할 수 있습니다 (API 23).

ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme

ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme

7
android.R.color.some_color는 어떻습니까 :-(
Blundell

17
@Blundell uhh, dunno 지금 필요하다면 이것도 작동합니다 android.R.color.some_color. getResources().getColor(android.R.color.holo_blue_bright)(적어도 API 17에서)
ataulm

30
getColor ()는 더 이상 사용되지 않으며 다음을 사용할 수 있습니다. ContextCompat.getColor (context, R.color.your_color);
Ricardo

2
나는 당신이 편집을 한 사람이 아니라는 것을 알고 있습니다. 그러나 ContextCompat와 의 차이점은 무엇 ResourcesCompat입니까? 실질적인 차이가 없다면 답변에서 그 중 하나를 제거하면 혼란이 줄어 듭니다.
Suragch

14
Google이 그 끔찍한 앱 콤팩트 라이브러리에 대해 완벽하게 좋은 기능을 폐기해야 할 필요성을 느끼는 이유는 무엇입니까? 짜증나, 둘 다있어
Andrew S

116

새로운 Android 지원 라이브러리 (및 업데이트)를 기반으로 다음을 호출해야합니다.

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

설명서 에 따르면 :

public int getColor (int id)

이 메소드는 API 레벨 23 에서 더 이상 사용되지 않습니다 . 대신 getColor (int, Theme)를 사용하십시오.

다음과 같은 솔루션입니다 getResources().getColorStateList(id).

다음과 같이 변경해야합니다.

ContextCompat.getColorStateList(getContext(),id);

2019 수정

ThemeOverlay가장 가까운보기의 컨텍스트 사용 과 관련 하여 :

val color = ContextCompat.getColor(
  closestView.context,
  R.color.name.color
)

따라서이 방법으로 ThemeOverlay를 기반으로 올바른 색상을 얻을 수 있습니다.

동일한 활동에서 어두운 / 빛 테마와 같은 다른 테마를 사용할 때 특히 필요합니다. 테마 및 스타일에 대한 자세한 내용을 보려면이 대화를 제안하십시오. 스타일을 사용하여 테마 개발

Nick Butcher-Droidcon Berlin-스타일을 사용한 테마 개발


10
새로운 방법의 테마로 채우기 위해 무엇을 궁금해을 위해, Theme그래서 그냥 전화, 널 (null)로 전달 될 수 getColor(R.color.my_color, null)는있는 거 확실 어떤 테마에 전달합니다.
w3bshark

흠 ... 이것은 모든 사람들이 말하는 것이지만 나는 그것을 작동시킬 수 없습니다. 컨텍스트를 초기화해야합니까? 현재 "심볼 '컨텍스트'를 해결할 수 없습니다"
ColdTuna

올바른 작업을 수행하려면 getContext () 또는 "this"를 호출해야하는 컨텍스트를 얻는 것보다 활동의 onCreate 내에서이를 호출하십시오.
Ultimo_m

35

색을 정의하십시오

values ​​/ color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- color int as #AARRGGBB (alpha, red, green, blue) -->
    <color name="orange">#fff3632b</color>
    ...
    <color name="my_view_color">@color/orange</color>

</resources>

색상을 가져 와서 설정하십시오.

int backgroundColor = ContextCompat.getColor(context, R.color.my_view_color);
// Color backgroundColor = ... (Don't do this. The color is just an int.)

myView.setBackgroundColor(backgroundColor);

또한보십시오


1
만 사용할 수 있습니다 getResources()에서 ActivityFragment?
Zapnologica

2
@Zapnologica, Activity 또는 Fragment 외부 에서 사용하는 것에 대한 생각은 이 질문에 대한 답변을 참조하십시오 getResources().
Suragch

1
@Zapnologica no. getResources()Context 및 Views를 구현하는 모든 것에 대한 공개 API로도 사용할 수 있습니다.
ataulm

7

최고의 접근법

@ 토요일 대답으로 색상을 얻는 좋은 접근 방식은

ResourcesCompat.getColor(getResources(), R.color.your_color, null);

getResources()방법에 액세스 할 수없는 경우 아래 방법을 사용하십시오.

Context context  = getContext(); // like Dialog class
ResourcesCompat.getColor(context.getResources(), R.color.your_color, null);

내가하는 일은

public void someMethod(){
    ...
    ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
}

앱 어디에서나 사용하는 것이 가장 간단합니다! Util 클래스 또는 Context 또는 getResource ()가없는 클래스에서도

문제 (컨텍스트가 없을 때)

당신이없는 Context액세스를 당신의 방법처럼 Util클래스입니다.

컨텍스트없이 아래의 메소드를 가정하십시오.

public void someMethod(){
    ...
    // can't use getResource() without Context.
}

이제이 Context방법에서 매개 변수로 전달 하고getResources().

public void someMethod(Context context){
    ...
    context.getResources...
}

다음은 어디에서나 리소스에 액세스 할 수 있는 보너스 고유 솔루션Util class 입니다. 추가 Resources귀하의에 Application클래스 또는 존재하지 않는 경우 하나를 만듭니다.

import android.app.Application;
import android.content.res.Resources;

public class App extends Application {
    private static App mInstance;
    private static Resources res;


    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        res = getResources();
    }

    public static App getInstance() {
        return mInstance;
    }

    public static Resources getResourses() {
        return res;
    }

}

manifest.xml <application태그에 이름 필드를 추가하십시오 . (아직 추가하지 않은 경우)

<application
        android:name=".App"
        ...
        >
        ...
    </application>

이제 잘 가십시오. ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);앱의 어느 곳에서나 사용하십시오 .


5

ContextCompat.getColor(context, R.color.your_color);NullPointerExcepiton을 유발하는 때로는 사용하도록 업데이트 되었지만 (일부 장치 / Android 버전에서는 확실하지 않습니다).

따라서 모든 장치 / 버전에서 작동하게하려면 null 포인터의 경우 이전 방식으로 되돌아갑니다.

try {
    textView.setTextColor(ContextCompat.getColor(getActivity(), R.color.text_grey_dark));
}
catch(NullPointerException e) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        textView.setTextColor(getContext().getColor(R.color.text_grey_dark));
    }
    else {
        textView.setTextColor(getResources().getColor(R.color.text_grey_dark));
    }
}

모든 경우에 이전 버전을 사용하지 않거나 어쨌든 버전을 확인하는 Resources.getColor(int, Theme)경우 가능한 경우 새 API를 사용하십시오 . 런타임 예외를 포착해서는 안됩니다.
ataulm

OCD라고 생각합니다. ContextCompat, 나에게 그것을하는 미래의 증거 방법 인 것처럼 보입니다. 내 접근 방식은 올바른 방법입니다. 그리고 그것이 오래된 장치 또는 다른 장치에서 실패하면 오래된 방식으로하십시오. 런타임에 예외를 잡아서는 안되는 이유는 무엇입니까?
ninjachippie

1

검색 결과에이 질문을 표시하는 데 도움이되는 다른 사용 사례에 대한 자세한 내용을 보려면 리소스에 정의 된 색상에 알파를 적용하고 싶었습니다.

@sat의 정답 사용 :

int alpha = ... // 0-255, calculated based on some business logic
int actionBarBackground = getResources().getColor(R.color.actionBarBackground);
int actionBarBackgroundWithAlpha = Color.argb(
        alpha,
        Color.red(actionbarBackground),
        Color.green(actionbarBackground),
        Color.blue(actionbarBackground)
);

1

더 쉬운 방법을 찾았습니다.

Color.parseColor(getString(R.color.idname);

흥미롭게도 이런 식으로 색상을 문자열로 얻을 수 있다는 것을 몰랐습니다. 나는 그것이 더 쉽다고 생각하지 않지만 흥미 롭습니다
ataulm

0

비 활동 클래스에서 색상에 액세스하는 것은 어려울 수 있습니다. 내가 찾은 대안 중 하나는을 사용하는 것 enum입니다. enum많은 유연성을 제공합니다.

public enum Colors
{
  COLOR0(0x26, 0x32, 0x38),    // R, G, B
  COLOR1(0xD8, 0x1B, 0x60),
  COLOR2(0xFF, 0xFF, 0x72),
  COLOR3(0x64, 0xDD, 0x17);


  private final int R;
  private final int G;
  private final int B;

  Colors(final int R, final int G, final int B)
  {
    this.R = R;
    this.G = G;
    this.B = B;
  }

  public int getColor()
  {
    return (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
  }

  public int getR()
  {
    return R;
  }

  public int getG()
  {
    return G;
  }

  public int getB()
  {
    return B;
  }
}


0

현재 분이라면 API 레벨은 23이며, getColor()우리가 사용 하는 것처럼 간단하게 사용할 수 있습니다 getString().

//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()

API 레벨 이하를 원하면 다음을 23사용하십시오.

textView.setTextColor(getResources().getColor(R.color.green));

그러나 getResources().getColor()API 레벨에서는 더 이상 사용되지 않습니다 23. 이 경우 위와 같이 바꾸십시오 :

textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`

ContextCompat :의 기능에 액세스하기위한 도우미Context

원하는 경우 다음과 SDK_INT같이 제한 할 수 있습니다.

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

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

활동 중

ContextCompat.getColor(actvityname.this, R.color.your_color);

파편으로

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

예를 들면 다음과 같습니다.

tvsun.settextcolour(ContextCompat.getColor(getActivity(), R.color.your_color))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.