均属于笔记,仅供个人参考,有问题欢迎指正,整理模式
一,7种形式的Android Dialog使用举例
在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择。这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一下,Android Dialog的类型无非也就7种,下面我分别向大家介绍这7种Android Dialog对话框的使用方法,希望对大家能有所帮助。
1.该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式。
创建dialog对话框方法代码如下:
创建dialog对话框方法代码如下:
protected void dialog() {
AlertDialog.Builder builder = new Builder(Main.this);
builder.setMessage("确认退出吗?");
builder.setTitle("提示");
builder.setPositiveButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Main.this.finish();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
在onKeyDown(int keyCode, KeyEvent event)方法中调用此方法
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
dialog();
}
return false;
}
2.改变了对话框的图表,添加了三个按钮
创建dialog的方法代码如下:
Dialog dialog = new AlertDialog.Builder(this).setIcon(
android.R.drawable.btn_star).setTitle("喜好调查").setMessage(
"你喜欢李连杰的电影吗?").setPositiveButton("很喜欢",
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(Main.this, "我很喜欢他的电影。",
Toast.LENGTH_LONG).show();
}
}).setNegativeButton("不喜欢", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(Main.this, "我不喜欢他的电影。", Toast.LENGTH_LONG)
.show();
}
}).setNeutralButton("一般", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(Main.this, "谈不上喜欢不喜欢。", Toast.LENGTH_LONG)
.show();
}
}).create();
dialog.show();
3.信息内容是一个简单的View类型
创建dialog方法的代码如下:
new AlertDialog.Builder(this).setTitle("请输入").setIcon(
android.R.drawable.ic_dialog_info).setView(
new EditText(this)).setPositiveButton("确定", null)
.setNegativeButton("取消", null).show();
4.信息内容是一组单选框
创建dialog方法的代码如下:
new AlertDialog.Builder(this).setTitle("复选框").setMultiChoiceItems(
new String[] { "Item1", "Item2" }, null, null)
.setPositiveButton("确定", null)
.setNegativeButton("取消", null).show();
5.信息内容是一组多选框
创建dialog方法的代码如下:
new AlertDialog.Builder(this).setTitle("单选框").setIcon(
android.R.drawable.ic_dialog_info).setSingleChoiceItems(
new String[] { "Item1", "Item2" }, 0,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).setNegativeButton("取消", null).show();
6.信息内容是一组简单列表项
创建dialog的方法代码如下:
new AlertDialog.Builder(this).setTitle("列表框").setItems(
new String[] { "Item1", "Item2" }, null).setNegativeButton(
"确定", null).show();
7.信息内容是一个自定义的布局
dialog布局文件代码如下:
android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="#ffffffff" android:orientation="horizontal" android:id="@+id/dialog"> android:layout_width="wrap_content" android:id="@+id/tvname" android:text="姓名:" /> android:layout_width="wrap_content" android:id="@+id/etname" android:minWidth="100dip"/>
创建dialog方法的代码如下:
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.dialog,
(ViewGroup) findViewById(R.id.dialog));
new AlertDialog.Builder(this).setTitle("自定义布局").setView(layout)
.setPositiveButton("确定", null)
.setNegativeButton("取消", null).show();
参考:http://blog.csdn.net/qq457163027/article/details/51192531
http://www.android100.org/html/201302/18/1611.html
二,小的知识点
1,create().show()和show()都可以是显示弹出框,两者的区别和联系:
没加create()时show()方法是AlertDialog.Builder类的show()方法;
加了create()方法后的show()方法是Dialog类的show()方法;
而AlertDialog.Builder类的show()方法如下:
AlertDialog.Builder.show()
{
AlertDialog dialog = create();
dialog.show();
return dialog;
}
AlertDialog.Builder类的show()方法里头自己有create()方法。
2,dialog.dismiss()方法的作用:
让dialog消失。
在builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int arg1) {
//有没有这行代码点击后弹出框都可以消失。
// dialog.dismiss();
}
});
三, Android自定义Dialog简单实例
做Android应用中,最缺少不了的就是自定义Dialog,对于系统默认提供的Dialog样式,一般都不复合我们应用的样式。
自定义Dialog需要3步骤即可:
1)、主要的重写Dialog的Java类
2)、自定义布局文件、并设置Dialog Theme,在style.xml文件中加一个即可
3)、使用方法
1、创建CustomPopDialog2.java类
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager.LayoutParams;
import android.widget.ImageView;
/**
* 该自定义Dialog应用在:弹出框居中显示图片,点击其他区域自动关闭Dialog
*/
public class CustomPopDialog2 extends Dialog {
public CustomPopDialog2(Context context) {
super(context);
}
public CustomPopDialog2(Context context, int theme) {
super(context, theme);
}
public static class Builder {
private Context context;
private Bitmap image;
public Builder(Context context) {
this.context = context;
}
public Bitmap getImage() {
return image;
}
public void setImage(Bitmap image) {
this.image = image;
}
public CustomPopDialog2 create() {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final CustomPopDialog2 dialog = new CustomPopDialog2(context,R.style.Dialog);
View layout = inflater.inflate(R.layout.dialog_share_qrcode, null);
dialog.addContentView(layout, new LayoutParams(
android.view.ViewGroup.LayoutParams.WRAP_CONTENT
, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
dialog.setContentView(layout);
ImageView img = (ImageView)layout.findViewById(R.id.img_qrcode);
img.setImageBitmap(getImage());
return dialog;
}
}
}
这里简单说明下,我们自定义Dialog需要准备一个自己的View布局文件,主要关注create()方法即可,本例中就是直接显示一个图片。
2、自定义View的布局文件、并在style.xml中添加theme
android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:id="@+id/rootLayout"> android:id="@+id/img_qrcode" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="二维码" />
样式:
3、使用自定义的Dialog
Bitmap bitmap = xxxxx;// 这里是获取图片Bitmap,也可以传入其他参数到Dialog中
CustomPopDialog2.Builder dialogBuild = new CustomPopDialog2.Builder(context);
dialogBuild.setImage(bitmap);
CustomPopDialog2 dialog = dialogBuild.create();
dialog.setCanceledOnTouchOutside(true);// 点击外部区域关闭
dialog.show();
参考:http://blog.csdn.net/catoop/article/details/50177147
http://blog.csdn.net/duanyanrui/article/details/8494767
四,Android--Dialog详细讲解
Dialog,对话框,一个对话框就是一个小窗口,并不会填满整个屏幕,通常是以模态显示,要求用户必须采取行动才能继续进行剩下的操作。
Android提供了丰富的对话框支持,它提供了如下4中常用的对话框:
AlertDialog:警告对话框,使用最广泛功能最丰富的一个对话框。
ProgressDialog:进度条对话框,只是对进度条进行了简单的封装。
DatePickerDialog:日期对话框。
TimePickerDialog:时间对话框。
所有的对话框,都是直接或间接继承自Dialog类,而AlterDialog直接继承自Dialog,其他的几个类均继承自AlterDialog。
参考:http://www.kwstu.com/ArticleView/kwstu_20139682354515
http://blog.csdn.net/liang5630/article/details/44098899
五,设置Dialog使返回键和点击外围失效(默认返回键和点击外围都可以使其消失)
1,对于AlertDialog.Builder(this)这种形式创建的Dialog
对于AlertDialog.Builder(this)这种形式创建的Dialog,只要new AlertDialog.Builder(this).setCancelable(false)这一行就可以使点击外围和返回键都失效。
2,对于AlertDialog dlg = new AlertDialog.Builder(this).create();先获取具体的Dialog的处理
dialog.setCancelable(false);这行代码也可以使返回键和点击外围失效。
Dialog的出现,很好的提升生了用户的用户体验,但是对于咱们程序猿来说,怎么样来好好的控制用户的误操作是个头疼问题啊,Dialog默认在按下返回键的时候会消失掉,那么如何让Dialog在用户按下返回键也不消失呢,方法是有的,毕竟Android是去过太空的,方法就是应该截取dialog的key响应事件,当dialog在前台显示的时候,keylistener首先会派发到dialog里面,在那里面监听就好了。
首先申请一个keylistener,在里面监听系统的按键,当然同样可以监听home键和其他的按键:
private OnKeyListener keylistener = new DialogInterface.OnKeyListener() {
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
return true;
} else {
return false;
}
}
};
然后在你创建Dialog的时候,将这个监听注册进去就哦了,方法如下:
AlertDialog dlg = new AlertDialog.Builder(this).create();
dlg.setOnKeyListener(keylistener);
dlg.setCancelable(false);
dlg.show();
其他的操作这里就不再累述,这样就算你按下返回,Dialog就不会消失了,PS: setCancelable(false),作用是当dialog弹出来的时候,如果触点在dialog外围,按照默认的方式 dialog将消失。如果这个设为false的话 这种情况dialog就不会消失了。 加了这一句就OK了 dialog.setCancelable(false);
参考:http://blog.csdn.net/LuckChouDog/article/details/42234801
六,Android界面之----自定义的Dialog,然后利用回调方法,在调用处,进行Dialog中各按钮的事件处理
public class LeaveMeetingDialog extends Dialog implements OnClickListener{
private Button quitBtn,stopBtn,cancelBtn;
private LeaveMeetingDialogListener listener;
public interface LeaveMeetingDialogListener{
public void onClick(View view);
}
public LeaveMeetingDialog(Context context,int theme,LeaveMeetingDialogListener listener) {
super(context,theme);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.leave_meeting_dialog);
initViews();
}
private void initViews(){
quitBtn = (Button)findViewById(R.id.quit_btn);
stopBtn = (Button)findViewById(R.id.stop_btn);
cancelBtn = (Button)findViewById(R.id.cancel_btn);
quitBtn.setOnClickListener(this);
stopBtn.setOnClickListener(this);
cancelBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
listener.onClick(v);
}
}
---调用处:
[java]
LeaveMeetingDialog dialog = new LeaveMeetingDialog(this,R.style.Theme_CustomDialog,
new LeaveMeetingDialogListener() {
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.quit_btn:break;
case R.id.stop_btn:break;
case R.id.cancel_btn:break;
}
}
});
dialog.show();
参考:http://www.2cto.com/kf/201205/133945.html
七,显示弹出框后,后面界面不变暗
第一种是在样式文件styles.xml中添加新的样式,父样式指向的是默认的Dialog样式,修改如下,然后你的Dialog用你添加的样式就可以了.
第二种是在代码中修改.lp.alpha大小随自己要求设置
// 设置屏幕背景变暗
private void setScreenBgDarken() {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 0.5f;
lp.dimAmount = 0.5f;
getWindow().setAttributes(lp);
}
// 设置屏幕背景变亮
private void setScreenBgLight() {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 1.0f;
lp.dimAmount = 1.0f;
getWindow().setAttributes(lp);
}