아이디어를 스키닝 :
1. 스키닝 할 때?
XML로드 껍질은, 사용자가 스키닝 전에 색상을 볼 경우 XML은, 스키닝 전에로드, 사용자 경험은 좋지 않다.
2. 피부는 무엇입니까?
피부 APK이며, 컬러 사진을 포함하는 리소스 패키지입니다.
3. 재 포장해야 컨트롤의 어떤 종류의?
컨트롤은 텍스트 뷰의 텍스트 색상과 같은 배경 이미지가 포함되어 있습니다.
4. 어떻게 설치 자원으로 피부에 맞게?
자원 이름이 일치
단계 :
스키닝 전에로드 1.xml은 컨트롤이 수집 재 포장해야 함을 의미한다. 따라서,로드 프로세스 XML을 모니터링 할 수 있습니다.
1 공용 클래스 BaseActivity는 확장 활동 { 2 3 SkinFactory skinFactory을; 4 5 @Override 6 보호 공극 에서 onCreate (@Nullable 번들 savedInstanceState) { 7 슈퍼 .onCreate (savedInstanceState); 8 9 // 监听XML生成的过程 10 skinFactory = 새로운 SkinFactory (); 11 LayoutInflaterCompat.setFactory (getLayoutInflater () skinFactory); 12 } 13 }
2. 필요가 용기에 컨트롤의 스킨을 수집하고 (예를 들어 직접 껍질을 자신의 논리를 변경하지 않습니다 : 각 공간에 추가하지 않는 내부 표면 치환술 필요가 : "응용 프로그램 : ......"사용자 지정 컨트롤을 속성)
생각 :
APK에 피부 아이디 아이디 (1) 설치 같은?
(2) 이미지 리소스, 리소스가 자동으로 생성 된 번호 R의 색에 대응
파일이 같은 R의 R 파일의 리소스 ID (3) 피부 팩, ID 자원 ID와 응용 프로그램 자원 인 경우? - 그것은 동일하지 않습니다
3. 제어 활동의 복수 (SkinView) 껍질 제어 복수의 속성에 대응하는 (SkinItem)
이 값을 캡슐화하는 SkinItem :
- attrName- 속성 이름 (배경)
- 16 진수 attrValue- id 속성 값 (@ 색상 / colorPrimaryDark)
- attrType-- 종류 (색)
- 아이디 (ID의 R 파일)
1 개 클래스 SkinItem { 2 // ATTRNAME 배경 3 문자열 ATTRNAME; 4 5 INT REFID; 6 // 资源名字@ 색상 / colorPrimaryDark 7 문자열 ATTRVALUE; 8 // 당김 컬러 9 문자열 ATTRTYPE; 10 11 공중 SkinItem (문자열 ATTRNAME이 값 int {REFID 문자열 ATTRVALUE 문자열 ATTRTYPE) 12 이 .attrName = ATTRNAME; 13 이 .refId = REFID; 14 이 .attrValue =ATTRVALUE; 15 이 .attrType = ATTRTYPE; 16 } 17 18 공중 문자열 getAttrName () { 19 반환 ATTRNAME; 20 } 21 22 공중 INT getRefId는 () { 23 반환 REFID; 24 } 25 (26) 공공 문자열 getAttrValue () { 27 반환 ATTRVALUE; 28 } 29 30 공중 문자열 getAttrType () { 31 반환 ATTRTYPE; (32) } 33 }
SkinView :
. 1 개 클래스 SkinView { 2 개인 보기보기; . 3 개인 목록 <SkinItem> 목록; // 설정 수확 재 포장이 필요합니다 4. 5. 공공 SkinView (보기보기, 목록 <SkinItem> 목록) { 6. 다음은이 .view = 보기; . 7 은이 . = 목록 목록; . 8 } 9. }
4. 일단 수집, 피부 응용 프로그램 (로드시 XML 피부)
SkinManager 만들기 피부 APK를 얻기 위해, 응용 프로그램은 SkinManager에 의해 피부 APK를 얻을
addAssetpath () 메소드를 반영하여 얻어진 AsserManager, 이에 skinResource 인스턴스화,이 방법에 의해 얻어진 후 피부 APK, 그 패키지 매니저를 통해 (1) 부하 스킨 패키지 (loadSkin). GetPackageArchiveInfo (경로, PackageManager.GET_ACTIVITIES) .packageName은, 피부가 얻어 패키지 이름
"colorAccent"에 의해 ID를 확인하는 방법은 다음과 같습니다; (2) 색상을 획득 (getColor에서)는 고해상도, 예를 들어 이름을 얻기 위해 판사 skinResource가 비어 있습니다