Android控件系列——Dialog

Dialog

Dialog
	AlertDialog
		TimePickerDialog
		DatePickerDialog
		ProgressDialog
	AppCompatDialog
		AlertDialog
	Presentation
	CharacterPickerDialog

AlertDialog

AlertDialog.Builder builder = new Builder(当前Activity的上下文);
setTitle(String title) 设置标题
setMessage(String msg) 设置提醒信息
setCancelable(boolean isCancleable) true:点击非Dialog区域,Dialog消失
setPositiveButton(…) 右边的按钮
setNegativeButton(…) 左边的按钮
setNeutralButton(…) 中间的按钮
setSingleChoiceItems(…) 单选
setMultiChoiceItems(…) 多选
show() 显示

dismiss():消失方法必须由Dialog对象调用

Dialog dialog = builder.show();
dialog.dismiss();

ProgressDialog

//有耗时操作,必须在子线程中运行
ProgressDialog pd = new ProgressDialog(当前Activity的上下文);
setProgressStyle() 进度条风格
dismiss() 消失

确定取消对话框

AlertDialog.Builder builder = new Builder(this);
builder.setTitle("标题");
builder.setMessage("提醒信息");
builder.setPositiveButton("确定", new OnClickListener() {	
    @Override
    public void onClick(DialogInterface dialog, int which) {}
});
builder.setNegativeButton("取消", new OnClickListener() {	
    //点击事件如果设置为null则默认点击关闭对话框
    @Override
    public void onClick(DialogInterface dialog, int which) {}
});
builder.show();

单选对话框

AlertDialog.Builder builder = new Builder(this);
builder.setTitle("选择性别");
final String[] items = { "男", "女", "中性" };	//从上至下依次设置单选项的内容
//items显示的条目数组,第二个参数为默认选中的条目,-1即不选中任何条目
builder.setSingleChoiceItems(items, -1, new OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {}
});
builder.setNegativeButton("取消", null);		
builder.show();

多选对话框

AlertDialog.Builder builder = new Builder(this);
builder.setTitle("选择水果");
final String[] items = new String[] { "西瓜", "桃子", "葡萄"};
//条目的状态数组 true为选中 false为不选中
final boolean[] checkedItems = new boolean[] {true, false, false, false};	
builder.setMultiChoiceItems(items, checkedItems,
    new OnMultiChoiceClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which,boolean isChecked) {}
    });
builder.setNegativeButton("取消", null);
builder.show();

加载对话框

final ProgressDialog pd = new ProgressDialog(this);
pd.setTitle("标题");
pd.setMessage("加载中...");
pd.show();
new Thread() {		//进度条是延时操作,必须放在子线程中运行
    public void run() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        pd.dismiss();
    }
}.start();

进度条

final ProgressDialog pd = new ProgressDialog(this);
//设置进度条样式:
//STYLE_SPINNER		0
//STYLE_HORIZONTAL	1
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);	
pd.setMax(100);				//设置进度条的最大值,默认100
pd.setTitle("标题");
pd.setMessage("加载中");
pd.show();
new Thread() {
    public void run() {
        for (int i = 0; i <= 100; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            pd.setProgress(i);		//设置当前进度值
        }
        pd.dismiss();
    }
}.start();

自定义页面对话框

//初始化对话框
AlertDialog.Builder builder = new AlertDialog.Builder(this);
View view = View.inflate(上下文, R.layout.dialog_pwd, null);
builder.setView(view);	//将自定义view添加到builder中
EditText dialog_pwd = (EditText) view.findViewById(R.id.et_dialog_pwd);
EditText dialog_confirm = (EditText)view.findViewById(R.id.et_dialog_pwd_confirm);
Button bt_sure = (Button) view.findViewById(R.id.bt_dialog_sure);
Button bt_cancel = (Button) view.findViewById(R.id.bt_dialog_cancel);

bt_sure.setOnClickListener(new View.OnClickListener() {	//确定按钮
    @Override
    public void onClick(View view) {}
});

bt_cancel.setOnClickListener(new View.OnClickListener() {	//取消按钮
    @Override
    public void onClick(View view) {
        dialog.dismiss();	//取消对话框
    }
});
builder.show();//显示对话框

自定义对话框

  <!--对话框的样式-->
    <style name="NormalDialogStyle">
        <!--对话框背景 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!--边框 -->
        <item name="android:windowFrame">@null</item>
        <!--没有标题 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 是否浮现在Activity之上 -->
        <item name="android:windowIsFloating">true</item>
        <!--背景透明 -->
        <item name="android:windowIsTranslucent">false</item>
        <!-- 是否有覆盖 -->
        <item name="android:windowContentOverlay">@null</item>
        <!--进出的显示动画 -->
        <item name="android:windowAnimationStyle">@style/normalDialogAnim</item>
        <!--背景变暗-->
        <item name="android:backgroundDimEnabled">true</item>
    </style>
    <!--对话框动画-->
    <style name="normalDialogAnim" parent="android:Animation">
        <item name="@android:windowEnterAnimation">@anim/normal_dialog_enter</item>
        <item name="@android:windowExitAnimation">@anim/normal_dialog_exit</item>
    </style>

TextView cancel = (TextView) view.findViewById(R.id.cancel);
TextView confirm = (TextView) view.findViewById(R.id.confirm);
final Dialog dialog = new Dialog(this, R.style.NormalDialogStyle);
View view = View.inflate(this, R.layout.dialog_normal, null);
//设置对话框的大小
view.setMinimumHeight((int) (ScreenSizeUtils.getInstance(this).getScreenHeight() * 0.23f));
dialog.setContentView(view);
//设置在点击对话框外部后,对话框是否消失
dialog.setCanceledOnTouchOutside(true);
Window dialogWindow = dialog.getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
//自定义对话框宽度为屏幕的75%
lp.width = (int) (ScreenSizeUtils.getInstance(this).getScreenWidth() * 0.75f);
//自定义对话框高度为报国内容
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
//自定义对话框位置位于屏幕的中间
//常用位置:TOP、BOTTOM、LEFT、RIGHT、CENTER、CENTER_VERTICAL、CENTER_HORIZONTAL、FILL、FILL_HORIZONTAL、FILL_VERTICAL、CLIP_VERTICAL、CLIP_HORIZONTAL等
lp.gravity = Gravity.CENTER;	
dialogWindow.setAttributes(lp);
cancel.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        dialog.dismiss();
    }
});
confirm.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        dialog.dismiss();
    }
});
dialog.show();

总结

//将自定义view设置到对话框中
builder.setView(view)
dialog.setContentView(view);

问题

屏幕旋转后,Activity被销毁,Dialog会消失

解决方法:

//保存状态
@Override
protected void onSaveInstanceState(Bundle outState) {
	super.onSaveInstanceState(outState);
	if (dialog != null && dialog.isShowing()) {
	outState.putBoolean("DIALOG_SHOWN", true);
	}
}
//获取状态
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	if (savedInstanceState != null) {
		if (savedInstanceState.getBoolean("DIALOG_SHOWN")) {
			showDialog();
...

FragmentDialog

待更新

猜你喜欢

转载自blog.csdn.net/mLuoya/article/details/87926828