2010年9月14日火曜日

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

0 件のコメント: