마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

다른 앱에서 Resources 가져와서 적용시키기 (스킨 변경)

0 추천
public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  Resources themeR = null; //Resources 저장 대상
  try {
   //com.example.testskin01 패키지에서 Resources 가져옴
   themeR = getThemeResources("com.example.testskin01", this);
  } catch (NameNotFoundException e) {
   e.printStackTrace();
  }
  
  // activity_main2 레이아웃의 ID값 가져오기
  int resID = themeR.getIdentifier("activity_main2" , "layout", "com.example.testskin01");
  
  //id값에 따라 레이아웃 불러와 적용
  View themeLayout = (View)themeR.getLayout(resID);
  
  // 레이아웃 적용.
  setContentView(themeLayout); 
 }

 //다른 어플에서 Resources 가져오는 메소드
 private static Resources getThemeResources(String themePackage, Context context) throws NameNotFoundException {
     try {
         return context.getPackageManager().getResourcesForApplication(themePackage);
     } catch (Exception e) {
         return null;
     }
 }
 
}

안녕하세요?

현재 개발중인 어플에 스킨 변경 기능을 구현 중인데요.

여기저기 자료를 찾아보니 카톡과 같은 형식으로 하는 것이 제일 나은듯 하더라구요.

카톡에 적용된 방식은..

다른 패키지에 Resources 자료를 넣어두고..

스킨을 변경할때는 그 패키지를 설치한 후 Resources자료를 가져와서 대체하는 방식 인듯 하더군요.

 

그래서 이곳 저곳 뒤지며 자료를 찾아본 결과..

저런 소스가 만들어졌습니다..

 

시험할 기기에

com.example.testskin01 이라는 패키지를 설치하고

그 패키지 내에는 activity_main2.xml 라는 레이아웃이 있습니다.

 

그리고 액티비티를 가진 패키지에 위의 소스를 기입 해서 실행 시켰죠..

그런데.. activity_main2의 리소스ID 까지는 잘 불러와지는데

 

View themeLayout = (View)themeR.getLayout(resID);

이부분.. 이부분에서 꼭 에러가 나더라구요..

에러는

java.lang.ClassCastException: android.content.res.XmlBlock$Parser

이라고 뜨네요....

저에게 도움을 주실수 있으신분들의 답변을 기다리고 있겠습니다.

 

 

Ripple (810 포인트) 님이 2014년 2월 12일 질문
Ripple님이 2014년 2월 12일 태그 변경

1개의 답변

0 추천
 
채택된 답변

themeR.getLayout(int resId)

는 xmlResourceParser를 반환하죠...

레이아웃 인플레이터에 

LayoutInflater.from(getApplicationContext()).inflate(XmlPullParser parser, ViewGroup root);

와 같은 메서드가 있습니다.

 

테스트 해보지 않았지만...

될것같네요...

칠리님 (10,910 포인트) 님이 2014년 2월 12일 답변
Ripple님이 2014년 2월 12일 채택됨
안녕하세요.. 답변 감사드립니다.
그런데.. 말씀하신 소스 적용 시켜볼려니..인자 값에서 막혀버리네요...

View themeLayout  = LayoutInflater.from(this).inflate(themeR.getLayout(resID), ViewGroup root );


getApplicationContext()) 부분은 caller의 context 이니 ..this 적어주고..
레이아웃은 themeR.getLayout(resID) 이대로 넣으면 될듯한데...
루트 뷰가 문제네요.. 혹시 이부분도 해결 가능 하신지요? ...
null 넣으시면 그냥 view로 인플레이트 됩니다.
해결 되었네요.. 감사합니다~!
...