Android的警示对话框AlertDialog简单使用实例(附Demo)
目录
AlertDialog默认样式
单选样式的AlertDialog:
AlertDialog多选样式:
AlertDialog自定义样式:
自定义Dialog:
Demo地址:https://github.com/zGuangYuan/Androidstudio_example
Alertlog简介:Alertlog可以在当前的界面弹出一个对话框,而且这个对话框是至于所有颜色之上,能够屏蔽其他的控件的显示,Alertlog一般用于提示一些重要的内容或者信息。
-
默认样式
-
单选样式
-
多选样式
-
自定义样式
-
自定义Dialog
AlertDialog默认样式
例子:
新建一个包,名为:Alertdialog
在Alertdialog这个包里新建一个Empty Activity,命名为:DiaglogActivity.
在默认的Activity(MainActivity)设置一个按钮可以跳转到DiaglogActivity中,并为这个按钮绑定监听器:
在布局文件添加一个控件
在MainActivity获取控件对象,绑定监听器:
整体代码,出了这个按钮,别的可以不用管:
package com.example.yuan.e06_gridview;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import com.example.yuan.e06_gridview.Alertdialog.DiaglogActivity;import com.example.yuan.e06_gridview.GridView.GridViewActivity;import com.example.yuan.e06_gridview.ListView.ListViewActivity;import com.example.yuan.e05_listview.R;import com.example.yuan.e06_gridview.RecycleView.RecycleViewActivity;import com.example.yuan.e06_gridview.Toast.ToastActivity;import com.example.yuan.e06_gridview.WebView.WebViewActivity;public class MainActivity extends AppCompatActivity { //声明引用 private Button mIVButton; private Button mLVButton; private Button mGVButton; private Button mRVButton; private Button mWVButton; private Button mToastButton,mDiaglogButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取控件对象 mIVButton=(Button) findViewById(R.id.IVButton_Id); mLVButton=(Button) findViewById(R.id.LVButton_Id); mGVButton=(Button) findViewById(R.id.GVButton_Id); mRVButton=(Button) findViewById(R.id.RVButton_Id); mWVButton=(Button) findViewById(R.id.WVButton_Id); mToastButton=(Button)findViewById(R.id.ToastButton_Id); mDiaglogButton=(Button) findViewById(R.id.DiaglogButton_Id); setlistener(); } //设置监听器 public void setlistener(){ ButtonClickListener listener =new ButtonClickListener(); mLVButton.setOnClickListener(listener); mIVButton.setOnClickListener(listener); mGVButton.setOnClickListener(listener); mRVButton.setOnClickListener(listener); mWVButton.setOnClickListener(listener); mToastButton.setOnClickListener(listener); mDiaglogButton.setOnClickListener(listener); } //实现监听器接口 class ButtonClickListener implements OnClickListener{ @Override public void onClick(View v) { Intent intent = null; switch (v.getId()){ case R.id.ToastButton_Id: intent = new Intent(MainActivity.this, ToastActivity.class); break; case R.id.GVButton_Id: intent=new Intent(MainActivity.this, GridViewActivity.class); break; case R.id.IVButton_Id: intent = new Intent(MainActivity.this,ImageViewActivity.class); break; case R.id.LVButton_Id: intent =new Intent(MainActivity.this, ListViewActivity.class); break; case R.id.RVButton_Id: intent = new Intent(MainActivity.this, RecycleViewActivity.class); break; case R.id.WVButton_Id: intent =new Intent(MainActivity.this, WebViewActivity.class); break; //跳转到Diaglog演示界面 case R.id.DiaglogButton_Id: intent = new Intent(MainActivity.this, DiaglogActivity.class); } startActivity(intent); } }}
现在开始正式编写AlertDialog的代码:
回到activity_dialog这个布局文件中,设置几个按钮用于显示不同的Diaglog的样式:
整体代码:
<?xml version="1.0" encoding="utf-8"?>
在DiagActivity获取这些按钮的控件实例,并为其绑定监听器:
先看看一看默认的Diaglog是怎样的,在样式一按钮的响应事件添加一个Diaglog:
整体代码:
package com.example.yuan.e06_gridview.Alertdialog;import android.annotation.SuppressLint;import android.content.DialogInterface;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.Toast;import com.example.yuan.e05_listview.R;public class DiaglogActivity extends AppCompatActivity { //声明引用 private Button mDialogButton1,mDialogButton2,mDialogButton3,mDialogButton4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_diaglog); //获取控件对象 mDialogButton1 = (Button)findViewById(R.id.DG_Button_Id1); mDialogButton2 = (Button) findViewById(R.id.DG_Button_Id2); mDialogButton3 = (Button) findViewById(R.id.DG_Button_Id3); mDialogButton4 = (Button) findViewById(R.id.DG_Button_Id4); //生成监听器对象,绑定监听器 DiaglogClickListener listener = new DiaglogClickListener(); mDialogButton1.setOnClickListener(listener); mDialogButton2.setOnClickListener(listener); mDialogButton3.setOnClickListener(listener); mDialogButton4.setOnClickListener(listener); } //设置按键的监听器类 class DiaglogClickListener implements View.OnClickListener{ @Override public void onClick(View v) { switch (v.getId()){ case R.id.DG_Button_Id1: //采用AlertDialog的设计者模式 AlertDialog.Builder bulider = new AlertDialog.Builder(DiaglogActivity.this); //设置标题 bulider.setTitle("请回答问题"); //设置提示信息 bulider.setMessage("你觉得今天天气怎么样?"); //设置属性 bulider.setPositiveButton("很好", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(),"天气很好",Toast.LENGTH_LONG).show(); } }) .setNeutralButton("一般", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(),"天气一般",Toast.LENGTH_LONG).show(); } }).setNegativeButton("糟糕", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(),"天气糟糕",Toast.LENGTH_LONG).show(); } }).show(); break; case R.id.DG_Button_Id2: break; case R.id.DG_Button_Id3: break; case R.id.DG_Button_Id4: break; } } }}
运行应用程序:
点击样式一按钮:
出现一个弹窗,旁边的背景色变暗:
选择三个的选项,都会有一个Toast的弹窗:
同样也可以为这个Dialog设置一个图标:
现在再次运行程序,就可以看到这个图标了:
单选样式的AlertDialog:
运行应用程序:
选择样式二:
弹出一个Dialog:
选择之后会有一个Toast的弹窗:
可以看到上面的单选按钮还是比较简单的,RadioButton,还有显示按钮的状态呢?这个AlertDialog同样也可以做到
注意:checkedItem表示默认选中的选项,0,表示默认选中第一个,也就是男
运行应用程序:
这样就像ReadioButton一样的样式了。
现在发现我们选择之后,这个AlertDialog仍然是存在的,除非点击旁边暗灰色部分和Back按钮时,这个对话框才会消失。
如果我们想让点击想之后就让对话框就消失怎么做呢?
运行应用程序:
选中男或者女之后,弹窗,这个对话框消失:
AlertDialog多选样式:
运行应用程序:
点击样式四:
默认选中一个唱歌选项:
选择选项也会出现弹窗:
总体代码:
package com.example.yuan.e06_gridview.Alertdialog;import android.annotation.SuppressLint;import android.content.DialogInterface;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.Toast;import com.example.yuan.e05_listview.R;import com.example.yuan.e06_gridview.util.ToastUtil;public class DiaglogActivity extends AppCompatActivity { //声明引用 private Button mDialogButton1,mDialogButton2,mDialogButton3,mDialogButton4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_diaglog); //获取控件对象 mDialogButton1 = (Button)findViewById(R.id.DG_Button_Id1); mDialogButton2 = (Button) findViewById(R.id.DG_Button_Id2); mDialogButton3 = (Button) findViewById(R.id.DG_Button_Id3); mDialogButton4 = (Button) findViewById(R.id.DG_Button_Id4); //生成监听器对象,绑定监听器 DiaglogClickListener listener = new DiaglogClickListener(); mDialogButton1.setOnClickListener(listener); mDialogButton2.setOnClickListener(listener); mDialogButton3.setOnClickListener(listener); mDialogButton4.setOnClickListener(listener); } //设置按键的监听器类 class DiaglogClickListener implements View.OnClickListener{ @Override public void onClick(View v) { switch (v.getId()){ case R.id.DG_Button_Id1: //采用AlertDialog的设计者模式 AlertDialog.Builder bulider = new AlertDialog.Builder(DiaglogActivity.this); //设置标题 bulider.setTitle("请回答问题"); //设置提示信息 bulider.setMessage("你觉得今天天气怎么样?"); //设置图标 bulider.setIcon(R.drawable.toast1); //设置属性 bulider.setPositiveButton("很好", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(),"天气很好",Toast.LENGTH_LONG).show(); } }) .setNeutralButton("一般", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(),"天气一般",Toast.LENGTH_LONG).show(); } }).setNegativeButton("糟糕", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(),"天气糟糕",Toast.LENGTH_LONG).show(); } }).show(); break; case R.id.DG_Button_Id2: final String [] array = new String[]{"男","女"}; AlertDialog.Builder bulier1 = new AlertDialog.Builder(DiaglogActivity.this); bulier1.setTitle("选择你的性别").setItems(array, new DialogInterface.OnClickListener() { @Override //witch是数组的索引,从0开始 public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(),array[which],Toast.LENGTH_LONG).show(); } }).show(); break; case R.id.DG_Button_Id3: final String [] array3 = new String[]{"男","女"}; AlertDialog.Builder bulier3 = new AlertDialog.Builder(DiaglogActivity.this); bulier3.setTitle("选择你的性别"); bulier3.setSingleChoiceItems(array3, 0, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(),array3[which],Toast.LENGTH_LONG).show(); //对话框消失 dialog.dismiss(); } }).setCancelable(false).show(); break; case R.id.DG_Button_Id4: final String [] array4 = new String[]{"唱歌","跳舞","下棋","打球"}; boolean [] isSelected = new boolean[]{true,false,false,false}; AlertDialog.Builder bulier4 = new AlertDialog.Builder(DiaglogActivity.this); bulier4.setTitle("选择你的兴趣").setMultiChoiceItems(array4, isSelected, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { ToastUtil.showMsg(DiaglogActivity.this,array4[which]+":"+isChecked); } }).setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(),"选择确定",Toast.LENGTH_LONG).show(); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(),"选择取消",Toast.LENGTH_LONG).show(); } }).show(); break; } } }}
AlertDialog自定义样式:
在activity_dialog布局文件再增加一个Button控件:
然后再对应的Activity( DialogActivity)声明空间,绑定监听器:
需要为自定义的样式提供一个子布局文件,所以新建一个布局文件,命名为:layout_dialog
根布局为线性布局
设置一个登录界面:
整体代码如下:
<?xml version="1.0" encoding="utf-8"?>
运行应用程序:
按键自定义样式:
弹出一个对话框,可以在输入账号和密码之后,在登陆按钮的点击事件去账号密码:
自定义Dialog:
新建一个包,命名为:widgeDialog
在包中新建一个类CustomDialog继承自Dialog:
编写CustomDialog的内容:
新建一个布局文件为,为Dialog提供子布局:
命名为:layout_custom_dialog
在布局文件话一个UI界面如下图所示:
整体代码:
<?xml version="1.0" encoding="utf-8"?>
- 我们可以为这个Dialog设置一个自定圆角的形状:
首先新建Drawable resoure file,根布局是shape:
命名为:layout_custom_dialog
- 也可以设置一个按压的效果:
首先新建Drawable resoure file,根布局是selector,命名为:button_select
设置按压效果:
然后在layout_custom_dialog的布局文件设置确定和取消文本的背景色为这个drawable。
回到CustomDialog.java中:
希望可以通过外部的函数去改变这个自定义Dialog的显示内容,怎么做?
使用快捷功能来写他们的Set方法:
自动为我们创建了这些方法:
定义连个接口,用于确定和取消按钮的监听器事件外部的回调函数:
声明这两个接口:
因为设置确定取消按钮的时候,还需要设置他的点击事件,在下面两个函数增加一个入口函数:
既然我们要实现点击事件我们可以直接让CustomDialog去实现OnClickListener,然后复写里面的onClick方法:
既继承Dialog,又实现OnClickListener:
复写onClick方法:
为确定按钮和取消按钮设置监听器:
为了学习前面一样,采用Bulider模式,调用函数,我们改变一下setTitle()setMessage()方法的返回值,模仿Builder的模式:
如下:
整体代码:
package com.example.yuan.e06_gridview.widgeDialog;import android.app.Dialog;import android.content.Context;import android.content.DialogInterface;import android.os.Bundle;import android.support.annotation.NonNull;import android.text.TextUtils;import android.view.View;import android.widget.TextView;import com.example.yuan.e05_listview.R;public class CustomDialog extends Dialog implements View.OnClickListener{ //声明应用 private TextView mTextViewTitle,mTextViewMsg,mTextViewCancle,mTextViewConfirm; private String title,message,confirm, cancel; //声明接口 private IOnConfirmListener confirmListener; private IOnCancelListener cancelListener; public CustomDialog(@NonNull Context context) { super(context); } public CustomDialog(@NonNull Context context,int themeId) { super(context); } public CustomDialog setTitle(String title) { this.title = title; return this; } public CustomDialog setMessage(String message) { this.message = message; return this; } public CustomDialog setConfirm(String confirm,IOnConfirmListener listener) { this.confirm = confirm; this.confirmListener = listener; return this; } public CustomDialog setCancel(String cancel,IOnCancelListener listener) { this.cancel = cancel; this.cancelListener = listener; return this; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置Dialog的布局 setContentView(R.layout.layout_custom_dialog); //获取控件实体 mTextViewTitle=(TextView) findViewById(R.id.TextView_titleId); mTextViewMsg=(TextView) findViewById(R.id.TextView_MessageId); mTextViewConfirm=(TextView) findViewById(R.id.TextView_ComfirmId); mTextViewCancle=(TextView) findViewById(R.id.TextView_CancleId); //判断文本框是否为空 if(!TextUtils.isEmpty(title)){ mTextViewTitle.setText(title); } if(!TextUtils.isEmpty(message)){ mTextViewMsg.setText(message); } if(!TextUtils.isEmpty(cancel)){ mTextViewCancle.setText(cancel); } if(!TextUtils.isEmpty(confirm)){ mTextViewConfirm.setText(confirm); } //设置监听器,传进去一个参数是当前的Dialog mTextViewConfirm.setOnClickListener(this); mTextViewCancle.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.TextView_ComfirmId: if (confirmListener != null){ confirmListener.onConfirm(this); } break; case R.id.TextView_CancleId: if (cancelListener != null){ cancelListener.onCancel(this); } break; } } //定义点击事件的外部回调函数 //确定按钮的回调函数 public interface IOnConfirmListener{ void onConfirm(CustomDialog dialog); } //取消按钮的监听器回调函数 public interface IOnCancelListener{ void onCancel(CustomDialog dialog); }}
在activity_dialog这个布局文件增加按钮控件,用于跳转到自定义的Activity:
修改DialogActivity,获取按钮实例,然后绑定监听器:
代码:
case R.id.DG_Button_Id6: //实例化一个CustomDialog CustomDialog customDialog = new CustomDialog(DiaglogActivity.this); customDialog.setTitle("温馨提示").setMessage("是否删除数据") .setCancel("取消", new CustomDialog.IOnCancelListener() { @Override public void onCancel(CustomDialog dialog) { ToastUtil.showMsg(getApplicationContext(),"取消"); } }).setConfirm("确定", new CustomDialog.IOnConfirmListener() { @Override public void onConfirm(CustomDialog dialog) { ToastUtil.showMsg(getApplicationContext(),"确认"); } }).show(); break;
现在算是已经完成了自定义的Dialog样式,如我们画的布局所示,但是发现比较尴尬的一点事尺寸不对,像是被压缩了一样, 有点难看,这是我们就需要再设置一下Dialog的宽度了,回到DialogActivity.java这个类中,在setContentView(R.layout.layout_custom_dialog);后面增加宽度的设置:
代码:
//设置Dialog的宽度 WindowManager m = getWindow().getWindowManager(); Display d = m.getDefaultDisplay(); WindowManager.LayoutParams p = getWindow().getAttributes(); Point size = new Point(); d.getSize(size); p.width = (int) (size.x * 0.8); //设置Dialog的宽度为当前手机屏幕的宽度的80% getWindow().setAttributes(p);
.运行应用程序:
点击自定义Dialog按钮,填出一个Dialog窗口:
但你选中一个不放时,会有按压效果:
点击确定之后,填出一个Toast显示,确定,然后Dialog消失:
更多相关文章
- Android中两种设置全屏或者无标题的方法
- Android沉浸式状态栏小结
- 使用android传感器自己编写温度计,湿度计 支持android5.0
- ListView的item高度调整
- Android(安卓)Toolbar控件
- 获取andrid apn信息
- 20172313 2017-2018-2 《程序设计与数据结构》第十一周学习总结
- Android中GUI系统的Event路由机制
- Android中TabLayout使用详解