目录
AlertDialog默认样式
单选样式的AlertDialog:
AlertDialog多选样式:
AlertDialog自定义样式:
自定义Dialog:
Demo地址:https://github.com/zGuangYuan/Androidstudio_example
Alertlog简介:Alertlog可以在当前的界面弹出一个对话框,而且这个对话框是至于所有颜色之上,能够屏蔽其他的控件的显示,Alertlog一般用于提示一些重要的内容或者信息。
例子:
新建一个包,名为: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的样式:
整体代码:
在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设置一个图标:
现在再次运行程序,就可以看到这个图标了:
运行应用程序:
选择样式二:
弹出一个Dialog:
选择之后会有一个Toast的弹窗:
可以看到上面的单选按钮还是比较简单的,RadioButton,还有显示按钮的状态呢?这个AlertDialog同样也可以做到
注意:checkedItem表示默认选中的选项,0,表示默认选中第一个,也就是男
运行应用程序:
这样就像ReadioButton一样的样式了。
现在发现我们选择之后,这个AlertDialog仍然是存在的,除非点击旁边暗灰色部分和Back按钮时,这个对话框才会消失。
如果我们想让点击想之后就让对话框就消失怎么做呢?
运行应用程序:
选中男或者女之后,弹窗,这个对话框消失:
运行应用程序:
点击样式四:
默认选中一个唱歌选项:
选择选项也会出现弹窗:
总体代码:
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;
}
}
}
}
在activity_dialog布局文件再增加一个Button控件:
然后再对应的Activity( DialogActivity)声明空间,绑定监听器:
需要为自定义的样式提供一个子布局文件,所以新建一个布局文件,命名为:layout_dialog
根布局为线性布局
设置一个登录界面:
整体代码如下:
运行应用程序:
按键自定义样式:
弹出一个对话框,可以在输入账号和密码之后,在登陆按钮的点击事件去账号密码:
新建一个包,命名为:widgeDialog
在包中新建一个类CustomDialog继承自Dialog:
编写CustomDialog的内容:
新建一个布局文件为,为Dialog提供子布局:
命名为:layout_custom_dialog
在布局文件话一个UI界面如下图所示:
整体代码:
首先新建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消失: