답변:
당신이 사용할 수있는:
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
android.R.color.some_color
. getResources().getColor(android.R.color.holo_blue_bright)
(적어도 API 17에서)
ContextCompat
와 의 차이점은 무엇 ResourcesCompat
입니까? 실질적인 차이가 없다면 답변에서 그 중 하나를 제거하면 혼란이 줄어 듭니다.
새로운 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를 기반으로 올바른 색상을 얻을 수 있습니다.
동일한 활동에서 어두운 / 빛 테마와 같은 다른 테마를 사용할 때 특히 필요합니다. 테마 및 스타일에 대한 자세한 내용을 보려면이 대화를 제안하십시오. 스타일을 사용하여 테마 개발
Theme
그래서 그냥 전화, 널 (null)로 전달 될 수 getColor(R.color.my_color, null)
는있는 거 확실 어떤 테마에 전달합니다.
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);
getResources()
에서 Activity
나 Fragment
?
getResources()
Context 및 Views를 구현하는 모든 것에 대한 공개 API로도 사용할 수 있습니다.
@ 토요일 대답으로 색상을 얻는 좋은 접근 방식은
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);
앱의 어느 곳에서나 사용하십시오 .
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를 사용하십시오 . 런타임 예외를 포착해서는 안됩니다.
검색 결과에이 질문을 표시하는 데 도움이되는 다른 사용 사례에 대한 자세한 내용을 보려면 리소스에 정의 된 색상에 알파를 적용하고 싶었습니다.
@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)
);
비 활동 클래스에서 색상에 액세스하는 것은 어려울 수 있습니다. 내가 찾은 대안 중 하나는을 사용하는 것 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;
}
}
현재 분이라면 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));
}