今回は、IPアドレスを設定する為のプリファレンスを作ってみました。
「AndroidでTimePickerプリファレンスを使う」で使用した基底クラスが必要です。
こんな感じ
本文がどんどん簡素になっていきますが、まぁ参考になれば。
ソースは「GoogleCode relog」にも保存していますのでよろしければどうぞ。
「AndroidでTimePickerプリファレンスを使う」で使用した基底クラスが必要です。
こんな感じ
本文がどんどん簡素になっていきますが、まぁ参考になれば。
ソースは「GoogleCode relog」にも保存していますのでよろしければどうぞ。
XML
メインクラス
<Category : Java(Android)>
<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;
}
}

