티스토리 뷰

지식쌓기

원하는 theme로 widget 생성하기

바나나쥬스 2013. 7. 4. 16:46

app이 Theme.Holo.Light.DarkActionBar 테마를 사용하는 경우

기본적으로는 Holo.Light 테마 이지만 ActionBar만 Holo(Dark) 테마가 적용되게 된다. 


따라서 ActionBar위에 붙는 widget들 (ListMenuItemView, IconMenuView, overflow popup등) 은 알아서 처음에 actionbar가 구성될때 Holo(Dark) 테마로 설정되어 검정계통의 스타일을 얻게 된다.

그리고 그외 activity 내에 붙는 widget들은 모두 Holo.Light 테마로 생성되게 된다. 


하지만 widget을 Holo.Light가 아닌 Holo(Dark)로 생성하고 싶다면

이미 잘 알고 있듯이 Theme 를 정의할때 style을 적용해 주면 된다.


<style name="MyTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">

      <item name="android:checkboxStyle">@android:style/Widget.Holo.CompoundButton.CheckBox</item>

</style>


하지만 이 방법은 app의 모든 CheckBox가 Holo(Dark)로 생성이 된다.


그래서 어떤 CheckBox는 Holo.Light이고 어떤 CheckBox는 Holo(Dark)이고..

이렇게 다르게 생성하려면 어떻게 해야할까??


android 소스를 뒤져서 드뎌 찾아냈다 -ㅅ-!


TypedValue outValue = new TypedValue();          

Resources.Theme currentTheme = getTheme();

currentTheme.resolveAttribute(android.R.attr.actionBarWidgetTheme, outValue, true);

final int targetThemeRes = outValue.resourceId;

ContextThemeWrapper themedContext = new ContextThemeWrapper(this, targetThemeRes);

CheckBox darkCheckBox = new CheckBox(themedContext);


android 소스의 themes.xml을 보면 

actionBarWidgetTheme가 Theme.Holo로 정의되어 있는 것을 볼수 있다. 


<style name="Theme.Holo.Light.DarkActionBar">

        <item name="android:windowContentOverlay">@android:drawable/ab_solid_shadow_holo</item>

        <item name="android:actionBarStyle">@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse</item>

        <item name="actionBarWidgetTheme">@android:style/Theme.Holo</item>

           ......


따라서 android.R.attr.actionBarWidgetTheme 값을 얻어와서 그곳에 적용된 style대로 widget을 생성하는 것이다. 


더 나아가서는 새로 attr정의해서 원하는 style 정의해서 사용하면 더 확장해서 사용할수 있을듯!

아직 테스트해보진 않았지만 -ㅅ-!