ダイアログのボタンを押しても、すぐに消えないようにしたい
ダイアログフラグメントのボタンを押すと、自動的にダイアログが閉じてしまいます。
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でビューの大きさを設定した後でなければ、反映されません。
ウィンドウの大きさを先に指定しても、ビューの大きさのデータに上書きされるようです。