안 드 로 이 드 다 중 테마 색상 분석

다음 코드 를 통 해 정 의 된 색상 값 을 가 져 오 면

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);
}
간단 해 보 여요.근 데 왜 이러 지?왜 테마 가 있 는 함 수 를 사용 하여 이전의 함 수 를 폐기 합 니까?
질문
우선 이 두 개의 폐 기 된 함수 가 무엇 을 하 는 지 살 펴 보 자.
      CContextCompat자원 id 에 대응 하 는 색상 값 을 되 돌려 줍 니 다.이 자원 이Resources#getColor(int) 이면 기본 색상 값 을 되 돌려 줍 니 다.
      CColorStateList 대응 하 는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);
다음은 대응 하 는 구현 캡 처 입 니 다.
 
총결산 
이상 은 안 드 로 이 드 의 다 중 테마 색상 과 관련 된 문 제 를 분석 하 는 모든 내용 입 니 다.본 논문 의 내용 이 안 드 로 이 드 개발 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기