2011年03月28日

ダイアログの自作 EditTextをダイアログで!

ダイアログを自作します。

EditTextをダイアログに表示させて、入力後OKを押して、
Activity側で取得して、Activity側でToastで表示します。

dialogstart.png


dialogin13.png


dialog13.png


AlertDialog
ProgressDialog
DatePickerDialog
TimePickerDialog
などあるようですが、EditTextは作れない感じです。

参考サイト:ダイアログについて、日本語に翻訳
http://www.techdoctranslator.com/android/guide/ui/dialogs


というよりも、自作しないと真っ黒なデザインになるので僕は全部自作です。
自作すると、なんでもかんでも好きなようにできます。


むずかしくないです。
Dialogクラスを継承すれば簡単にできます。

DialogにもsetContentView()があるので、Activityと同じように設定すればOKです。

dismiss()でダイアログを閉じます。

注意する点は、ダイアログが閉じたとき処理をしたい場合、リスナーを設定することです、

ダイアログが閉じたら処理がActivityに帰ってくるわけではないです。
ウインドウズプログラムでいうモーダルダイアログ形式ではありません。


あと、バックボタンを押されたとき、キャンセルのリスナーも設定します。



Dialogのソース

//EditDialog.java

public class EditDialog extends Dialog {

DialogInterface.OnClickListener mOkListener = null;

public EditDialog(Context context,DialogInterface.OnClickListener Oklistener) {
super(context);

        //OK押されたときの処理のリスナー 自作です。
//ダイアログが閉じたときに処理したければ、必ず必要
mOkListener = Oklistener;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//タイトルバーは自分で作るから非表示にさせる setContentViewの前で設定
//タイトルバーも自分で作りたい人むけ
getWindow().requestFeature( Window.FEATURE_NO_TITLE );

//ダイアログのレイアウトをXMLから設定
setContentView( R.layout.dialog );

//OKボタンのリスナー
Button bt = (Button)findViewById(R.id.button1);
bt.setOnClickListener(mOnClickListener);
}


private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
public void onClick(View v) {

//OKおされたら登録されているDialogInterface.OnClickListenerを実行
mOkListener.onClick(EditDialog.this, 0);

//ダイアログを閉じる
dismiss();
}};

public EditText getEditText()
{
return (EditText)findViewById(R.id.editText1);
}
}






//Activity側
//main.java

public class main extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//クリックするとダイアログ表示
Button bt = (Button)findViewById(R.id.button1);
bt.setOnClickListener(mOnClickListener_Show);
}


private final View.OnClickListener mOnClickListener_Show = new View.OnClickListener() {
public void onClick(View v) {

//ダイアログ表示はかならずこれで行う! Activityにある関数
//内部でonCreateDialog -> onPrepareDialog が呼ばれる
showDialog(0);
}};


@Override
protected Dialog onCreateDialog(int id) {
Dialog dialog = super.onCreateDialog(id);

//showDialog(0)を呼ぶとき最初の1回だけ呼ばれる
dialog = new EditDialog(this,mOnClickListener_OkButton);
dialog.setOnCancelListener(mOnCancelListener);

return dialog;
}

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);

//showDialog(0)を呼ぶとき毎回呼ばれる
//ダイアログの状態を変化させることができる テキストボックスを初期化
EditDialog editDialog = (EditDialog)dialog;
editDialog.getEditText().setText("");
}



//ダイアログのOKボタンを押したとき
private DialogInterface.OnClickListener mOnClickListener_OkButton = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {

EditDialog editDialog = (EditDialog)dialog;
String getText = editDialog.getEditText().getText().toString();

Toast.makeText(main.this, "getText -> " + getText , Toast.LENGTH_LONG).show();
}};

//バックボタンを押したとき
private DialogInterface.OnCancelListener mOnCancelListener = new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {

//なにもしない
}};

}




posted by R at 16:07| Comment(91) | 日記

Dialogのfill_parentがきかない

自作したDialogのfill_parentがききません。

dialogsmall.png


こんな表示。


なので・・・・
空のListViewをlayout_width="fill_parent"でいれました。



dialogBig.png


すると、ちゃんとfill_parentで表示されました!


addListview.jpg

posted by R at 15:26| Comment(0) | 日記

ダイアログの表示はshowDialogで!

今まで、適当にダイアログを表示させていたのですがshowDialogで表示させるとメリットが大きいことがわかりました。


ダイアログの表示には2種類あります。


「Activityの管理のもとに表示」 と 「自分で表示」


「Activityの管理のもとに表示」とはonCreateDialogの中でダイアログを作って、showDialogで表示させることです。

「自分で表示」とは、onCreateDialogを使わずに、Dialog.show()で表示させることです。

結論からいうと、Dialog.show()はだめです。メリットなし。
では、Dialog.show()の場合を見てみましょう!

dialogstart.png

クリックすると、ダイアログを表示します。

dialogShow.png

一見できているように見えます。

ここで画面を横向きにしてみます。

dialogYoko.png

・・・・ダイアログが消えました!
そして、エラーはでませんでしたが、DDMSのログにはこんな文字が!


E/WindowManager( 522): Activity jp.r.dialogtest.main has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c41290 that was originally added here
E/WindowManager( 522): android.view.WindowLeaked: Activity jp.r.dialogtest.main has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c41290 that was originally added here
E/WindowManager( 522): at android.view.ViewRoot.(ViewRoot.java:227)
E/WindowManager( 522): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
E/WindowManager( 522): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/WindowManager( 522): at android.view.Window$LocalWindowManager.addView(Window.java:424)
E/WindowManager( 522): at android.app.Dialog.show(Dialog.java:239)


さきほどのダイアログがメモリリークしたらしいです・・・・・
Dialog.show()はヤバイです!!


それでは、showDialogをつかった場合をみてみましょう。

dialogShow.png

ここは同じです。

dialogYokoOK.png

横むいてもアクティビティが管理してくれてるので、ばっちり表示されています!




public class main extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//クリックするとダイアログ表示
Button bt = (Button)findViewById(R.id.button1);
bt.setOnClickListener(mOnClickListener_Show);
}


private final View.OnClickListener mOnClickListener_Show = new View.OnClickListener() {
public void onClick(View v) {

//ダイアログ表示はかならずこれで行う! Activityにある関数
//内部でonCreateDialog -> onPrepareDialog が呼ばれる
showDialog(0);

}};



@Override
protected Dialog onCreateDialog(int id) {
Dialog dialog = super.onCreateDialog(id);

//idは何個かダイアログがある場合に使う
if ( id == 0 )
{
//showDialogを呼ぶときに1度だけ呼ばれる
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
dialogBuilder.setTitle("タイトル");
dialogBuilder.setMessage("メッセージ");

dialogBuilder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
dialog = dialogBuilder.create();
}

return dialog;
}

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);

//showDialogを呼ぶとき毎回呼ばれる
//ダイアログの状態を変化させることができる
if ( id == 0 )
{
//今回なんもしない
}
}

}
posted by R at 15:01| Comment(0) | 日記