« Custom Dialog | トップページ | 3.0 preview »

2011年2月 4日 (金)

Custom Dialog(2)

なんとか週末前に動くようになりました。

結局、何が悪かったかというと、ほとんど勘違いですが、

  1. DialogにもonCreateはある。
  2. AlertDialog.Builderというのは、クラスの外からダイアログを組み立てるツールである。

ということです。

最初、onCreateというのはActivityのメソッドでActivityを継承していない(DialogはObjectの子)クラスには無いのかと思っていたのですが、単なる勘違いで、Dialogの初期化はonCreateでやるのだそうです。まず、そこを直しました。

でも、ダイアログでないのはやっぱり直らず、どうしたものかと思っていたのですが、どうやら、2.が根本的な勘違いだったようです。つまり、Builderはクラスは作り直さずにダイアログの構造(ボタンを増やすとか)を変えるためのもので、今回のようにEditTextが欲しいといった、想定外のことはできないのです。それなのにBuilder使って、できたダイアログは返していませんでした。
Builderはやめて、全部layoutからinflateすることにしました。そのため、AlertDialogを継承する必要な無くなったので、それもDialogへ変更し、EditTextにOnKeyListenerをつけてENTERを無効にしたり、ボタンにonClickリスナを登録して、データを渡すために作った自前のリスナを呼び出す処理を追加したりして、なんとか機能するようになりました。

全体をTableLayoutで作ったら、EditTextの長さによってダイアログ全体が大きくなったり、小さくなったりとか、手直しが必要な部分はあるのですが、これで部品は全部揃いました。

先にシェイクダウンして、ロジックを全部組み立て、レイアウト調整はその後にしたいと思います。今回はテーマなどもまじめに作って、少し見栄えのいいものしたいと思うので。

出来上がったダイアログはこんな感じです。

命名があまりにもやっつけですね。まぁ、後でリファクタリングかければいいので変数名をいじる危険がほとんど無いのは助かります。そういう点はとても楽でいいです。

class KinDialog extends Dialog {
	static final String TAG = "KinDialog" ;
	private Context mContext ;
	private int mKingaku ;
	private int mNinzu ;
	private EditText eKin;
	private EditText eNin;
	private OnDataChangeListener mListener;
	protected KinDialog(Context context,OnDataChangeListener listener, int kingaku, int ninzu) {
		super(context);
		mContext = context;
		mKingaku = kingaku;
		mNinzu = ninzu;
		mListener = listener;
	}
	/*
	 * onCreate
	 * @see android.app.AlertDialog#onCreate(android.os.Bundle)
	 */
	protected void onCreate(Bundle savedInstancdState){
		super.onCreate(savedInstancdState);

		LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

		requestWindowFeature(Window.FEATURE_NO_TITLE);

		View dialogView = inflater.inflate(R.layout.kindialog, null);

		TextView dTitle = (TextView) dialogView.findViewById(R.id.dialog_title);
		dTitle.setText("Sogo info");
		TextView kinView = (TextView) dialogView.findViewById(R.id.kin_title);
		kinView.setText("Kingaku");
		TextView ninView = (TextView) dialogView.findViewById(R.id.nin_title);
		ninView.setText("Ninzu");
		Button bOk = (Button) dialogView.findViewById(R.id.button_ok);
		bOk.setOnClickListener(new View.OnClickListener(){
			public void onClick(View v){
				int k = Integer.valueOf(eKin.getText().toString());
				int n = Integer.valueOf(eNin.getText().toString());
				mKingaku =k;
				mNinzu=n;
				
				mListener.OnDataChange(k, n);
			}
		});
		Button bCancel = (Button) dialogView.findViewById(R.id.button_cancel);
		bCancel.setOnClickListener(new View.OnClickListener(){
			public void onClick(View v){
				dismiss();
			}
		});
		eKin = (EditText) dialogView.findViewById(R.id.kin_box);
		eKin.setOnKeyListener(new View.OnKeyListener(){
			public boolean onKey(View v,int keyCode,KeyEvent event){
			// we ignore ENTER key
	    		if (keyCode == KeyEvent.KEYCODE_ENTER	) {return true;}
			return false;
		}});
		eNin = (EditText) dialogView.findViewById(R.id.nin_box);
		eNin.setOnKeyListener(new View.OnKeyListener(){
			public boolean onKey(View v,int keyCode,KeyEvent event){
	    		if (keyCode == KeyEvent.KEYCODE_ENTER	) {return true;}
			return false;
		}});
		eKin.setText(String.valueOf(mKingaku));
		eNin.setText(String.valueOf(mNinzu));
		
		setContentView(dialogView);

	}
	public void setOnDataChangeListener(OnDataChangeListener listener){
		mListener=listener;
	}
	interface OnDataChangeListener{
		void OnDataChange(int k,int n);
	}
}

« Custom Dialog | トップページ | 3.0 preview »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/60027/50777056

この記事へのトラックバック一覧です: Custom Dialog(2):

« Custom Dialog | トップページ | 3.0 preview »