안 드 로 이 드 다 중 테마 색상 분석
context.getResources().getColor(R.color.some_color_resource_id);
Android Studio 에 서 는Resources#getColor(int)
에서 폐기 되 었 음 을 알려 주 는 lint 경고 가 있 습 니 다.테마 에서 알 수 있 는Marshmallow
함 수 를 사용 하 는 것 을 권장 합 니 다.이 경 고 를 피하 기 위해 사용 할 수 있 습 니 다Resources#getColor(int, Theme
.
ContextCompat.getColor(context, R.color.some_color_resource_id);
이 함수 의 실현 은 다음 과 같다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getResources().getColor(id, context.getTheme());
} else {
return context.getResources().getColor(id);
}
간단 해 보 여요.근 데 왜 이러 지?왜 테마 가 있 는 함 수 를 사용 하여 이전의 함 수 를 폐기 합 니까?질문
우선 이 두 개의 폐 기 된 함수 가 무엇 을 하 는 지 살 펴 보 자.
C
ContextCompat
자원 id 에 대응 하 는 색상 값 을 되 돌려 줍 니 다.이 자원 이Resources#getColor(int)
이면 기본 색상 값 을 되 돌려 줍 니 다.C
ColorStateList
대응 하 는ColorStateList
를 되 돌려 줍 니 다.위의 코드 는 어떤 상황 에서 나의 코드 를 파괴 할 수 있 습 니까?
이 두 함 수 를 왜 폐 기 했 는 지 이해 하려 면 ColorState List 의 예 를 보 세 요.TextView 에서 사용자 정의 ColorStateList 를 사용 할 때 TextView 는 사용 할 수 없 는 상태 와 사용 가능 한 상태의 텍스트 색상 을 각각
Resources#getColorStateList(int)
과ColorStateList
표시 합 니 다.XHTML
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?attr/colorAccent" android:state_enabled="false"/>
<item android:color="?attr/colorPrimary"/>
</selector>
현재 다음 코드 를 통 해 이 걸 가 져 오 면R.attr.colorAccent
ColorStateList csl = context.getResources().getColorStateList(R.color.button_text_csl);
위의 코드 는 이상 을 던 집 니 다.(logcat 를 보면 다음 과 같은 정 보 를 볼 수 있 습 니 다)
W/Resources: ColorStateList color/button_text_csl has unresolved theme attributes!
Consider using Resources.getColorStateList(int, Theme)
or Context.getColorStateList(int)
at android.content.res.Resources.getColorStateList(Resources.java:1011)
...
뭐 가 잘 못 됐 지?문제 의 근원 은
R.attr.colorPrimary
대상 이 하나의ColorStateList
대상 과 관련 이 없 으 며,Resources
와Theme
지 색 을 사용 할 때 코드 에서 위의 함수 로 해석 할 때 대응 하 는 Theme 가 지정 되 지 않 아 결 과 를 해석 할 수 없다 는 것 이다.그래서R.attr.colorAccent
에 Theme 에 대한 지원 을 추가 하고 이 두 가지 새로운 함 수 를 추가 했다. R.attr.colorPrimary
와Marshmallow
그리고 Theme 매개 변 수 를 사용 하여 안의ColorStateList
속성 을 분석 했다.새 버 전의 Support 라 이브 러 리 에서 도 대응 하 는 실현 이 있 는데 각각
Resources#getColor(int, Theme)
과Resources#getColorStateList(int, Theme),
클래스 에 있다.어떻게 이 문 제 를 해결 합 니까?
AppCompat v24+버 전 을 사용 하면 이 문 제 를 쉽게 해결 할 수 있 습 니 다.
ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.button_text_csl);
23+버 전에 서 시스템 함 수 를 직접 사용 합 니 다.이전 버 전에 서 AppCompat 는 xml 파일 을 분석 하여 attr 속성 이 가리 키 는 수 치 를 추출 합 니 다.AppCompat 는 ColorStateList 의 새로운attributes
속성 도 지원 한다.질문
ResourcesCompat
앞의 두 함수 의 문 제 는 유사 하 다.Lollipop 이전 버 전에 서 Theme attr 를 지원 할 수 없습니다.왜 내 가 이렇게 써 도 이상 이 없 지?
이상 이 항상 나타 나 는 것 은 아니다.
ContextCompat
과android:alpha
류 에Resources#getDrawable(int)
류 와 유사 한 기능 을 추가 했다.예 를 들 어 벡터 그림 에서VectorDrawableCompat
를 사용 하여 벡터 그림 의 색 을 설정 할 수 있 습 니 다.AnimatedVectorDrawableCompat
이 속성 을 분석 하 는 작업 을 자동 으로 완성 할 수 있 습 니 다.XHTML
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:pathData="..."
android:fillColor="@android:color/white"/>
</vector>
테스트다음은 작은 테스트 를 통 해 앞서 소개 한 내용 을 살 펴 보 겠 습 니 다.다음 ColorState List 가 있다 고 가정 하 십시오.
XHTML
<!-- res/colors/button_text_csl.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?attr/colorAccent" android:state_enabled="false"/>
<item android:color="?attr/colorPrimary"/>
</selector>
응용 프로그램 에서 다음 과 같은 Theme 를 정의 합 니 다.XHTML
<!-- res/values/themes.xml -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/vanillared500</item>
<item name="colorPrimaryDark">@color/vanillared700</item>
<item name="colorAccent">@color/googgreen500</item>
</style>
<style name="CustomButtonTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorPrimary">@color/brown500</item>
<item name="colorAccent">@color/yellow900</item>
</style>
코드 에 다음 과 같은 함수 가 있 습 니 다.색상 값 을 분석 하고 코드 에 ColorState List 를 만 듭 니 다.
@ColorInt
private static int getThemeAttrColor(Context context, @AttrRes int colorAttr) {
TypedArray array = context.obtainStyledAttributes(null, new int[]{colorAttr});
try {
return array.getColor(0, 0);
} finally {
array.recycle();
}
}
private static ColorStateList createColorStateList(Context context) {
return new ColorStateList(
new int[][]{
new int[]{-android.R.attr.state_enabled}, // Disabled state.
StateSet.WILD_CARD, // Enabled state.
},
new int[]{
getThemeAttrColor(context, R.attr.colorAccent), // Disabled state.
getThemeAttrColor(context, R.attr.colorPrimary), // Enabled state.
});
}
API 19 와 API 23 버 전에 서 사용 하지 않 는 상태 와 정상 상태의 색상 을 맞 출 수 있 는 지 확인 하 십시오.구현 코드 는 다음 과 같 습 니 다(5 와 8 의 경우 TextView xml 에서 지정 되 었 습 니 다AppCompatResources
.
Resources res = ctx.getResources();
// (1)
int deprecatedTextColor = res.getColor(R.color.button_text_csl);
button1.setTextColor(deprecatedTextColor);
// (2)
ColorStateList deprecatedTextCsl = res.getColorStateList(R.color.button_text_csl);
button2.setTextColor(deprecatedTextCsl);
// (3)
int textColorXml =
AppCompatResources.getColorStateList(ctx, R.color.button_text_csl).getDefaultColor();
button3.setTextColor(textColorXml);
// (4)
ColorStateList textCslXml = AppCompatResources.getColorStateList(ctx, R.color.button_text_csl);
button4.setTextColor(textCslXml);
// (5)
Context themedCtx = button5.getContext();
ColorStateList textCslXmlWithCustomTheme =
AppCompatResources.getColorStateList(themedCtx, R.color.button_text_csl);
button5.setTextColor(textCslXmlWithCustomTheme);
// (6)
int textColorJava = getThemeAttrColor(ctx, R.attr.colorPrimary);
button6.setTextColor(textColorJava);
// (7)
ColorStateList textCslJava = createColorStateList(ctx);
button7.setTextColor(textCslJava);
// (8)
Context themedCtx = button8.getContext();
ColorStateList textCslJavaWithCustomTheme = createColorStateList(themedCtx);
button8.setTextColor(textCslJavaWithCustomTheme);
다음은 대응 하 는 구현 캡 처 입 니 다.총결산
이상 은 안 드 로 이 드 의 다 중 테마 색상 과 관련 된 문 제 를 분석 하 는 모든 내용 입 니 다.본 논문 의 내용 이 안 드 로 이 드 개발 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.