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"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp">
    <Button
        android:id="@+id/DG_Button_Id1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="样式一"
        />
    <Button
        android:id="@+id/DG_Button_Id2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="样式二"
        />
    <Button
        android:id="@+id/DG_Button_Id3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="样式三"
        />
    <Button
        android:id="@+id/DG_Button_Id4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="样式四"
        />
</LinearLayout>

在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"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="20dp">
    <EditText
        android:id="@+id/usernameId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="username"
        android:maxLines="1"/>
    <EditText
        android:id="@+id/passwardId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="passward"
        android:maxLines="1"/>
    <Button
        android:id="@+id/Button_LoginId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登陆"
        android:layout_marginTop="10dp"/>

</LinearLayout>

运行应用程序:

按键自定义样式:

弹出一个对话框,可以在输入账号和密码之后,在登陆按钮的点击事件去账号密码:


自定义Dialog:

新建一个包,命名为:widgeDialog

在包中新建一个类CustomDialog继承自Dialog:

编写CustomDialog的内容:


新建一个布局文件为,为Dialog提供子布局:

命名为:layout_custom_dialog

在布局文件话一个UI界面如下图所示:

整体代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal">
    <TextView
        android:id="@+id/TextView_titleId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:textColor="@color/colorRed"
        android:text="温馨提示"
        android:layout_marginTop="10dp"/>
    <TextView
        android:id="@+id/TextView_MessageId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:text="删除内容?"
        android:textColor="#000000"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="20dp"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#AAAAAA"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/TextView_CancleId"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="取消"
            android:textSize="20dp"
            android:textColor="#5BDAFA"
            android:gravity="center"/>
        <View
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:background="#AAAAAA"/>
        <TextView
            android:id="@+id/TextView_ComfirmId"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="确定"
            android:textSize="20dp"
            android:textColor="#5BDAFA"
            android:gravity="center"/>


    </LinearLayout>

</LinearLayout>

  • 我们可以为这个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消失:


猜你喜欢

转载自blog.csdn.net/qq_36243942/article/details/82661840
今日推荐