SQLの窓

2015年10月26日


Android の Data Binding( "クラス > 画面" の片方向 )における特殊コントロールの処理をデータクラス内に実装する

画面定義

Android の 公式の Data Binding は、データクラスから 画面への片方向です。また、対応しているのは setText メソッドを持つコントロールのようなので、ここで利用している NumberPickerSpinnerDatePicker では、個別にデータクラスのデータをセットする処理を実装する必要があるので、データクラス内に全て収めました。

このデータクラスは、Google Gson を使用して JSON から一括でデータをセットする事を想定しています。

注 : Data Binding と Google Gson を利用する事を目的としているため、画面用のデータは全て String で定義し、Getter や Setter を定義していません。必要ならば、Getter や Setter で拡張し、その場合でも Data Binding と Google Gson は正しく動作します

Syain クラス
import android.databinding.BaseObservable;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.DatePicker;
import android.widget.NumberPicker;
import android.widget.Spinner;

import java.util.Arrays;

public class Syain extends BaseObservable {

	// シリアライズ・デシリアライズをしない( static )
	static public MainActivity context = null;
	// NumberPicker 用
	static public NumberPicker np = null;
	static public String[] nums = {"男性","女性","不明"};
	static public int[] values = {-10,20,100};
	// Spinner 用
	static public Spinner sp = null;
	// DatePicker 用
	static public DatePicker dp = null;

	public String scode;
	public String kj;
	public String furi;
	public String syozoku;
	public String seibetu;
	public String kyuyo;
	public String teate;
	public String kanri;
	public String birth;
	public String sname;

	public Syain() {
		this.scode = "";
		this.kj = "初期状態";
		this.furi = "";
		this.syozoku = "";
		this.seibetu = "";
		this.kyuyo = "";
		this.teate = "";
		this.kanri = "";
		this.birth = "";
		this.sname = "";
	}

	// ******************************************
	// NumberPicker 用
	// ******************************************
	public void setupSeibetuControl() {
		np.setMinValue(0);
		np.setMaxValue(2);
		np.setDisplayedValues(nums);
		np.setValue(1);

	}
	public void setSeibetuControl(String seibetu) {
		if ( seibetu != null ) {
			this.seibetu = seibetu;
		}
		np.setValue(Integer.parseInt(this.seibetu));
	}
	public void getSeibetuControl() {
		this.seibetu = Integer.toString(np.getValue());
	}

	// ******************************************
	// Spinner 用
	// ******************************************
	public void setupSyozokuControl(String[] list_data) {
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(
				context,
				android.R.layout.simple_spinner_item);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		adapter.addAll(list_data);
		sp.setAdapter(adapter);
	}
	public void setSyozokuControl(String syozoku,String[] list_value) {
		if ( syozoku != null ) {
			this.syozoku = syozoku;
		}
		int idx = Arrays.binarySearch(list_value,this.syozoku);
		sp.setSelection(idx);
	}
	public void getSyozokuControl(String[] list_value) {
		int idx = sp.getSelectedItemPosition();
		this.syozoku = list_value[idx];
	}

	// ******************************************
	// DatePicker 用
	// ******************************************
	public void setupBirthControl(Boolean spinners, Boolean calendar) {
		dp.setSpinnersShown(spinners);
		dp.setCalendarViewShown(calendar);
	}
	public void setBirthControl(String birth) {
		if ( birth != null ) {
			this.birth = birth;
		}
		if ( this.birth != null ) {
			String dt[] = this.birth.split("-");
			if ( dt.length == 3 ) {
				dp.updateDate(Integer.parseInt(dt[0]), Integer.parseInt(dt[1])-1, Integer.parseInt(dt[2]));
			}
		}
	}
	public void getBirthControl() {
		this.birth = String.format("%d/%d/%d",dp.getYear(),dp.getMonth()+1,dp.getDayOfMonth());
	}


}

※ 再利用の為、先頭のパッケージ記述は削除しています

各コントロール用の Getter の引数について

Google Gson がデータを全てセットしてくれるので、その直後の処理としては、引数を必要としません。ですから、Google Gson のデシリアライズで受け取った値を使用する場合は、引数に null を使用します。
// 現在の内容でコントロールセット( fromJson 用なので、null 指定 )
syain.setSeibetuControl(null);
syain.setSyozokuControl(null, getResources().getStringArray(R.array.list_value));
syain.setBirthControl(null);


BaseObservable の継承について

ここでは、必要無かったのでこの BaseObservable の機能を使用していませんが、データクラス内のデータを個別に変更してリアルタイムで画面に反映させる場合に BaseObservable の通知機能を使います。しかし、自動生成されるバインド用のクラスの invalidateAll() を使ったほうが簡単であると思います。( Google Gson は、Setter を使用しないので利用できませんでした )

static フィールドについて

Google Gson のシリアライズとデシリアライズの対象外にする為に使用しています。当然、クラス共通となる為、画面定義と一対一と言う認識での実装です。



【2 Android Studioの最新記事】
posted by lightbox at 2015-10-26 13:49 | 2 Android Studio | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり