2010年9月21日火曜日

Android アプリ設定画面を作成する PreferenceScreen

PreferenceScreenを入れ子にすると、項目を選択したときに次の設定画面が開きます。


pref.xml
PreferenceScreenに入れ子でPreferenceScreenを配置します。
さらに入れ子でCheckBoxPreferenceを配置します。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android">

 <PreferenceScreen 
  android:summary="PreferenceScreen要約" 
  android:title="PreferenceScreenタイトル" 
  android:key="@string/pref_screen">
  
  <CheckBoxPreference 
   android:key="@string/checkbox" 
   android:summary="要約" 
   android:title="タイトル">
  </CheckBoxPreference>
  
 </PreferenceScreen>

</PreferenceScreen>

子のCheckBoxPreferenceのチェック状態を変更したとき、子のCheckBoxPreferenceの要約を変更するのはAndroid アプリ設定画面を作成する CheckBoxPreference と同じです。

子のCheckBoxPreferenceのチェック状態を変更したとき、親のPreferenceScreenの要約を変更するには、いくつか方法があります。
子画面(PreferenceScreenをクリックして開く画面)は、新しいアクティビティではないため、本体の戻るボタンで親画面に戻ってもonResume()などは発生しません。
そこでPreferenceScreenのOnPreferenceClickListenerをハンドルし、子画面のオブジェクトをgetDialog()メソッドで取得します。
取得したDialogオブジェクトのOnDismissListenerをハンドルし、子画面が破棄されたタイミングで親画面の要約を変更します。

package my.study.android;  

import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceClickListener;
import android.widget.ListView;


public class MainActivity extends PreferenceActivity {
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //xmlレイアウトの読み込み
        this.addPreferencesFromResource(R.xml.pref);
        //親のPreferenceScreen
        CharSequence csScreenPrefParent = getText(R.string.prefscreen_Parent);
        PreferenceScreen screenPref = (PreferenceScreen)findPreference(csScreenPrefParent);
        //OnPreferenceClickListenerをハンドルする
        screenPref.setOnPreferenceClickListener(new OnPreferenceClickListener(){
            @Override
            public boolean onPreferenceClick(Preference preference) {
                return screenPreference_OnPreferenceClick(preference);
            }});
    }
 
    private boolean screenPreference_OnPreferenceClick(Preference preference){
        PreferenceScreen screenPref = (PreferenceScreen) preference; 
        //子画面オブジェクトを取得する
        Dialog d = screenPref.getDialog();
        //子画面のOnDismissListenerをハンドルする 
        d.setOnDismissListener(new OnDismissListener(){
            @Override
            public void onDismiss(DialogInterface dialog) {
                Dialog_OnDismiss(dialog);
            }});
        return true;
    } 
  
    private void Dialog_OnDismiss(DialogInterface dialog){
        //子のCheckPreferenceのチェック状態を取得する
        CharSequence csCheckPrefChild = getText(R.string.prefchk_child);
        CheckBoxPreference pref_checkChild = (CheckBoxPreference)findPreference(csCheckPrefChild);
        String summary = null;
        if (pref_checkChild.isChecked() == true) {
            summary = "Checked:True";
        } else {
            summary = "Checked:False";
        }
        //親のPreferenceScreenの要約を変更する
        CharSequence csScreenPrefParent = getText(R.string.prefscreen_Parent  );
        PreferenceScreen screenPref = (PreferenceScreen)findPreference(csScreenPrefParent);
        screenPref.setSummary(summary);
        //再描画
        ListView v = this.getListView();
        v.invalidateViews();
    }
 
}

【関連項目】
Android プリファレンスの編集
Android アプリ設定画面を作成する
Android アプリ設定画面を作成する CheckBoxPreference
Android アプリ設定画面を作成する EditTextPreference
Android アプリ設定画面を作成するRingtonePreference
Android アプリ設定画面を作成するListPreference
Android アプリ設定画面を作成する 依存関係を設定する
Android アプリ設定画面を作成する PreferenceScreen
Androidアプリ設定画面を作成する PreferenceScreen(別アクティビティ)

0 件のコメント: