2010年9月14日火曜日

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

1 件のコメント:

asasvata さんのコメント...

inputType,maxLength…。
こんなのあったんですね。

数値入力に限定するのに
PreferenceにsetOnClickListenerで
EditText付きのDialog作ろうとしてました。

ありがとうございました。