2011年2月16日水曜日

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

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

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

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


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

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

* Window の背景を設定


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

getWindow().setBackgroundDrawableResource(R.drawable.bg);

addPreferencesFromResource(R.xml.pref);
}


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

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


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

ListView lv = getListView();
lv.setBackgroundResource(R.drawable.bg);

addPreferencesFromResource(R.xml.pref);
}


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

main2.xml

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



@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.main2);

addPreferencesFromResource(R.xml.pref);
}


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

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


<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="Application Setting">
<CheckBoxPreference
android:key="checkbox_value"
android:title="Setting1"
android:summary="sample of checkbox setting" />
<EditTextPreference
android:key="edittext_value"
android:title="Setting2"
android:summary="sample of edittext setting"
android:dialogTitle="Setting edittext"
android:dialogMessage="please set values" />
<PreferenceScreen
android:title="PrefereceScreen2">
<ListPreference
android:key="list_value"
android:title="Setting3"
android:summary="sample of list setting"
android:entries="@array/setting_items"
android:entryValues="@array/setting_items_value" />
<RingtonePreference
android:key="ringtone_value"
android:title="Setting4"
android:summary="sample of ringtone setting"
android:showDefault="true"
android:showSilent="true"
android:ringtoneType="ringtone" />
</PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>



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

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

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

ということで、


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

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

style.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomTheme.Black" parent="@android:style/Theme.Black">
<item name="android:listViewStyle">@style/CustomListView</item>
</style>
<style name="CustomListView" parent="@android:style/Widget.ListView">
<item name="android:background">@drawable/bg</item>
<item name="android:cacheColorHint">@android:color/transparent</item>
</style>
</resources>


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


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
... >
<application android:icon="@drawable/icon" android:label="@string/app_name">
...
<activity android:name=".MainPreferenceActivity"
android:label="@string/app_name"
android:theme="@style/CustomTheme.Black"
>
</activity>
</application>
</manifest>


これでOK。

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

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


 


 

0 件のコメント:

コメントを投稿