AndroidでIPアドレス設定プリファレンスを使う

今回は、IPアドレスを設定する為のプリファレンスを作ってみました。

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;
	}
}