ボタンを押しても消えない自前のダイアログテスト


2014年4月17日現在、私が理解している内容です。
間違っている場合があります。


ダイアログのボタンを押しても、すぐに消えないようにしたい

ダイアログフラグメントのボタンを押すと、自動的にダイアログが閉じてしまいます。

AlertDialog.Builderでダイアログを作ると、以下のボタンが使えますが、ダイアログを閉じさせない方法がわかりません。

setPositiveButton
setNeutralButton
setNegativeButton


処理の関係で、ボタンを押してもダイアログを閉じないで、違う挙動にしたいこともあると思いますので、調べてみました。
おおよそ、自前でダイアログを作るという方向になっていくようです。





自前のダイアログ その1 フラグメントを使用しない

まずは、フラグメントを使わない方法です。
Dialogを継承したダイアログを作ります。

画面回転してもダイアログが消えないshowDialogメソッドを使用。
OKボタンを押しても、ダイアログが消えないButton#setOnClickListener() を使用。
文字入力付き。


端末のメニューボタンを押して、出てきた「Settings」メニューをタップするとダイアログが表示されます。
端末を回転させても消えません。
OKボタンを押しただけでは消えません。





AndroidManifest.xmlは、新規作成状態から変更していません。
コードは、MainActivity.javaのみです。
ボタンなどのレイアウトは、コードで書かれてるので、XMLはありません。


MainActivity.java

package com.example.test11; import android.os.Bundle; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.view.Display; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private static int winsizex1; private static int winsizey1; private static final int DIALOG_ID1 = 0; private static final int LAYOUT_ID1 = 777; private static TextView text1; static String textstring1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FrameLayout F_layout1 = new FrameLayout(this); F_layout1.setId(LAYOUT_ID1); setContentView(F_layout1); text1 = new TextView(this); text1.setText("自前ダイアログテスト\n\nメニューを開いてSettingsをタップすると\nダイアログを表示\nOKボタンでは消えない"); F_layout1.addView(text1); //ウィンドウのサイズ取得 WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE); Display disp = wm.getDefaultDisplay(); winsizex1 = disp.getWidth(); winsizey1 = disp.getHeight(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item){ showDialog(DIALOG_ID1); return true; } //-------------------------------------------------------------------------------- @Override protected Dialog onCreateDialog(int id) { Dialog dialog; //ダイアログのOKボタンが押されたことを取得 dialog = new MyDialog1(this,Listener_MyButton); //端末の戻るボタンが押されたことを取得 dialog.setOnCancelListener(Listener_BackKey); //タイトルをセット ((MyDialog1) dialog).setData1("Dialog Test"); return dialog; } //ダイアログのOK/CANCELボタンが押されたことを取得 private DialogInterface.OnClickListener Listener_MyButton = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { String str = ((MyDialog1) dialog).getData1(which); Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show(); } }; //端末の戻るボタンが押されたことを取得 private DialogInterface.OnCancelListener Listener_BackKey = new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { Toast.makeText(MainActivity.this, "Back Key", Toast.LENGTH_SHORT).show(); } }; //-------------------------------------------------------------------------------- public class MyDialog1 extends Dialog { DialogInterface.OnClickListener MyButton = null; private String title1; private String setstring1 = textstring1; EditText text2; //コンストラクター public MyDialog1(Context context,DialogInterface.OnClickListener Button) { super(context); //ダイアログのOKボタンが押されたことを通知するListener_MyButtonのデータ MyButton = Button; } //ダイアログを生成 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //タイトルバー無し getWindow().requestFeature( Window.FEATURE_NO_TITLE ); //ダイアログのレイアウト LinearLayout layout =new LinearLayout(getContext()); layout.setOrientation(LinearLayout.VERTICAL); //縦に並ぶ double w1=winsizex1; w1=w1/1.7; LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams( (int)w1,ViewGroup.LayoutParams.WRAP_CONTENT); setContentView(layout,params1); //タイトル TextView text1 = new TextView(getContext()); text1.setText(title1); text1.setTextSize(30.0f); layout.addView(text1); //エディット text2 = new EditText(getContext()); text2.setText(setstring1); layout.addView(text2); //ボタンのレイアウト LinearLayout bt_layout =new LinearLayout(getContext()); bt_layout.setOrientation(LinearLayout.HORIZONTAL); //横に並ぶ LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); //ボタンの横幅 LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams( (int)w1/2,ViewGroup.LayoutParams.WRAP_CONTENT); //ボタン Button button1 = new Button(getContext()); button1.setText("OK"); bt_layout.addView(button1,params3); Button button2 = new Button(getContext()); button2.setText("CANCEL"); bt_layout.addView(button2,params3); layout.addView(bt_layout,params2); //リスナー登録 button1.setOnClickListener(OK_Listener); button2.setOnClickListener(CANCEL_Listener); } private final View.OnClickListener OK_Listener = new View.OnClickListener() { public void onClick(View v) { //ボタンが押されたら、Listener_MyButtonを実行 MyButton.onClick(MyDialog1.this, 1); //OKボタンのときはダイアログを閉じない //dismiss(); textstring1 = text2.getText().toString(); Toast.makeText(MainActivity.this, "OK "+textstring1, Toast.LENGTH_SHORT).show(); } }; private final View.OnClickListener CANCEL_Listener = new View.OnClickListener() { public void onClick(View v) { //ボタンが押されたら、Listener_MyButtonを実行 MyButton.onClick(MyDialog1.this, 0); //CANCELボタンのときはダイアログを閉じる dismiss(); Toast.makeText(MainActivity.this, "CANCEL", Toast.LENGTH_SHORT).show(); } }; public String getData1(int which) { //データを送る if(which==1) return "Dialog OK Button"; else return "Dialog CANCEL Button"; } public void setData1(String text) { //データを取得 title1=text; Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show(); } }; }









自前のダイアログ その2 フラグメントを使用

フラグメントを使って、ダイアログを出すテスト。
といっても、「DialogFragment」を使ってないので、
ダイアログのふりをした、フラグメントの画面ですね。


ダイアログのデザインの自由度も上がりますが。
背景が暗くなるなどの効果が欲しい場合は、自分で作らないといけません。





メニューをひらいて、「Settings」をタップすると、ダイアログが出ます。
OK、CANCELボタンでは消えません。
再び、メニューをひらいて、「Settings」をタップすると消えます。
または、端末の戻るボタンで、消えます。
ダイアログが消えてる時に戻るボタンを押すと、アプリが終了します。


フラグメントの表示、消去は、次のような感じでやってます。
タグを指定して「add」して、フラグメントを出し、消去するときは、タグを探して「remove」しています。
いずれも、「commit()」してやらないと、反映されません。

タグを使わないと、ダイアログを出したまま画面を回転させたときに、そのダイアログ(フラグメント)を消せなくなるようです。


private void My_Alt_Dialog1(){ //APIレベル4でフラグメント使用 FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); if(showflg1==0){ showflg1=1; Fragment fragment = new MyDialogF1(); ft.add(LAYOUT_ID1, fragment,"TUG").commit(); text1.setText("ダイアログを出しました"); } else{ showflg1=0; Fragment fragment = (MyDialogF1)manager.findFragmentByTag("TUG"); ft.remove(fragment).commit(); text1.setText("ダイアログを消しました"); } }




MainActivity.java

package com.example.test12; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; //こちらをインポートする //import android.app.FragmentManager; //こちらをインポートするとエラー import android.support.v4.app.FragmentTransaction; //こちらをインポートする //import android.app.FragmentTransaction; //こちらをインポートするとエラー import android.support.v4.app.Fragment; import android.view.View.OnClickListener; import android.graphics.Color; import android.os.Bundle; import android.view.Display; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends FragmentActivity { private static int winsizex1; private static int winsizey1; private static final int LAYOUT_ID1 = 777; private static TextView text1; private static String textstring1; static int showflg1=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FrameLayout F_layout1 = new FrameLayout(this); F_layout1.setId(LAYOUT_ID1); setContentView(F_layout1); text1 = new TextView(this); text1.setText("自前ダイアログテスト\n\nメニューを開いてSettingsをタップすると\nフラグメントのダイアログを表示/消去できる"); F_layout1.addView(text1); //ウィンドウのサイズ取得 WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE); Display disp = wm.getDefaultDisplay(); winsizex1 = disp.getWidth(); winsizey1 = disp.getHeight(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item){ My_Alt_Dialog1(); return true; } private void My_Alt_Dialog1(){ //APIレベル4でフラグメント使用 FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); if(showflg1==0){ showflg1=1; Fragment fragment = new MyDialogF1(); ft.add(LAYOUT_ID1, fragment,"TUG").commit(); text1.setText("ダイアログを出しました"); } else{ showflg1=0; Fragment fragment = (MyDialogF1)manager.findFragmentByTag("TUG"); ft.remove(fragment).commit(); text1.setText("ダイアログを消しました"); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ //端末の戻るキーが押された if(showflg1==1){ //ダイアログが出ていたら消す showflg1=0; FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); Fragment fragment = (MyDialogF1)manager.findFragmentByTag("TUG"); ft.remove(fragment).commit(); text1.setText("端末の戻るキーで、ダイアログを消しました"); return true; } else{ //アプリ終了 finish(); return false; } } return false; } //--------------------------------------------------------------------- public static class MyDialogF1 extends Fragment { private String title1="Dialog Test"; EditText text2; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //ダイアログのレイアウト LinearLayout L_layout1 = new LinearLayout(getActivity()); LinearLayout layout =new LinearLayout(getActivity()); layout.setOrientation(LinearLayout.VERTICAL); //縦に並ぶ layout.setBackgroundColor(Color.argb(128, 0, 0, 255)); double w1 = winsizex1; w1=w1/1.7; LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams( (int)w1,ViewGroup.LayoutParams.WRAP_CONTENT); params1.setMargins((int) ((winsizex1-w1)/2),winsizey1/4,0,0); //タイトル TextView texttitle1 = new TextView(getActivity()); texttitle1.setText(title1); texttitle1.setTextSize(30.0f); layout.addView(texttitle1); //エディット text2 = new EditText(getActivity()); layout.addView(text2); //ボタンのレイアウト LinearLayout bt_layout =new LinearLayout(getActivity()); bt_layout.setOrientation(LinearLayout.HORIZONTAL); //横に並ぶ LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); //ボタンの横幅 LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams( (int)w1/2,ViewGroup.LayoutParams.WRAP_CONTENT); //ボタン Button button1 = new Button(getActivity()); button1.setText("OK"); bt_layout.addView(button1,params3); Button button2 = new Button(getActivity()); button2.setText("CANCEL"); bt_layout.addView(button2,params3); layout.addView(bt_layout,params2); L_layout1.addView(layout,params1); //----------------------------------------- //ボタンのリスナー button1.setOnClickListener( new OnClickListener() { //ボタンが押されたら何かする @Override public void onClick(View v) { //テキストをセット textstring1 = text2.getText().toString(); text1.setText("OKが押された "+textstring1); } }); //ボタンのリスナー button2.setOnClickListener( new OnClickListener() { //ボタンが押されたら何かする @Override public void onClick(View v) { //テキストをセット text1.setText("CANCELが押された"); } }); //----------------------------------------- return L_layout1; } } }









自前のダイアログ その3 フラグメントを使用

その2と同じものですが、フラグメントのクラスを、「MyDialogF1.java」として別ファイルにしました。







MyDialogF1.java

package com.example.test13; import android.support.v4.app.Fragment; //こちらをインポートする //import android.app.Fragment; //こちらをインポートするとエラー import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; public class MyDialogF1 extends Fragment { private onFragmentButtonClickedListener listener; private int winsizex1; private int winsizey1; private String title1="Dialog Test"; EditText text2; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //ダイアログのレイアウト LinearLayout L_layout1 = new LinearLayout(getActivity()); LinearLayout layout =new LinearLayout(getActivity()); layout.setOrientation(LinearLayout.VERTICAL); //縦に並ぶ layout.setBackgroundColor(Color.argb(128, 0, 0, 255)); winsizex1=MainActivity.winsizex1; winsizey1=MainActivity.winsizey1; double w1 = winsizex1; w1=w1/1.7; LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams( (int)w1,ViewGroup.LayoutParams.WRAP_CONTENT); params1.setMargins((int) ((winsizex1-w1)/2),winsizey1/5,0,0); //タイトル TextView texttitle1 = new TextView(getActivity()); texttitle1.setText(title1); texttitle1.setTextSize(30.0f); layout.addView(texttitle1); //エディット text2 = new EditText(getActivity()); layout.addView(text2); //ボタンのレイアウト LinearLayout bt_layout =new LinearLayout(getActivity()); bt_layout.setOrientation(LinearLayout.HORIZONTAL); //横に並ぶ LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); //ボタンの横幅 LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams( (int)w1/2,ViewGroup.LayoutParams.WRAP_CONTENT); //ボタン Button button1 = new Button(getActivity()); button1.setText("OK"); bt_layout.addView(button1,params3); Button button2 = new Button(getActivity()); button2.setText("CANCEL"); bt_layout.addView(button2,params3); layout.addView(bt_layout,params2); L_layout1.addView(layout,params1); //----------------------------------------- //ボタンのリスナー button1.setOnClickListener( new OnClickListener() { //ボタンが押されたら何かする @Override public void onClick(View v) { //テキストをセット MainActivity.textstring1 = text2.getText().toString(); listener.onFragmentButton1(1); } }); //ボタンのリスナー button2.setOnClickListener( new OnClickListener() { //ボタンが押されたら何かする @Override public void onClick(View v) { listener.onFragmentButton1(2); } }); //----------------------------------------- return L_layout1; } //ボタンの押されたことを通知 public interface onFragmentButtonClickedListener { public void onFragmentButton1(int button); } //Activityに関連付けされた時に一度だけ呼ばれる @Override public void onAttach(Activity activity) { super.onAttach(activity); listener = (onFragmentButtonClickedListener)activity; } }




MainActivity.java

package com.example.test13; import com.example.test13.MyDialogF1.onFragmentButtonClickedListener; import android.support.v4.app.FragmentActivity; //APIレベル4以上でフラグメントサポート import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; //こちらをインポートする //import android.app.FragmentManager; //こちらをインポートするとエラー import android.support.v4.app.FragmentTransaction; //こちらをインポートする //import android.app.FragmentTransaction; //こちらをインポートするとエラー import android.os.Bundle; import android.view.Display; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.TextView; public class MainActivity extends FragmentActivity implements onFragmentButtonClickedListener{ static int showflg1=0; static int winsizex1; static int winsizey1; private static final int LAYOUT_ID1 = 777; private static TextView text1; static String textstring1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FrameLayout F_layout1 = new FrameLayout(this); F_layout1.setId(LAYOUT_ID1); setContentView(F_layout1); text1 = new TextView(this); text1.setText("自前ダイアログテスト\n\nメニューを開いてSettingsをタップすると\nフラグメントのダイアログを表示/消去できる"); F_layout1.addView(text1); //ウィンドウのサイズ取得 WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE); Display disp = wm.getDefaultDisplay(); winsizex1 = disp.getWidth(); winsizey1 = disp.getHeight(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item){ My_Alt_Dialog3(); return true; } private void My_Alt_Dialog3(){ //APIレベル4でフラグメント使用 FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); if(showflg1==0){ showflg1=1; Fragment fragment = new MyDialogF1(); ft.add(LAYOUT_ID1, fragment,"TUG").commit(); text1.setText("ダイアログを出しました"); } else{ showflg1=0; Fragment fragment = (MyDialogF1)manager.findFragmentByTag("TUG"); ft.remove(fragment).commit(); text1.setText("ダイアログを消しました"); } } public void onFragmentButton1(int button) { switch(button){ case 1: text1.setText("OKボタンが押されました "+textstring1); break; case 2: //ダイアログを消す showflg1=0; FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); Fragment fragment = (MyDialogF1)manager.findFragmentByTag("TUG"); ft.remove(fragment).commit(); text1.setText("CANCELボタンで、ダイアログを消しました"); break; } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ //端末の戻るキーが押された if(showflg1==1){ //ダイアログが出ていたら消す showflg1=0; FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); Fragment fragment = (MyDialogF1)manager.findFragmentByTag("TUG"); ft.remove(fragment).commit(); text1.setText("端末の戻るキーで、ダイアログを消しました"); return true; } else{ //アプリ終了 finish(); return false; } } return false; } }






自前のダイアログ その4 AlertDialog.Builder と、「 setView 」 を使用

AlertDialog.Builderを使ってアラートダイアログを出す場合でも、
「setView」を使えば、同じようなことができるっぽいです。
ボタンを含むレイアウトを作り、「setView」で登録します。
ただのボタンなので、押してもダイアログは閉じません。

以下、「ダイアログ」と、「ダイアログ フラグメント」のサンプル。







DialogF1.java

package com.example.test14; import android.support.v4.app.DialogFragment; //こちらをインポートする //import android.app.DialogFragment; //これをインポートしてはいけない import android.app.AlertDialog; import android.app.Dialog; import android.view.View; import android.view.View.OnClickListener; import android.graphics.Color; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import android.os.Bundle; public class DialogF1 extends DialogFragment { EditText txt; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LinearLayout layout = new LinearLayout(getActivity()); layout.setOrientation(LinearLayout.VERTICAL); layout.setBackgroundColor(Color.argb(128, 255, 255, 128)); TextView tv = new TextView(getActivity()); tv.setText("ダイアログフラグメント"); tv.setTextSize(20.0f); layout.addView(tv); txt = new EditText(getActivity()); txt.setText("文字列"); layout.addView(txt); Button bt = new Button(getActivity()); bt.setText("ボタン"); layout.addView(bt); builder.setView(layout); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getActivity(), "ボタンが押された", Toast.LENGTH_SHORT).show(); String text = txt.getText().toString(); //アクティビティにデータを送る MainActivity mainactivity = (MainActivity) getActivity(); mainactivity.SendDialogData(text); //ダイアログを消す //dismiss(); } }); return builder.create(); } }


MainActivity.java

package com.example.test14; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; //こちらをインポートすること //import android.app.FragmentManager; //これをインポートしてはいけない import android.os.Bundle; import android.app.AlertDialog; import android.app.Dialog; import android.graphics.Color; import android.view.View.OnClickListener; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0,0,0,"ダイアログ"); menu.add(0,0,1,"ダイアログフラグメント"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item){ super.onOptionsItemSelected(item); int itemOrder=item.getOrder(); switch(itemOrder){ case 0: My_Alt_Dialog11(); break; case 1: My_Alt_Dialog2(); break; } return true; } //--------------------------------------- //従来のダイアログ private void My_Alt_Dialog11() { showDialog(0); } @Override protected Dialog onCreateDialog(int id) { LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.setBackgroundColor(Color.argb(128, 128, 255, 255)); TextView tv = new TextView(this); tv.setText("ダイアログ"); tv.setTextSize(30.0f); layout.addView(tv); EditText txt = new EditText(this); txt.setText("文字列"); layout.addView(txt); Button bt = new Button(this); bt.setText("ボタン"); layout.addView(bt); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setView(layout); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ボタンが押された", Toast.LENGTH_SHORT).show(); } }); return builder.create(); } //--------------------------------------- //ダイアログフラグメントを使う private void My_Alt_Dialog2() { FragmentManager fm = getSupportFragmentManager(); DialogF1 af = new DialogF1(); af.show(fm, "alert_dialog"); } public void SendDialogData(String value) { //ダイアログからデータを受けとる Toast.makeText(MainActivity.this, "ボタンが押された "+value, Toast.LENGTH_SHORT).show(); } }






ダイアログ(Dialog)で、レイアウト(setContentView)を使う

XMLでレイアウトを作っておけば楽ということなのですが、
動的にあれこれ出来る方法を試してみたいもので、こんなふうにあれこれしてるというわけです。

「Dialog」の場合、「setContentView」を使って普通にレイアウトなどのビューを設定できるみたいですので、
何か、あれこれ活用できるかもしれません。



背景にドロイドくんのアイコンを貼ってみました。
端末のメニューボタンを押すと、メニューが出てくるので、タップ。




ダイアログが透けてます。
外枠が、ダイアログのウィンドウサイズ。
内側が、ボタンなどを配置してるレイアウトのサイズです。




「R_layout.setGravity(Gravity.BOTTOM|Gravity.CENTER);」を使って、ウィンドウの中で、レイアウトの表示場所を変えられます。




「dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));」を有効にすると、
ウィンドウが完全に透けますので、外枠が見えなくなります。




「AndroidManifest.xml」で、
「android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"」を指定すると、
後ろも透明になります。










DialogF1.java

package com.example.test15; import android.support.v4.app.DialogFragment; //こちらをインポートする //import android.app.DialogFragment; //これをインポートしてはいけない import android.app.Dialog; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.graphics.Color; import android.graphics.PixelFormat; import android.graphics.drawable.ColorDrawable; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import android.os.Bundle; public class DialogF1 extends DialogFragment { EditText txt; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = new Dialog(getActivity()); //ウィンドウの大きさとか色とか dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); //dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); //dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0x00ffffff)); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0x44ff0000)); DisplayMetrics metrics = getResources().getDisplayMetrics(); double Width1 = metrics.widthPixels; double Height1 = metrics.heightPixels; Width1 = Width1 * 0.7; Height1 = Height1 * 0.7; //ウィンドウのレイアウトの中のレイアウト LinearLayout layout = new LinearLayout(getActivity()); layout.setOrientation(LinearLayout.VERTICAL); layout.setBackgroundColor(Color.argb(128, 255, 255, 128)); LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams( (int)(Width1-(Width1/10)),ViewGroup.LayoutParams.WRAP_CONTENT); layout.setLayoutParams(params1); TextView tv = new TextView(getActivity()); tv.setText("ダイアログ フラグメント"); tv.setTextSize(15.0f); layout.addView(tv); txt = new EditText(getActivity()); txt.setText("文字列"); layout.addView(txt); Button bt = new Button(getActivity()); bt.setText("ボタン"); layout.addView(bt); //ウィンドウのレイアウト RelativeLayout R_layout=new RelativeLayout(getActivity()); //R_layout.setGravity(Gravity.TOP|Gravity.CENTER);//上寄せ //R_layout.setGravity(Gravity.CENTER);//中央寄せ R_layout.setGravity(Gravity.BOTTOM|Gravity.CENTER);//下寄せ R_layout.addView(layout); //ダイアログにレイアウトをセット dialog.setContentView(R_layout); //ボタンのリスナー bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getActivity(), "ボタンが押された", Toast.LENGTH_SHORT).show(); String text = txt.getText().toString(); //アクティビティにデータを送る MainActivity mainactivity = (MainActivity) getActivity(); mainactivity.SendDialogData(text); //ダイアログを消す //dismiss(); } }); //ウィンドウの大きさ WindowManager.LayoutParams winparrams= dialog.getWindow().getAttributes(); winparrams.width = (int) Width1; winparrams.height = (int) Height1; dialog.getWindow().setAttributes(winparrams); return dialog; } }




MainActivity.java

package com.example.test15; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; //こちらをインポートすること //import android.app.FragmentManager; //これをインポートしてはいけない import android.os.Bundle; import android.app.Dialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.View.OnClickListener; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //背景にアイコン表示 Bitmap image = BitmapFactory.decodeResource( getResources(),R.drawable.ic_launcher); ImageView imgvw = new ImageView(this); imgvw.setImageBitmap(image); imgvw.setScaleType(ImageView.ScaleType.FIT_XY); imgvw.setAdjustViewBounds(true); setContentView(imgvw); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0,0,0,"ダイアログ"); menu.add(0,0,1,"ダイアログフラグメント"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item){ super.onOptionsItemSelected(item); int itemOrder=item.getOrder(); switch(itemOrder){ case 0: My_Alt_Dialog11(); break; case 1: My_Alt_Dialog2(); break; } return true; } //--------------------------------------- //従来のダイアログ private void My_Alt_Dialog11() { showDialog(0); } @Override protected Dialog onCreateDialog(int id) { //ウィンドウの大きさとか色とか Dialog dialog = new Dialog(this); dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); //dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); //dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0x00ffffff)); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0x4400ff00)); DisplayMetrics metrics = getResources().getDisplayMetrics(); double Width1 = metrics.widthPixels; double Height1 = metrics.heightPixels; Width1 = Width1 * 0.7; Height1 = Height1 * 0.7; //ウィンドウのレイアウトの中のレイアウト LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.setBackgroundColor(Color.argb(128, 128, 255, 255)); LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams( (int)(Width1-(Width1/10)),ViewGroup.LayoutParams.WRAP_CONTENT); layout.setLayoutParams(params1); TextView tv = new TextView(this); tv.setText("ダイアログ"); tv.setTextSize(30.0f); layout.addView(tv); EditText txt = new EditText(this); txt.setText("文字列"); layout.addView(txt); Button bt = new Button(this); bt.setText("ボタン"); layout.addView(bt); //ウィンドウのレイアウト RelativeLayout R_layout=new RelativeLayout(this); //R_layout.setGravity(Gravity.TOP|Gravity.CENTER);//上寄せ R_layout.setGravity(Gravity.CENTER);//中央寄せ //R_layout.setGravity(Gravity.BOTTOM|Gravity.CENTER);//下寄せ R_layout.addView(layout); //ダイアログにレイアウトをセット dialog.setContentView(R_layout); //ボタンのリスナー bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ボタンが押された", Toast.LENGTH_SHORT).show(); } }); //ウィンドウの大きさ WindowManager.LayoutParams winparrams= dialog.getWindow().getAttributes(); winparrams.width = (int) Width1; winparrams.height = (int) Height1; dialog.getWindow().setAttributes(winparrams); return dialog; } //--------------------------------------- //ダイアログフラグメントを使う private void My_Alt_Dialog2() { FragmentManager fm = getSupportFragmentManager(); DialogF1 af = new DialogF1(); af.show(fm, "alert_dialog"); } public void SendDialogData(String value) { //ダイアログからデータを受けとる Toast.makeText(MainActivity.this, "ボタンが押された "+value, Toast.LENGTH_SHORT).show(); } }


「ウィンドウの大きさ」は、setContentViewでビューの大きさを設定した後でなければ、反映されません。
ウィンドウの大きさを先に指定しても、ビューの大きさのデータに上書きされるようです。











戻る