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(別アクティビティ)

Android アプリ設定画面を作成する 依存関係を設定する



親のチェックボックスがチェックONのときだけ、子項目を有効にするには
子項目の依存に親項目のキーを設定します。


xmlでは、android:dependencyに親項目のキーを設定します。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android">

 <CheckBoxPreference 
  android:key="@string/checkbox" 
  android:summary="要約" 
  android:title="親チェックボックス">
 </CheckBoxPreference>
 
 <EditTextPreference 
  android:title="子テキストボックス" 
  android:summary="親チェックON時 有効" 
  android:dependency="@string/checkbox" 
  android:key="@string/child_edittext" >
 </EditTextPreference>
 
 <CheckBoxPreference 
  android:dependency="@string/checkbox" 
  android:key="@string/child_checkbox" 
  android:summary="親チェックON時 有効" 
  android:title="子チェックボックス">
 </CheckBoxPreference>

</PreferenceScreen>

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

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

ListPrefrenceは表示されるリストの中から値を選択するGUIです。


Android アプリ設定画面を作成するで作成したxmlレイアウトにListPreferenceを追加します。


※キーはres/value/ids.xmlでname=list,vlue=listで設定しています。
※タイトル、要約はベタ書きしていますがres/values/strings.xmlで設定します。

エントリーに設定しているのは、リストアイテムの「表示する値」を定義したxmlです。
Entry valuesは、リストアイテムの「実際の値」を定義したxmlです。
これらは「res/values/arrays.xml」に定義します。

リストアイテムの「エントリー」と「Entry values」に定義するxmlを作成します。
「res/values/arrays.xml」を作成します。
追加ボタンをクリックし、ダイアログから「String Array」を選択します。
Nameに配列の名称を設定します。


配列に値を追加していきます。
追加ボタンをクリックし、ダイアログから「Item」を選択します。
Valuesにリストアイテムに「表示する値」を設定します。
※valuesにはベタ書きしていますがres/values/strings.xmlで設定します。

「エントリー」と「Entry values」に設定する配列は「String Array」でなければダメなようです。
「Entry values」に「Integer Array」を設定したかったのですが、リストが表示されませんでした。
また「Entry values」に設定する配列の各要素の値をres/values/ids.xmlで定義したかったのですが、これもダメでした。
res/values/arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

<string-array name="entries">
 <item>@string/list_item_name1</item>
 <item>ItemName2</item>
 <item>ItemName3</item>
</string-array>

<string-array name="entryvalues">
 <item>@string/list_item_value1</item>
 <item>2</item>
 <item>3</item>
</string-array>

</resources>

PreferenceActivityを継承したアクティビティでは作成したxmlレイアウトを、onCreate()メソッドではaddPreferencesFromResource()メソッドでxmlを読み込みます。

ListPreferenceの選択が変更されたイベントを処理するには
Context#findPreference()メソッドで、xmlレイアウトで設定したキーの値をもとにListPreferenceインスタンスを取得します。
このListPreferenceインスタンスにOnPreferenceChangeListenerをハンドルします。
package my.study.android;  

import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.Preference.OnPreferenceChangeListener;

public class MainActivity extends PreferenceActivity {
 
    // リストPreferenceの PreferenceChangeリスナー
    private OnPreferenceChangeListener listPreference_OnPreferenceChangeListener =
        new OnPreferenceChangeListener(){
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                return listPreference_OnPreferenceChange(preference,newValue);
            }};
  

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //xmlレイアウトの読み込み
        this.addPreferencesFromResource(R.xml.pref);
        // キーを基に、リスト設定のインスタンスを取得する
        CharSequence cs = getText(R.string.list);
        ListPreference pref = (ListPreference)findPreference(cs); 
        // リスナーを設定する
        pref.setOnPreferenceChangeListener(listPreference_OnPreferenceChangeListener);
    }
 

    private boolean listPreference_OnPreferenceChange(Preference preference, Object newValue){  
        ListPreference listpref =(ListPreference)preference;
        String summary = String.format("entry=%s , value=%s", listpref.getEntry(),listpref.getValue());
        preference.setSummary(summary);
        return true;       
    }
 
}

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

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

RingtonePreferenceは音を選択できるGUIです。


Android エミュレータに着信音を追加する でいくつか着信音、通知音、アラーム音を追加しておきます。

Android アプリ設定画面を作成するで作成したxmlレイアウトにRingtonePreferenceを追加します。

※キーはres/values/ids.xmlでname=ringtone,value=ringtoneで設定しています。
※タイトル、要約はベタ書きしていますがres/values/strings.xmlで設定します。

RingtonePreferenceで選択できる「音」を着信音だけにしたり、アラーム音だけにしたりするには、xmlレイアウトのxmlを直接変更します。
以下ではandroid:ringtoneType="all"ですべての「音」を選択できるようにします。
着信音だけにするには"ringtone"、通知音だけにするには"notification"、アラーム音だけにするには"alarm"を指定します。
<RingtonePreference 
    android:key="@string/ringtone" 
    android:summary="着信音の要約" 
    android:title="着信音のタイトル"
    android:ringtoneType="all">
</RingtonePreference>

PreferenceActivityを継承したアクティビティでは作成したxmlレイアウトを、onCreate()メソッドではaddPreferencesFromResource()メソッドでxmlを読み込みます。

RingtonePreferenceの選択音が変更されたイベントを処理するには
Context#findPreference()メソッドで、xmlレイアウトで設定したキーの値をもとにRingtonePreferenceインスタンスを取得します。
このRingtonePreferenceインスタンスにOnPreferenceChangeListenerをハンドルします。

package my.study.android;  

import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.RingtonePreference;
import android.preference.Preference.OnPreferenceChangeListener;

public class MainActivity extends PreferenceActivity {
 
    // 着信音Preferenceの PreferenceChangeリスナー
    private OnPreferenceChangeListener ringtonePreference_OnPreferenceChangeListener =
        new OnPreferenceChangeListener(){
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                return ringtonePreference_OnPreferenceChange(preference,newValue);
            }};

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //xmlレイアウトの読み込み
        this.addPreferencesFromResource(R.xml.pref);
        // キーを基に、着信音設定のインスタンスを取得する
        CharSequence cs = getText(R.string.ringtone);
        RingtonePreference pref = (RingtonePreference)findPreference(cs); 
        // リスナーを設定する
        pref.setOnPreferenceChangeListener(ringtonePreference_OnPreferenceChangeListener);
    }

    private boolean ringtonePreference_OnPreferenceChange(Preference preference, Object newValue){   
        String url = (String)newValue;
        Uri uri;
        Ringtone ringtone;
        if ("".equals(url)) {
            preference.setSummary("サイレント");
        } else {
            uri = Uri.parse(url);
            ringtone = RingtoneManager.getRingtone(this, uri);
            preference.setSummary(ringtone.getTitle(this));
        }
        return true;
    }
 
}




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

Android エミュレータに着信音を追加する

Eclipseを起動しエミュレータを起動します。
エミュレータはAVDManagerでSDカードのサイズが設定されているものとします。


mp3ファイルを「/sdcard/media/audio/ringtones」フォルダに配置します。
※audioフォルダの中の各フォルダは、それぞれ着信音、アラーム音、通知音などに対応しています。
今回は着信音を追加したいのでringtonesフォルダにmp3ファイルを配置しましたが、通知音を追加したければ「/sdcard/media/audio/notifications」にmp3ファイルを追加します。
alarms アラーム音
music 音楽
notifications 通知音
ringtones 着信音

「/sdcard/media/audio/ringtones」フォルダがなければ、コマンドプロンプトから以下のコマンドでフォルダを作成します。
>adb shell
# mkdir /sdcard/medi/audio/ringtones
# exit
adb shellでエミュレータのシェルに入ります。
mkdirでフォルダを作成します。
exitでシェルから出ます。
※rmdirでフォルダ削除です。
※pwdでどのディレクトリにいるのかわかります。

作成した「/sdcard/media/audio/ringtones」フォルダにmp3ファイルをコピーします。
コマンドプロンプトから以下のコマンドを入力します。
>adb push C:¥Sample.mp3 /sdcard/media/audio/ringtones
adb push <PCにあるファイル> <デバイスのフォルダ>
※ファイルを取り出すには
adb pull <デバイスファイル名> <PCのファイル名>

EclipseのDDMSからファイルをコピーすることもできます。
Eclipseのメニューから「ウィンドウ」→「パースペクティブを開く」→「DDMS」でDDMSを起動し
「/sdcard/media/audio/ringtones」を選択し、右上の「Push a file onto the device」をクリックします。
※DDMSでフォルダを作成することはできません。



次にコピーしたファイルを認識させます。
エミュレータの「設定」より「Dev Tool」を起動します。


「Media Scanner」を選択します。


SDカードのマウントが開始されます。
「Media Scanner finished scanning /sdcard」と表示されればマウント終了です。


着信音が追加されたか確認します。
エミュレータの「設定」より「サウンド&画面設定」を選択します。


「着信音」を選択します。


追加されたファイルが表示されます。

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

EditTextPreferenceは値を設定できるGUIです。


Android アプリ設定画面を作成するで作成したxmlレイアウトにEditTextPreferenceを追加します。
※キーはres/values/ids.xmlでname=textbox,value=textboxで設定しています。
※タイトル、要約はベタ書きしていますがres/values/strings.xmlで設定します。

EditTextPreferenceを数値のみ入力可能にしたり、入力文字数を制限するには、xmlレイアウトのxmlを直接変更します。
以下ではandroid:inputType="number"で数値のみの入力、android:maxLength="5"で5バイトの入力制限をかけています。
<EditTextPreference 
 android:key="@string/textbox" 
 android:summary="テキストボックス要約" 
 android:title="テキストボックスタイトル"
 android:inputType="number" 
 android:maxLength="5">
</EditTextPreference>


PreferenceActivityを継承したアクティビティのonCreate()メソッドでは、addPreferencesFromResource()メソッドでxmlを読み込みます。

EditTextPreferenceで入力チェックを行うには
Context#findPreference()メソッドで、xmlレイアウトで設定したキーの値をもとにEditTextPreferenceインスタンスを取得します。
このEditTextPreferenceインスタンスにOnPreferenceChangeListenerをハンドルします。
package my.study.android;  

import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.Preference.OnPreferenceChangeListener;

public class MainActivity extends PreferenceActivity {
 
    // テキストボックスPreferenceの PreferenceChangeリスナー
    private OnPreferenceChangeListener editTextPreference_OnPreferenceChangeListener =
        new OnPreferenceChangeListener(){
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                return editTextPreference_OnPreferenceChange(preference,newValue);
            }};

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //xmlレイアウトの読み込み
        this.addPreferencesFromResource(R.xml.pref);
        // キーを基に、テキストボックス設定のインスタンスを取得する
        CharSequence cs = getText(R.string.textbox);
        EditTextPreference etp = (EditTextPreference)findPreference(cs); 
        // リスナーを設定する
        etp.setOnPreferenceChangeListener(editTextPreference_OnPreferenceChangeListener);
    }

    private boolean editTextPreference_OnPreferenceChange(Preference preference, Object newValue){
        String input = newValue.toString(); 
        if (input != null && Integer.parseInt(input) > 100){
            //nullでなく100以上であれば要約を変更する
            preference.setSummary(input);
            return true;
        } else {
            //nullまたは100以下はエラー
            return false;
        }  
    }
 
}

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

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

CheckBoxPreferenceはtrue,falseを設定できるGUIです。


Android アプリ設定画面を作成するで作成したxmlレイアウトにCheckBoxPreferenceを追加します。

※キーはres/values/ids.xmlでname=checkbox,value=checkboxで設定しています。
※タイトル、要約はベタ書きしていますがres/values/strings.xmlで設定します。

PreferenceActivityを継承したアクティビティのonCreate()メソッドでは、addPreferencesFromResource()メソッドでxmlを読み込みます。

CheckBoxPreferenceのチェックの状態が変更されたイベントを処理するには
Context#findPreference()メソッドで、xmlレイアウトで設定したキーの値をもとにCheckBoxPreferenceインスタンスを取得します。
このCheckBoxPreferenceインスタンスにOnPreferenceChangeListenerをハンドルします。
package my.study.android;  

import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.Preference.OnPreferenceChangeListener;

public class MainActivity extends PreferenceActivity {
 
    // チェックボックスPreferenceの PreferenceChangeリスナー
    private OnPreferenceChangeListener checkBoxPreference_OnPreferenceChangeListener =
        new OnPreferenceChangeListener(){
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                return checkBoxPreference_OnPreferenceChange(preference,newValue);
            }};
  

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //xmlレイアウトの読み込み
        this.addPreferencesFromResource(R.xml.pref);
        // キーを基に、チェックボックス設定のインスタンスを取得する
        CharSequence cs = getText(R.string.checkbox);
        CheckBoxPreference cbp = (CheckBoxPreference)findPreference(cs);
        // リスナーを設定する
        cbp.setOnPreferenceChangeListener(checkBoxPreference_OnPreferenceChangeListener);
    }
 

    private boolean checkBoxPreference_OnPreferenceChange(Preference preference, Object newValue){
        String summary;
        if (((Boolean)newValue).booleanValue()) {
            summary = "Checked:true";
        } else {
            summary = "Checked:false";
        }
        // 要約を変更する
        ((CheckBoxPreference)preference).setSummary(summary);
        // 変更を適用するために true を返す
        return true;
    }
 
}



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