<< Android〜LinearLayout〜 | main | Android 〜Adapter〜 >>

スポンサーサイト

一定期間更新がないため広告を表示しています


  • 2010.11.01 Monday
  • -
  • -
  • -
  • -
  • by スポンサードリンク

Android〜拡張ウィジット 

 Android 勉強進んでます。

お試しソフトということで、家計簿作りました。

日々入力するモードと、月々の収支を一覧で表示するだけのいたって簡単なアプリ。
最初の勉強としては、なかなかの出来でしたが、アーキテクチャをどう作ったらいいのか結構なやみました。

ボタン押下時のイベント系の処理ですが、
どこでも使いそうなものは、Listenerクラスを作成してそのクラス内で処理するようにしていたのですが、途中で悲しいかなデータのやりとりに苦戦しました。

成功したのは、拡張ウィジット。
とは言っても、あまり機能を持たせすぎると汎用性がなくなるので、
EditTextを継承して、数値入力用、日付入力用、文字列入力用のクラスを作成。

各クラスは、abstractで定義した親クラスを継承するようにして、
必要に応じて子クラスでプロパティを定義するようにしてました。

親クラスはこんな感じ・・・

public abstract class AbstractEditText extends EditText {
/**
* 入力チェック用メソッド.<p>
* @return TRUE:成功/FALSE:失敗
*/
protected abstract boolean validator();

/**
* コンストラクタ
* @param context
*/
public AbstractEditText(Context context) {
super(context);
}

/**
* コンストラクタ
* @param context
* @param attrs
*/
public AbstractEditText(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context, attrs);
}

/**
* ビューの初期化処理
* @param context
* @param attrs
*/
private void initView(Context context, AttributeSet attrs) {
if (attrs != null) {
required = attrs.getAttributeBooleanValue(null, "required", false);
}
}

/**
* 必須チェック実施可否.
* <p>
*/
protected boolean required = false;

/**
* 必須チェック実施可否.
* <p>
* @return
*/
public boolean isRequired() {
return required;
}

/**
* 必須チェック実施可否の設定
* @param required
*            必須チェック実施可否
*/
public void setRequired(boolean required) {
this.required = required;
}
}

子クラスはこんな感じ・・・

public class CharacterEdit extends AbstractEditText {

/**
* コンストラクタ
* @param context
*/
public CharacterEdit(Context context) {
super(context);
}

/**
* コンストラクタ
* @param context
* @param attrs
*/
public CharacterEdit(Context context, AttributeSet attrs) {
super(context, attrs);
}

/**
* 入力チェック用メソッド.
* <p>
* @return TRUE:成功/FALSE:失敗
*/
@Override
public boolean validator() {
boolean result = true;

// 必須チェック
if (super.required) {
String target = super.getText().toString();
if (target == null || target.equals("")) {
this.setBackgroundColor(Color.RED);
result = false;
}
}
return result;
}

@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
if ( this.validator() ) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
}
}

日付クラスはチェック処理がまだ甘いですが・・
タッチイベントで、DatePickerDialogを利用するようにしてみてます。

public class DateEdit extends AbstractEditText {

/**
 * コンストラクタ
 * 
 * @param context
 */
public DateEdit(Context context) {
super(context);
}

/**
 * コンストラクタ
 * 
 * @param context
 * @param attrs
 */
public DateEdit(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context, attrs);
}

/**
 * ビューの初期化処理
 * 
 * @param context
 * @param attrs
 */
private void initView(Context context, AttributeSet attrs) {
if (attrs != null) {
addSlash = attrs.getAttributeBooleanValue(null, "addslash", false);
}
this.setInputType(InputType.TYPE_DATETIME_VARIATION_DATE);

datePickerDialog = new DatePickerDialog(context,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
setText(year + "/" + monthOfYear + "/" + dayOfMonth);
}
}, Calendar.getInstance().get(Calendar.YEAR), Calendar
.getInstance().get(Calendar.MONTH) + 1, Calendar
.getInstance().get(Calendar.DAY_OF_MONTH));

}

private DatePickerDialog datePickerDialog = null;

@Override
public boolean onTouchEvent(MotionEvent event) {
if (datePickerDialog != null) {
datePickerDialog.show();
}
return super.onTouchEvent(event);
}

/**
 * 入力チェック用メソッド.
 * <p>
 * 
 * @return TRUE:成功/FALSE:失敗
 */
@Override
public boolean validator() {
boolean result = true;

// 必須チェック
if (super.required) {
String target = super.getText().toString();
if (target == null || target.equals("")) {
this.setBackgroundColor(Color.RED);
result = false;
}
}
// 日付妥当性チェックを実施
EditText ymdEdit = (EditText)findViewById(R.id.daily_ymd);
String ymd = ymdEdit.getText().toString();
if (!ymd.equals("")) {
String[] ymds = ymd.split("/");
if (ymds.length == 3) {
int month = Integer.parseInt(ymds[1]);
int day = Integer.parseInt(ymds[2]);
if (!(month <= 12 && month >= 1)) {
ymdEdit.setBackgroundColor(Color.RED);
result = false;
}
if (!(day <= 31 && day >= 1)) {
ymdEdit.setBackgroundColor(Color.RED);
result = false;
}
} else {
ymdEdit.setBackgroundColor(Color.RED);
result = false;
}
} else {
ymdEdit.setBackgroundColor(Color.RED);
result = false;
}
return result;
}

/**
 * テキストボックスに文字列(カンマ編集)を設定する
 * 
 * @param text
 */
public void setText(String date) {
if (date != null) {
if (this.addSlash) {
// カンマ編集
super.setText(DateEdit.getDate(date));
} else {
super.setText(date);
}
}
}

/**
 * 日付のフォーマットを返す。
 * 
 * Setting - Date & Time - Select date formatで設定された値を取得する
 * 
 * @param ctx
 *            the application context
 * 
 * @return
 */
public static final String getDate(String date) {

final String DEFAULT_DATE_FORMAT = "yyyy/MM/dd";

Date inputDate = new Date(date);

SimpleDateFormat formatter = new SimpleDateFormat(DEFAULT_DATE_FORMAT);

return formatter.format(inputDate);
}

/**
 * スラッシュ編集可否.
 * <p>
 */
private boolean addSlash = false;

public boolean isAddSlash() {
return addSlash;
}

public void setAddSlash(boolean addSlash) {
this.addSlash = addSlash;
}
}


参考になるのか?(笑)

Activityも親クラスを作成して、拡張ウィジットを取得できるようにラッパーメソッドを定義してみました。
public class AbstractActivity extends Activity {

/**
* TAG.<p>
*/
protected String _TAG = "AbstractActivity";

/**
* NumberEditクラスを取得する.<p>
* @param id リソースID
* @return NumberEditクラス
*/
protected NumberEdit getNumberEdit(int id) {
NumberEdit result = null;
try {
result = (NumberEdit) findViewById(id);
} catch (ClassCastException ex) {
Log.v(_TAG, ex.getMessage());
}
return result;
}
/**
* DateEditクラスを取得する.<p>
* @param id リソースID
* @return DateEditクラス
*/
protected DateEdit getDateEdit(int id) {
DateEdit result = null;
try {
result = (DateEdit) findViewById(id);
} catch (ClassCastException ex) {
Log.v(_TAG, ex.getMessage());
}
return result;
}
/**
* CharacterEditクラスを取得する.<p>
* @param id リソースID
* @return CharacterEditクラス
*/
protected CharacterEdit getCharacterEdit(int id) {
CharacterEdit result = null;
try {
result = (CharacterEdit) findViewById(id);
} catch (ClassCastException ex) {
Log.v(_TAG, ex.getMessage());
}
return result;
}
}

何よりも、Adapterクラス便利ですな(笑)



スポンサーサイト


  • 2010.11.01 Monday
  • -
  • 23:03
  • -
  • -
  • -
  • by スポンサードリンク

コメント
コメントする









この記事のトラックバックURL
トラックバック
関連会社
株式会社ツクル
誠意と創意で技術を社会に活かすIT企業
          
          
時計
calendar
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< August 2017 >>
Amazon
selected entries
categories
archives
recent comment
recommend
links
profile
search this site.
sponsored links
others
mobile
qrcode
powered
無料ブログ作成サービス JUGEM
2008JUGEMキャラコングランプリ
キャラクターデザイン:磯崎洋助/「おしゃれひつじ」