2021-10-15 Dialog使用 以及封装Dialog

Dialog使用

dialog就是显示在界面之上的类似于弹窗的友好提示,同时屏蔽掉其他控件的交互能力,

因为任何一个界面都可能使用dialog,所以是提取到公共模块中。

简单使用

原来是在哪里使用就直接在哪里进行创建,AlertDialog并不需要在布局文件中创建,在使用时直接在代码中通过构造器来构造标题、图标和按钮等内容,也就是说在哪里使用,就直接重新创建一个构造器对象然后通过以下的方法会进行设置title等属性,然后显示

1.创建构造器AlertDialog.Builder的对象;
2.通过构造器对象调用setTitle、setMessage、setIcon等方法构造对话框的标题、信息和图标等内容;
3.根据需要调用setPositive/Negative/NeutralButton()方法设置正面按钮、负面按钮和中立按钮;
4.调用构造器对象的create方法创建AlertDialog对象;
5.AlertDialog对象调用show方法,让对话框在界面上显示。

注:AlertDialog.Builder自己也有一个show方法,可以显示对话框,所以上面的第4、第5步可以简化为一步。

例子:

/**

 * 提示对话框
   */
   public void tipDialog() {
    
    
   AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
   builder.setTitle("提示:");
   builder.setMessage("这是一个普通对话框,");
   builder.setIcon(R.mipmap.ic_launcher);
   builder.setCancelable(true);            //点击对话框以外的区域是否让对话框消失

   //设置正面按钮
   builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
    
    
       @Override
       public void onClick(DialogInterface dialog, int which) {
    
    
           Toast.makeText(MainActivity.this, "你点击了确定", Toast.LENGTH_SHORT).show();
           dialog.dismiss();
       }
   });
   //设置反面按钮
   builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
    
    
       @Override
       public void onClick(DialogInterface dialog, int which) {
    
    
           Toast.makeText(MainActivity.this, "你点击了取消", Toast.LENGTH_SHORT).show();
           dialog.dismiss();
       }
   });
   //设置中立按钮
   builder.setNeutralButton("保密", new DialogInterface.OnClickListener() {
    
    
       @Override
       public void onClick(DialogInterface dialog, int which) {
    
    
           Toast.makeText(MainActivity.this, "你选择了中立", Toast.LENGTH_SHORT).show();
           dialog.dismiss();
       }
   });


    AlertDialog dialog = builder.create();      //创建AlertDialog对象
    //对话框显示的监听事件
    dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    
    
        @Override
        public void onShow(DialogInterface dialog) {
    
    
            Log.e(TAG, "对话框显示了");
        }
    });
    //对话框消失的监听事件
    dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
    
    
        @Override
        public void onCancel(DialogInterface dialog) {
    
    
            Log.e(TAG, "对话框消失了");
        }
    });
    dialog.show();                              //显示对话框

}

具体介绍一下用到的方法吧:

  • setTitle:设置对话框的标题,比如“提示”、“警告”等;
  • setMessage:设置对话框要传达的具体信息;
  • setIcon: 设置对话框的图标;
  • setCancelable: 点击对话框以外的区域是否让对话框消失,默认为true;
  • setPositiveButton:设置正面按钮,表示“积极”、“确认”的意思,第一个参数为按钮上显示的文字,下同;
  • setNegativeButton:设置反面按钮,表示“消极”、“否认”、“取消”的意思;
  • setNeutralButton:设置中立按钮;
  • setOnShowListener:对话框显示时触发的事件;
  • setOnCancelListener:对话框消失时触发的事件。

**问题:**上面的创建和使用的过程,就是使用时在进行创建和赋值,然后在想要使用此dialog的页面,通过点击事件或者是监听 显示这个设计好的dialog, 所以问题就是这是一个定制好的dialog,如果其他地方想要使用就需要重新定义一个新的dialog,然后再使用的地方调用。 我们可以将其进行封装,设计一个接口或者是封装好的类,在使用的地方使用时直接传入想要的参数,传不同的参数就显示不同的dialog,不用每次新创建不同样式的dialog。

重新封装好一个类,使用时直接传入参数,展示不同的dialog

定义一个类ErrorDialog继承Dialog

dialog的构造器有三个构造器,

public class ErrorDialog extends Dialog{
    
    
    //使用时最常用的,在使用时通过new ErrorDialog(context)获取实例,然后通过show方法展示
    public ErrorDialog(Context context) {
    
    
        super(context);
    }
    
    //比第一个多了一个themResId,就是可以进行设置主题值,比如说R.style.xxx进行主题值的设置,这样这个dialog就显示出来设置的主题的效果。

    public ErrorDialog(Context context, int themeResId) {
    
    
        super(context, themeResId);
    }

    
    //大家都知道,对话框弹出来后,默认情况下,我们在屏幕上触摸对话框以外的屏幕的界面,对话框会默认消失。我们平时做对话框的时候一般都是让这个对话框点击外面的其他界面地方的时候不让对话框消失,我们一般在代码中会这么写:setCanceledOnTouchOutside(false);。为什么我提这个,没错,这个构造函数里面的那个boolean cancelable控制的就是这个功能,<1>当传入为true的时候,就是可以点击外面来让对话框消失,然后消失的时候会调用后面第三个参数的cancelListener这个listener里面的方法。我们可以在里面做相应的监听事件。<2>当传入false。那么点击外面区域,这个对话框也就不会消失,而且后面的那个listener也不会被调用。
    
    protected ErrorDialog(Context context, boolean cancelable
        , OnCancelListener cancelListener) {
    
    
        super(context, cancelable, cancelListener);
    }
}
自定义布局文件

根据页面的中学要使用的dialog,然后统一设置一个布局文件,这个布局文件是包含你所有想在dialog上展示的,所以就需要将使用的都声明出,有的控件不适用可以 将其可见性设置为不可见,

设置Dialog自定义的theme

因为dialog自身带有一个白色背景,白色背景是一个白色的矩形,所以需要我们将这个背景设置为透明、并去除边框等,是在style.xml中记性设置style。

扫描二维码关注公众号,回复: 13248566 查看本文章
设计一下类中应该有的属性和方法

因为在使用的时候,是根据xml文件中有什么控件,然后就通过这个封装类实例化,设置需要展示的布局控件,所以如果说如果xml中布局了title、message、icon,positivebt、negetivebn,那么在类中,就需要有对应的属性,并有对应的set方法。设置这些属性就是为了能够在使用时进行布局的展示,所以封装一个refreshView的方法,方法内是将布局中的控件赋值这里设置的属性值。比如tvTitle.text = title;以及实现各个控件的监听。

在oncreate方法中 加载布局,设置点击外部是否dialog消失
因为builder对象肯定是要创建的,所以使用伴生对象创建builder对象,同时调用其dialog对象的show方法展示dialog。
其他就是在外部进行实例化dialog,并通过set等方法降属性值设置好,

猜你喜欢

转载自blog.csdn.net/qq_45204129/article/details/120778244