「AndroidでTimePickerプリファレンスを使う」で使用した基底クラスが必要です。
こんな感じ
本文がどんどん簡素になっていきますが、まぁ参考になれば。
ソースは「GoogleCode relog」にも保存していますのでよろしければどうぞ。
XML
<jp.xii.relog.setting.IpAddressPreference android:key="IpAddress" android:title="IPアドレス設定" android:dialogTitle="- IPアドレス -" android:dialogMessage="入力してください。" android:defaultValue="0.0.0.0" > </jp.xii.relog.setting.IpAddressPreference>
メインクラス
package jp.xii.relog.setting; import java.util.ArrayList; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.DialogInterface.OnClickListener; import android.preference.PreferenceManager; import android.text.InputType; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.EditText; import android.widget.LinearLayout; public class IpAddressPreference extends OriginalDialogPreference { //パラメータ LinearLayout _layoutIp = null; ArrayList<EditText> _textNumbers = null; String _addressNumbers[] = {"0", "0", "0", "0"}; /** * レイアウトを取得 * @return */ public LinearLayout getLayoutIp(){ if(_layoutIp == null){ _layoutIp = new LinearLayout(getContext()); } return _layoutIp; } /** * IPアドレスの数値の配列 * @return */ public ArrayList<EditText> getTextNumbers(){ if(_textNumbers == null){ _textNumbers = new ArrayList<EditText>(); for(int i=0; i<4; i++){ EditText child = new EditText(getContext()); _textNumbers.add(child); getLayoutIp().addView(child); } } return _textNumbers; } /** * コンストラクタ * @param context * @param attrs */ public IpAddressPreference(Context context, AttributeSet attrs) { super(context, attrs); } /** * 表示したときに呼ばれる */ @Override protected void onBindView(View view) { String ip = "0.0.0.0"; //設定を読み込み SharedPreferences pref = getSharedPreferences(); if(pref == null){ }else{ ip = pref.getString(getKey(), ip); //ピリオドで4つに分解 String numbers[] = ip.split("\\."); int i = 0; if(numbers.length != 4){ //IPアドレスじゃない ip = "0.0.0.0"; }else if(getTextNumbers().size() != 4){ //エディットが用意できてない }else{ //エディットにバラして設定 for (String number : numbers) { if(!isInt(number)){ _addressNumbers[i] = ""; }else{ _addressNumbers[i] = number; } i++; } } } //サマリーに現在値を設定 setSummary((CharSequence) (ip)); //これはなぜか最後じゃないとイケないらしい super.onBindView(view); } /** * プリファレンスのクリックイベント */ @Override protected void onClick(){ //レイアウトを毎回造り直さないとダメ _layoutIp = null; _textNumbers = null; //レイアウト調節 getLayoutIp().setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT , LayoutParams.WRAP_CONTENT)); getLayoutIp().setWeightSum(1); getLayoutIp().setPadding(5, 0, 0, 5); getLayoutIp().setOrientation(LinearLayout.HORIZONTAL); for (EditText text : getTextNumbers()) { text.setInputType(InputType.TYPE_CLASS_NUMBER); text.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT , LayoutParams.FILL_PARENT , (float) 0.25)); } //値を設定 for(int i=0; i<4; i++){ getTextNumbers().get(i).setText(_addressNumbers[i]); } //ダイアログ表示 showCustumDialog(getContext(), (String)getDialogTitle(), (String)getDialogMessage() , (View)getLayoutIp(), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 設定保存 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getContext()); SharedPreferences.Editor editor = pref.edit(); int num[] = new int[4]; for(int i=0; i<4; i++){ //数値にいったん変換する num[i] = toInt(getTextNumbers().get(i).getText().toString()); //範囲外チェック if(num[i] < 0){ num[i] = 0; } if(num[i] > 255){ num[i] = 255; } } editor.putString(getKey(), num[0] + "." + num[1] + "." + num[2] + "." + num[3] ); editor.commit(); //表示を更新 notifyChanged(); } }); } }基底クラス
package jp.xii.relog.setting; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface.OnClickListener; import android.preference.DialogPreference; import android.util.AttributeSet; import android.view.View; public class OriginalDialogPreference extends DialogPreference { private String _summary = ""; //サマリーの文字列 /** * サマリの初期状態 * @param _summary the _summary to set */ public void setDefaultSummary(String _summary) { this._summary = _summary; } /** * サマリの初期状態 * @return the _summary */ public String getDefaultSummary() { return _summary; } /** * コンストラクタ * @param context * @param attrs */ public OriginalDialogPreference(Context context, AttributeSet attrs) { super(context, attrs); String temp; //サマリーの初期状態を保存しておく temp = (String) getSummary(); if(temp != null){ setDefaultSummary(temp); } } /** * ダイアログの表示 * @param context 親のコンテキスト * @param title ダイアログのタイトル * @param text ダイアログの本文 */ protected void showCustumDialog(Context context, String title, String text ,View custumItem, OnClickListener listener){ AlertDialog.Builder ad = new AlertDialog.Builder(context); ad.setTitle(title); if(text != null){ ad.setMessage(text); } ad.setView(custumItem); ad.setPositiveButton("OK", listener); ad.setNegativeButton("Cancel", null); ad.create(); ad.show(); } /** * 数値に変換する * @param number * @return */ protected int toInt(String number){ int num = 0; try{ num = Integer.parseInt(number); }catch(Exception e){ num = 0; } return num; } /** * 数値か確かめる * @param number * @return */ protected boolean isInt(String number){ boolean ret = false; try{ Integer.parseInt(number); ret = true; }catch(Exception e){ ret = false; } return ret; } }
コメント