2011年2月16日水曜日

Android PreferenceActivity の背景をカスタマイズ

またしても くごー先生からの依頼です。

くごー先生の依頼は断れませんね。

なんか倒したくなったちゃいますね。はい。


今回はちょっと苦労しました。

■ 単純に PreferenceActivity の起動画面の背景だけ変えるなら、、、

* Window の背景を設定

  1. @Override  
  2. public void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.       
  5.     getWindow().setBackgroundDrawableResource(R.drawable.bg);  
  6.   
  7.     addPreferencesFromResource(R.xml.pref);  
  8. }  


* ListView の背景を設定(その1)

# PreferenceActivity は ListActivity を extends してるんですよ。
# しってました?

  1. @Override  
  2. public void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.       
  5.     ListView lv = getListView();  
  6.     lv.setBackgroundResource(R.drawable.bg);  
  7.       
  8.     addPreferencesFromResource(R.xml.pref);  
  9. }  


* ListView の背景を設定(その2)

main2.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <ListView xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@android:id/list"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:background="@drawable/bg"  
  7.     />  


  1. @Override  
  2.    public void onCreate(Bundle savedInstanceState) {  
  3.        super.onCreate(savedInstanceState);  
  4.          
  5.        setContentView(R.layout.main2);  
  6.          
  7.        addPreferencesFromResource(R.xml.pref);  
  8.    }  


ただし、この場合は問題があります!

次のような、root の PreferenceScreen の中に PreferenceScreen が入っている場合は、入れ子の PreferenceScreen の背景は変わってくれないのです!残念!

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   <PreferenceCategory android:title="Application Setting">  
  4.     <CheckBoxPreference  
  5.       android:key="checkbox_value"  
  6.       android:title="Setting1"  
  7.       android:summary="sample of checkbox setting" />  
  8.     <EditTextPreference  
  9.       android:key="edittext_value"  
  10.       android:title="Setting2"  
  11.       android:summary="sample of edittext setting"  
  12.       android:dialogTitle="Setting edittext"  
  13.       android:dialogMessage="please set values" />  
  14.     <PreferenceScreen  
  15.       android:title="PrefereceScreen2">  
  16.       <ListPreference  
  17.         android:key="list_value"  
  18.         android:title="Setting3"  
  19.         android:summary="sample of list setting"  
  20.         android:entries="@array/setting_items"  
  21.         android:entryValues="@array/setting_items_value" />  
  22.       <RingtonePreference  
  23.         android:key="ringtone_value"  
  24.         android:title="Setting4"  
  25.         android:summary="sample of ringtone setting"  
  26.         android:showDefault="true"  
  27.         android:showSilent="true"  
  28.         android:ringtoneType="ringtone" />  
  29.     </PreferenceScreen>  
  30.   </PreferenceCategory>  
  31. </PreferenceScreen>  



でも大丈夫。方法を見つけました。

PreferenceActivity が ListActivity を継承していることを思い出してください。

ListView のデフォルトの背景を変えてしまえばいいのです。

ということで、


■ 入れ子の PreferenceScreen も合わせて背景を変更

ListView のテーマを指定します。

style.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <style name="CustomTheme.Black" parent="@android:style/Theme.Black">  
  4.         <item name="android:listViewStyle">@style/CustomListView</item>  
  5.     </style>  
  6.     <style name="CustomListView" parent="@android:style/Widget.ListView">  
  7.         <item name="android:background">@drawable/bg</item>  
  8.         <item name="android:cacheColorHint">@android:color/transparent</item>  
  9.     </style>  
  10. </resources>  


あとは、AndroidManifest.xml で指定するだけ

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     ... >  
  4.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  5.         ...  
  6.         <activity android:name=".MainPreferenceActivity"  
  7.                   android:label="@string/app_name"  
  8.                   android:theme="@style/CustomTheme.Black"  
  9.                   >  
  10.         </activity>  
  11.     </application>  
  12. </manifest>  


これでOK。

# Preference関係の style のパラメータは一行のなかのレイアウトなので使えませんでしたん。

ListView の背景をかえるときは CacheColorHint も一緒に指定しないとスクロールしたときなどにとっても残念なことになるので気をつけてね。


 


 

0 件のコメント:

コメントを投稿