dialog 订阅
DIALOG系统是目前世界上规模最大、影响最广泛的综合性商业信息检索系统,覆盖各行业的900多个数据库,其数据类型主要有4种,即文献型、数值型、名录字典型、全文型,涉及40多个语种7000多种期刊。Dialog收录的信息涉及的专业范围广泛,按涉及学科的领域被分为20类。信息总量约15TB,共有14亿条记录,文档的专业范围涉及综合性学科、自然科学、应用科学和工艺学、社会科学和人文科学、商业经济和时事报导等诸多领域。在Dialog系统资源中,各种类型的商业性数据库多达400个左右,占有举足轻重的地位。存储的文献型和非文献型记录占世界各检索系统数据库文献总量的一半以上。Dialog系统在全球六个大洲100多个国家保有两万五千位客户。 展开全文
DIALOG系统是目前世界上规模最大、影响最广泛的综合性商业信息检索系统,覆盖各行业的900多个数据库,其数据类型主要有4种,即文献型、数值型、名录字典型、全文型,涉及40多个语种7000多种期刊。Dialog收录的信息涉及的专业范围广泛,按涉及学科的领域被分为20类。信息总量约15TB,共有14亿条记录,文档的专业范围涉及综合性学科、自然科学、应用科学和工艺学、社会科学和人文科学、商业经济和时事报导等诸多领域。在Dialog系统资源中,各种类型的商业性数据库多达400个左右,占有举足轻重的地位。存储的文献型和非文献型记录占世界各检索系统数据库文献总量的一半以上。Dialog系统在全球六个大洲100多个国家保有两万五千位客户。
信息
服务项目
各种类型信息检索、定题服务、原文定购(Email、FAX或邮寄)等
类    型
文献型、数值型、名录字典型、全文型
总    部
美国加利福利亚州的帕洛阿尔托
外文名
DIALOG
定    位
商业信息检索系统
领    域
综合性学科、自然科学、应用科学和工艺学等
DIALOG系统简介
其中心设在美国加利福利亚州的帕洛阿尔托(Palo Alto)市,在27个国家有直接业务,为103个国家的用户提供服务。其提供的服务项目有:各种类型信息检索、定题服务、原文定购(Email、FAX或邮寄)等利用DIALOG系统,可进行项目查新、文献调研、课题立项、申报专利、了解市场动态和竞争对手、新产品开发、公司的背景情况、经济预测等等信息。DIALOG于1972年正式开始提供商用联机服务,是世界上最大、历史最悠久的联机检索系统,已有30多年的全球联机检索服务历史。
收起全文
精华内容
下载资源
问答
  • dialog
    千次阅读
    2022-02-14 17:35:42

    弹窗在安卓开发中是必不可缺的一部分,通知,余额不足提示,第三方SDK的跳转,一些条件筛选的弹窗等等,在Android中,最常用的一般是Dialog和PopWindow这俩个控件。

    自己平时也用得多,今天就把这个基础的东西总结下。

    其实这俩个控件有一些实现和展示上的区别,不过也可以通过代码使得展示上大差不差

    • PopupWindow为非模态,可以继续操作弹出界面之下的控件;
    • Dialog为模态,必须先取消Dialog才能操作Dialog之下的控件;
    • 两者最根本的区别在于有没有新建一个 Window,PopupWindow 没有新建,而是通过 WMS 将 View 加到 DecorView;Dialog 是新建了一个 window (PhoneWindow),相当于走了一遍 Activity 中创建 window 的流程。

    一、Dialog

    1、AlertDialog

    AlertDialog是Dialog的子类,所以它包含了Dialog类的很多属性和方法。

    他的实现非常简单:

    val dialog1: AlertDialog.Builder = AlertDialog.Builder(this);
    dialog1.setTitle("提示")
        .setMessage("你的金额不足!")
        .setNegativeButton("关闭", null)
        .create()
        .show();

    展示为:

    具体可以设置其属性的方法:

        setTitle :为对话框设置标题
        setIcon :为对话框设置图标
        setMessage:为对话框设置内容
        setView : 给对话框设置自定义样式
        setItems :设置对话框要显示的一个list,一般用于显示几个命令时
        setMultiChoiceItems :用来设置对话框显示一系列的复选框

        setPositiveButton  :给对话框添加"Yes"按钮
        setNegativeButton :对话框添加"No"按钮
        create : 创建对话框
        show :显示对话框

    2、Dialog

    直接上代码: 

    1.首先new 一个Dialog,第二个属性是为其配置一些dialog属性,例如背景,show()/dismiss()动画,是否有标题等等

    2.inflate一个布局文件,再通过  dialog.setContentView(localView) 设置其展示的自定义布局

    3.获取到dialog的window,通过window设置其布局的属性,长宽自适应,展示的位置等等

    4.为弹窗布局里的控件赋值啊,添加点击事件等等,我这儿是一个弹窗展示下载进度,进度懒得写,就为图片和按钮增加了点击事件。

    5.dialog.show()展示就完事

    val dialog = Dialog(this, R.style.jz_style_dialog_progress) //设置一些属性
                val localView = LayoutInflater.from(this).inflate(R.layout.common_global_volume_dialog, null) //设置自定义的弹窗UI
                dialog.setContentView(localView)
                val window = dialog.window
                window?.setLayout(-2, -2) //-2 其实就是WRAP_CONTENT
                val localLayoutParams = window?.attributes
                localLayoutParams?.gravity = Gravity.BOTTOM
                window?.attributes = localLayoutParams
    
                val imageV: AppCompatImageView = dialog.findViewById(R.id.volume_image_tip)
                val cancelTv = dialog.findViewById<AppCompatTextView>(R.id.volume_tv_cancel)
                val confirmTv = dialog.findViewById<AppCompatTextView>(R.id.volume_tv_confirm)
                imageV.setOnClickListener {
                    dialog.dismiss()
                }
                cancelTv.setOnClickListener {
                    Toast.makeText(it.context, "Cancel", Toast.LENGTH_SHORT).show()
                    dialog.dismiss()
                }
                confirmTv.setOnClickListener {
                    Toast.makeText(it.context, "Confirm", Toast.LENGTH_LONG).show()
                    dialog.dismiss()
                }
                dialog.show() //展示弹窗

    展示效果:

     
         1、当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略.
         2、当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略.
         3、当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略.
         4、当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略.
         5、当参数值包含Gravity.CENTER_HORIZONTAL时
         对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动.
         6、当参数值包含Gravity.CENTER_VERTICAL时
         ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动.
         7、gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL |
         Gravity.CENTER_VERTICAL.
         8、Dialogh距离边界都有一小段距离
     

    二、popWindow

    这是popwindow实例

    package com.example.lxview.base.pop
    
    import android.annotation.SuppressLint
    import android.graphics.drawable.ColorDrawable
    import android.view.*
    import android.widget.PopupWindow
    import androidx.appcompat.widget.AppCompatTextView
    import com.example.lxview.R
    
    @SuppressLint("InflateParams")
    class PickHistorySelectPop private constructor(v: View, val listener: (Int?) -> Unit?, private val focusAble: Boolean = true) {
    
        var popWindow: PopupWindow? = null
    
        companion object {
            fun show(v: View, focusAble: Boolean? = true, listener: (Int?) -> Unit?): PickHistorySelectPop {
                return PickHistorySelectPop(v, listener, focusAble ?: true)
            }
        }
    
        private lateinit var replied: AppCompatTextView
        private lateinit var reply: AppCompatTextView
        private lateinit var refused: AppCompatTextView
        private lateinit var all: AppCompatTextView
    
        init {
            show(v, listener)
        }
    
        enum class SelectType(val type: Int) {
            REPLIED(1), NO_REPLY(0), REFUSED(3), ALL(-1)
        }
    
        private fun show(v: View, onResult: (Int?) -> Unit?) {
            popWindow = PopupWindow(v.context)
            val view = View.inflate(v.context, R.layout.select_pop_content, null)
            popWindow?.contentView = view
            replied = view.findViewById(R.id.pick_history_filter_replied)
            reply = view.findViewById(R.id.pick_history_filter_no_reply)
            refused = view.findViewById(R.id.pick_history_filter_refused)
            all = view.findViewById(R.id.pick_history_filter_all)
            popWindow?.setBackgroundDrawable(ColorDrawable())
            popWindow?.isOutsideTouchable = true
            popWindow?.isTouchable = true
            popWindow?.isFocusable = true
            replied.setOnClickListener {
                onResult(SelectType.REPLIED.type)
                popWindow?.dismiss()
            }
            reply.setOnClickListener {
                onResult(SelectType.NO_REPLY.type)
                popWindow?.dismiss()
            }
            refused.setOnClickListener {
                onResult(SelectType.REFUSED.type)
                popWindow?.dismiss()
            }
            all.setOnClickListener {
                onResult(SelectType.ALL.type)
                popWindow?.dismiss()
            }
            popWindow?.showAtLocation(v, Gravity.END or Gravity.TOP, 50, 200)
        }
    
    }

    调用的地方:

     easyPopTv?.setOnClickListener {
                PickHistorySelectPop.show(it, true) { type ->
                    when (type) {
                        0 -> {
                            Toast.makeText(it.context, "只展示未回复的", Toast.LENGTH_LONG).show()
                        }
                        1 -> {
                            Toast.makeText(it.context, "只展示已回复的", Toast.LENGTH_LONG).show()
                        }
                        3 -> {
                            Toast.makeText(it.context, "只展示拒绝的", Toast.LENGTH_LONG).show()
                        }
                        else -> {
                            Toast.makeText(it.context, "展示所有问答", Toast.LENGTH_LONG).show()
                        }
                    }
                }
            }

    展示效果:

     

     这个弹窗,因为要实现多语言,所以宽度不定,我用的是ninePatch来实现的宽度拉伸,这个用于项目里右上角点击图标对展示内容进行筛选。

    • showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移。
    • showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移。
    • showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移。

    三、细节上的区别

    (1)Popupwindow在显示之前一定要设置宽高,Dialog无此限制。

    (2)Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);而在点击back的时候,Dialog会消失。

    (3)Popupwindow不会给页面其他的部分添加蒙层,而Dialog会。

    (4)Popupwindow没有标题,Dialog默认有标题,可以通过dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消标题,第二个dialog实例我就是通过在style里面设置其没得标题。

    (5)二者显示的时候都要设置Gravity。如果不设置,Dialog默认是Gravity.CENTER。

    (6)二者都有默认的背景,都可以通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。

    通过Dialog和popWindow,可以实现各种各样的效果,什么全局加载loading,五花八门的分享弹窗等等,具体选择实现可以根据需求而定。如果用的地方比较多,可以进行简单的封装,只需要简单的传入布局文件,点击事件,内容,通过几行代码便可以实现好看的弹窗功能。

    当然,更简单且不需要交互的提示只需要用Toast就可以展示了。

    因为想着简单明了的说明dialog和popwindow,所以几个样例都是很简单的实现。还有些自定义的弹窗在下面的Demo里

    关于这部分的源码:https://github.com/LiXiang1996/LxViewhttps://github.com/LiXiang1996/LxView

    慢慢补充吧,准备这个项目里把一些基础功能的实现全部弄一下,目前还很丑,慢慢优化吧~

    更多相关内容
  • 各种android弹出dialog效果以及各种dialog样式各种android弹出dialog效果以及各种dialog样式各种android弹出dialog效果以及各种dialog样式各种android弹出dialog效果以及各种dialog样式各种android弹出dialog效果...
  • bootstrap的dialog.js

    2018-08-08 16:44:14
    bootstrap的dialog.js、bootstrap的dialog.js、bootstrap的dialog.js
  • Dialog.rar

    2019-09-21 18:38:03
    Dialog 创建一个对话框,Windows基本控件,VS2015编译测试通过
  • 安卓dialog的使用+如何自定义dialog

    千次阅读 2021-05-26 11:26:33
    什么叫dialog简单来说就是一句话:弹出一个窗口,提示用户自己去选择,去提示,去分类的一些内容。安卓自带的dialog有三种: - AlertDialog—-普通的提示对话框- ProgressDialog–进度条对话- DatePickerDialog/...

    什么叫dialog

    简单来说就是一句话:

    弹出一个窗口,提示用户自己去选择,去提示,去分类的一些内容。

    安卓自带的dialog有三种:

    ec0c2d7ab0ee8b6a34ea3ce8cad00057.gif

    - AlertDialog—-普通的提示对话框

    - ProgressDialog–进度条对话

    - DatePickerDialog/TimePickerDialog–日期对话框/时间对话框

    所有的对话框,都是直接或间接继承自Dialog类,而AlterDialog直接继承自Dialog,其他的几个类均继承自AlterDialog。

    系统自带的dialog基本上用AlertDialog类

    AlertDialog继承自Dialog类,对于Android内置的AlterDialog,它可以包含一个标题、一个内容消息或者一个选择列表、最多三个按钮。而创建AlterDialog推荐使用它的一个内部类AlterDialog.Builder创 建。使用Builder对象,可以设置AlterDialog的各种属性,最后通过Builder.create()就可以得到AlterDialog对 象,如果只是还需要显示这个AlterDialog,一般可以直接使用Builder.show()方法,它会返回一个AlterDialog对象,并且 显示它。

    //说这么多,还不如直接看下如何用

    下面我会讲三个层次的dialog的使用:

    简单的系统dialog调用//就是简单的系统dialog的调用

    半自定义的dialog//就是改变一些基础属性

    完全自定义dialog//自定义dialog类,自己写界面,点击事件

    ##简单的系统dialog

    简单的dialog也分好多种,但是我只说AlertDialog类的

    ###普通对话框

    这个就是最普通的那种,让你选择正确或者错误,也可以选择中立,这个是最常见的那种

    0dc34e42aa56e6980ec1389cc759d2ad.png

    用法很简单

    第一步:new个AlertDialog.Builder

    第二步:设置dialog的图标,文字,提示信息

    第三步:设置不同选择的点击事件

    第四步:显示dialog

    /**

    * 普通dialog

    */

    private void showAlterDialog(){

    final AlertDialog.Builder alterDiaglog = new AlertDialog.Builder(MainActivity.this);

    alterDiaglog.setIcon(R.drawable.icon);//图标

    alterDiaglog.setTitle("简单的dialog");//文字

    alterDiaglog.setMessage("生存还是死亡");//提示消息

    //积极的选择

    alterDiaglog.setPositiveButton("生存", new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    Toast.makeText(MainActivity.this,"点击了生存",Toast.LENGTH_SHORT).show();

    }

    });

    //消极的选择

    alterDiaglog.setNegativeButton("死亡", new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    Toast.makeText(MainActivity.this,"点击了死亡",Toast.LENGTH_SHORT).show();

    }

    });

    //中立的选择

    alterDiaglog.setNeutralButton("不生不死", new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    Toast.makeText(MainActivity.this,"点击了不生不死",Toast.LENGTH_SHORT).show();

    }

    });

    //显示

    alterDiaglog.show();

    }

    列表对话框

    直接看图吧

    5f4e3ba46ce5ad924a58d39cb29f9441.png

    这个和普通的dialog差不多,只不过是从中数组选择一个确定点击事件

    /**

    * 列表Dialog

    */

    private void showListDialog(){

    final String[] items = {"我是1","我是2","我是3"};

    AlertDialog.Builder listDialog = new AlertDialog.Builder(MainActivity.this);

    listDialog.setIcon(R.drawable.icon);//图标

    listDialog.setTitle("我就是个列表Dialog");

    listDialog.setItems(items, new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    Toast.makeText(MainActivity.this,"点击了"+items[which],Toast.LENGTH_SHORT).show();

    }

    });

    listDialog.show();

    }

    单选对话框

    它和列表对话框区别是前面有选择的圆点

    也是一样的

    bb0e42bd84a28bd513744d8bd5b85d96.png

    /**

    * 单选Dialog

    */

    int choice;

    private void showSingDialog(){

    final String[] items = {"我是1","我是2","我是3"};

    AlertDialog.Builder singleChoiceDialog = new AlertDialog.Builder(MainActivity.this);

    singleChoiceDialog.setIcon(R.drawable.icon);

    singleChoiceDialog.setTitle("我是单选Dialo");

    //第二个参数是默认的选项

    singleChoiceDialog.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    choice= which;

    }

    });

    singleChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    if (choice!=-1){

    Toast.makeText(MainActivity.this,

    "你选择了" + items[choice],

    Toast.LENGTH_SHORT).show();

    }

    }

    });

    singleChoiceDialog.show();

    }

    多选对话框

    在单选的基础上加了多选这个,就是选择的函数不一样

    8f7b21550f165a96efbd291be5a9a520.png

    /**

    * 多选对话框

    */

    ArrayList choices= new ArrayList<>();

    private void showMultiChoiceDialog(){

    final String[] items = {"我是1","我是2","我是3"};

    //设置默认选择都是false

    final boolean initchoices[] = {false,false,false};

    choices.clear();

    AlertDialog.Builder multChoiceDialog = new AlertDialog.Builder(MainActivity.this);

    multChoiceDialog.setIcon(R.drawable.icon);

    multChoiceDialog.setTitle("我是个多选Dialog");

    multChoiceDialog.setMultiChoiceItems(items, initchoices, new DialogInterface.OnMultiChoiceClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which, boolean isChecked) {

    if (isChecked){

    choices.add(which);

    }else {

    choices.remove(which);

    }

    }

    });

    multChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    int size = choices.size();

    String str = "";

    for(int i = 0;i

    str+=items[choices.get(i)]+"";

    }

    Toast.makeText(MainActivity.this,

    "你选中了" + str,

    Toast.LENGTH_SHORT).show();

    }

    });

    multChoiceDialog.show();

    }

    等待对话框

    等待Dialog具有屏蔽其他控件的交互能力

    @setCancelable 为使屏幕不可点击,设置为不可取消(false)

    下载等事件完成后,主动调用函数关闭该Dialog

    879f64c232682d6d745eba0f7faf4bbc.png

    private void showProgressDialog(){

    final int MAX = 100;

    final ProgressDialog progressDialog = new ProgressDialog(this);

    progressDialog.setTitle("我是个等待的Dialog");

    progressDialog.setMessage("等待中");

    progressDialog.setIndeterminate(true);

    progressDialog.setCancelable(false);

    progressDialog.show();

    }

    进度条对话框

    就是和那些app上一样,简单的一个等待的框

    ebd7ded11e6966a67740ba86467f56f5.png

    /**

    * 进度条Dialog

    */

    private void showWhiteDialog(){

    /* @setProgress 设置初始进度

    * @setProgressStyle 设置样式(水平进度条)

    * @setMax 设置进度最大值

    */

    final int Max = 100;

    final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);

    progressDialog.setProgress(0);

    progressDialog.setIcon(R.drawable.icon);

    progressDialog.setTitle("我是一个进度条Dialog");

    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

    progressDialog.setMax(Max);

    progressDialog.show();

    /**

    * 开个线程

    */

    new Thread(new Runnable() {

    @Override

    public void run() {

    int p = 0;

    while (p

    try {

    Thread.sleep(100);

    p++;

    progressDialog.setProgress(p);

    }catch (InterruptedException e){

    e.printStackTrace();

    }

    }

    progressDialog.cancel();//达到最大就消失

    }

    }).start();

    }

    半自定义对话框

    就是根据一些属性来自定义dialog,也可以添加自己的布局

    1控制不同普通的dialog的位置,大小,透明度

    b4b5e7b1a687efd2526b3f881e5471a7.png

    在不同的dialog的下面添加设置

    //自定义的东西

    //放在show()之后,不然有些属性是没有效果的,比如height和width

    Window dialogWindow = dialog.getWindow();

    WindowManager m = getWindowManager();

    Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用

    WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值

    // 设置高度和宽度

    p.height = (int) (d.getHeight() * 0.4); // 高度设置为屏幕的0.6

    p.width = (int) (d.getWidth() * 0.6); // 宽度设置为屏幕的0.65

    p.gravity = Gravity.TOP;//设置位置

    p.alpha = 0.8f;//设置透明度

    dialogWindow.setAttributes(p);

    整体的代码:

    /**

    * 自定义1 控制普通的dialog的位置,大小,透明度

    * 在普通的dialog.show下面添加东西

    */

    private void DiyDialog1(){

    AlertDialog.Builder alterDiaglog = new AlertDialog.Builder(MainActivity.this);

    alterDiaglog.setIcon(R.drawable.icon);//图标

    alterDiaglog.setTitle("简单的dialog");//文字

    alterDiaglog.setMessage("生存还是死亡");//提示消息

    //积极的选择

    alterDiaglog.setPositiveButton("生存", new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    Toast.makeText(MainActivity.this,"点击了生存",Toast.LENGTH_SHORT).show();

    }

    });

    //消极的选择

    alterDiaglog.setNegativeButton("死亡", new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    Toast.makeText(MainActivity.this,"点击了死亡",Toast.LENGTH_SHORT).show();

    }

    });

    alterDiaglog.setNeutralButton("不生不死", new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    Toast.makeText(MainActivity.this,"点击了不生不死",Toast.LENGTH_SHORT).show();

    }

    });

    AlertDialog dialog = alterDiaglog.create();

    //显示

    dialog.show();

    //自定义的东西

    //放在show()之后,不然有些属性是没有效果的,比如height和width

    Window dialogWindow = dialog.getWindow();

    WindowManager m = getWindowManager();

    Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用

    WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值

    // 设置高度和宽度

    p.height = (int) (d.getHeight() * 0.4); // 高度设置为屏幕的0.6

    p.width = (int) (d.getWidth() * 0.6); // 宽度设置为屏幕的0.65

    p.gravity = Gravity.TOP;//设置位置

    p.alpha = 0.8f;//设置透明度

    dialogWindow.setAttributes(p);

    }

    自定义简单dialog的布局

    把自己写的xml加载进去

    2d5c26c8423cd929c721173accdc2cb6.png

    第一步:自定义布局

    自己定义dialog_1.xml

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    android:layout_width="100dp"

    android:layout_height="100dp"

    android:layout_centerInParent="true"

    android:background="#ed093a">

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:gravity="center"

    android:text="自定义加强版的dialog"

    android:textColor="#fff"/>

    第二步:在主活动里面设置dialog

    然后把这个布局扔进去

    /**

    * 自定义dialog2 简单自定义布局

    */

    private void DiyDialog2() {

    AlertDialog.Builder alterDiaglog = new AlertDialog.Builder(MainActivity.this,R.style.MyDialog);

    alterDiaglog.setView(R.layout.dialog_1);//加载进去

    AlertDialog dialog = alterDiaglog.create();

    //显示

    dialog.show();

    //自定义的东西

    }

    完全自定义dialog

    重要来到了最重头戏了,然后自定义dialog然后满足产品的需求,你只需要按照如下步骤来:

    7a6a872ca23c1f05133809bd2a992130.png

    1.在values/styles.xml新建一个样式MyDialog

    @android:color/transparent

    false

    true

    true

    false

    0.5

    2.新建一个MyDialog继承Dialog类

    public class MyDialog1 extends Dialog implements View.OnClickListener{

    //在构造方法里提前加载了样式

    private Context context;//上下文

    private int layoutResID;//布局文件id

    private int[] listenedItem;//监听的控件id

    public MyDialog1(Context context,int layoutResID,int[] listenedItem){

    super(context,R.style.MyDialog);//加载dialog的样式

    this.context = context;

    this.layoutResID = layoutResID;

    this.listenedItem = listenedItem;

    }

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    //提前设置Dialog的一些样式

    Window dialogWindow = getWindow();

    dialogWindow.setGravity(Gravity.CENTER);//设置dialog显示居中

    //dialogWindow.setWindowAnimations();设置动画效果

    setContentView(layoutResID);

    WindowManager windowManager = ((Activity)context).getWindowManager();

    Display display = windowManager.getDefaultDisplay();

    WindowManager.LayoutParams lp = getWindow().getAttributes();

    lp.width = display.getWidth()*4/5;// 设置dialog宽度为屏幕的4/5

    getWindow().setAttributes(lp);

    setCanceledOnTouchOutside(true);//点击外部Dialog消失

    //遍历控件id添加点击注册

    for(int id:listenedItem){

    findViewById(id).setOnClickListener(this);

    }

    }

    private OnCenterItemClickListener listener;

    public interface OnCenterItemClickListener {

    void OnCenterItemClick(MyDialog1 dialog, View view);

    }

    //很明显我们要在这里面写个接口,然后添加一个方法

    public void setOnCenterItemClickListener(OnCenterItemClickListener listener) {

    this.listener = listener;

    }

    @Override

    public void onClick(View v) {

    dismiss();//注意:我在这里加了这句话,表示只要按任何一个控件的id,弹窗都会消失,不管是确定还是取消。

    listener.OnCenterItemClick(this,v);

    }

    }

    3.主活动继承自己写的dialog的接口,实现点击方法

    //定义一个自己的dialog

    private MyDialog1 myDialog1;

    //实例化自定义的dialog

    myDialog1 = new MyDialog1(this,R.layout.dialog_2,new int[]{R.id.dialog_btn});

    //绑定点击事件

    myDialog1.setOnCenterItemClickListener((MyDialog1.OnCenterItemClickListener) this);

    //显示

    myDialog1.show();

    //调用点击函数

    @Override

    public void OnCenterItemClick(MyDialog1 dialog, View view) {

    switch (view.getId()){

    case R.id.dialog_btn:

    Toast.makeText(getApplicationContext(),"点击了",Toast.LENGTH_SHORT).show();

    break;

    default:

    break;

    }

    }

    总结

    展开全文
  • Android自定义显示内容的Dialog,有两种实现方式,一个继承Dialog,一个继承PopupWindow。
  • 在Android开发中 我们经常会需要在Android界面上弹出一些对话框 比如询问用户或者让用户选择 关于Android Dialog的使用方法 已经有很多blog做出了详细的介绍(比如博客:7种形式的Android Dialog使用举例) 但是只是...
  • Dialog 对话框

    千次阅读 2020-08-05 16:01:43
    Dialog 常用方法:(格式:dialog.以下方法) setProgressStyle:设置进度条风格,风格为圆形,旋转的。 setTitlt:设置标题 setMessage:设置提示信息; setIcon:设置标题图标; setIndeterminate:设置Dialog 的...

    ps:默认alertdialog的宽为屏幕的8/9, 高为屏幕的1/7!!

    Dialog 常用方法:(格式:dialog.以下方法)

    setProgressStyle:设置进度条风格,风格为圆形,旋转的。
    setTitlt:设置标题
    setMessage:设置提示信息;
    setIcon:设置标题图标;
    setIndeterminate:设置Dialog 的进度条是否不明确;这个属性对于ProgressDailog默认的转轮模式没有实际意义,默认下设置为true,它仅仅对带有ProgressBar的Dialog有作用。修改这个属性为false后可以实时更新进度条的进度。
    setCancelable:设置Dialog 是否可以按返回键取消,屏蔽其它控件交互能力,除dialog以外的屏幕都不可点击;
    cancelListner:当前Dialog强制取消之后将会被执行,通常用来清理未完成的任务。
    setButton:设置ProgressDialog 的一个Button(需要监听Button事件);
    show:显示Dialog。
    cancel:删dialog
    .setOnCancelListener(new Dial...):当删除dialog后执行该方法
    dismiss: 删除progressdialog 作用和cancel相同
    setOnDismissListener(new Dialo....):当删除dialog后执行该方法
    setMax(int)、getMax:设置最大进度条的值
    setProgress(int)、getProgress:更新进度条,当然一般都需要Handler的结合来更新进度条
    incrementProgressBy(int)增加进度条
    setProgressDrawable:设置progress发生变化时的进度指示条的背景图
    
    ps:AlertDialog.Builder没有setOnShowListener方法(对象名称为aertDialog),但想要该方法时,可以这样,
    再创建dialog把alertDialog赋值给dialog:
    Dialog dialog=aertDialog.create();
    dialog.setOnShowListener(new DialogInterface.OnShowListener() {.....
    然后在弹出dialog.show();即可。
    

    几种类型的dialog的使用:

    第一种:普通三个选项的dialog(最多可写三个按钮,也可写一个)
    先上图
    在这里插入图片描述

    代码如下:

        //====弹窗
        //1.创建对象
        AlertDialog.Builder alertDialog=new AlertDialog.Builder(SafetyActivity.this);
    
        //2.设置窗体样式
        alertDialog.setIcon(R.drawable.ic_rb_user_red);//标题图标
        alertDialog.setTitle("三个选项的dialog");//标题文字
        alertDialog.setMessage("提示:爱或恨");//提示信息
    
        //alertDialog.setCancelable(false);//屏蔽其它控件交互能力,除dialog以外的屏幕都不可点击
    
        //3.设置三个按钮的事件
        //积极选择
        alertDialog.setPositiveButton("爱", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(SafetyActivity.this,"点击了爱",Toast.LENGTH_LONG).show();
            }
        });
        //消极选择
        alertDialog.setNegativeButton("恨", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(SafetyActivity.this,"点击了恨",Toast.LENGTH_LONG).show();
            }
        });
        //中立选择
        alertDialog.setNeutralButton("没感觉", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(SafetyActivity.this,"点击了没感觉",Toast.LENGTH_LONG).show();
            }
        });
    
        //4.显示dialog
        alertDialog.show();
    

    第二种:列表dialog
    在这里插入图片描述
    .

        final String[] items={"我是1","我是2","我是3"};
    
        AlertDialog.Builder listDialog=new AlertDialog.Builder(SafetyActivity.this);
    
        listDialog.setIcon(R.drawable.ic_rb_user_red);
        listDialog.setTitle("列表dialog");
    
        listDialog.setItems(items, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {//点击某一列的事件
                Toast.makeText(SafetyActivity.this,"点击了"+items[which],Toast.LENGTH_LONG).show();;
            }
        });
    
        listDialog.show();
    

    第三种:单选dialog(和列表dialog差不多,只是在列表前面多了一个选择的图标)
    在这里插入图片描述

        int choice=0;
        private void setViewEvenListener() {
            tvTest.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    final String[] items={"我是1","我是2","我是3"};
    
                    AlertDialog.Builder singleChoiceDialog=new AlertDialog.Builder(SafetyActivity.this);
    
                    singleChoiceDialog.setIcon(R.drawable.ic_rb_user_red);
                    singleChoiceDialog.setTitle("单选dialog");
    
                    //生成单选选项,并监听选项事件;ps:第二个参数为默认选中哪个列表(索引)
                    singleChoiceDialog.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //Toast.makeText(SafetyActivity.this,"点击了"+items[which],Toast.LENGTH_LONG).show();
                            choice=which;
                        }
                    });
    
                    //设置确定按钮
                    singleChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {//这里的which没意义,值为-1
                            Toast.makeText(SafetyActivity.this,"点击了"+items[choice],Toast.LENGTH_LONG).show();
                        }
                    });
    
                    singleChoiceDialog.show();
                }
    
            });
        }
    

    第四种:多选dialog
    在这里插入图片描述

        ArrayList<Integer> choice=new ArrayList<>();
        private void setViewEvenListener() {
            tvTest.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    final String[] items={"我是1","我是2","我是3"};
                    boolean initChoices[]={false,false,false};//设置全部选择为false
                    choice.clear();
    
                    AlertDialog.Builder multiChoiceDialog=new AlertDialog.Builder(SafetyActivity.this);
    
                    multiChoiceDialog .setIcon(R.drawable.ic_rb_user_red);
                    multiChoiceDialog .setTitle("多选dialog");
    
                    multiChoiceDialog.setMultiChoiceItems(items, initChoices, new DialogInterface.OnMultiChoiceClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                            if(isChecked){
                                choice.add(which);
                            }else{
                                choice.remove(which);
                            }
                        }
                    });
    
                    multiChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            int size = choice.size();
                            String str="";
                            for (int i=0;i<size;i++){
                                str+=items[choice.get(i)]+"、";
                            }
                            Toast.makeText(SafetyActivity.this,"选中了"+str,Toast.LENGTH_LONG).show();
                        }
                    });
    
                    multiChoiceDialog.show();
                }
            });
        }
    

    第五种:等待dialog
    在这里插入图片描述

        final int max = 3;
        final ProgressDialog progressDialog = new ProgressDialog(SafetyActivity.this);
        progressDialog.setTitle("我是个等待的Dialog");
        progressDialog.setMessage("等待中");
        progressDialog.setCancelable(false);
        progressDialog.show();
    
        //新建线程执行关闭dialog
        new Thread(new Runnable() {
            @Override
            public void run() {
                int p=0;
                while (p<max){
                    try {
                        Thread.sleep(1000);
                        p++;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                progressDialog.cancel();
            }
        }).start();
    

    第六种:有进度条的dialog
    在这里插入图片描述

        final int max = 30;
        final ProgressDialog progressDialog = new ProgressDialog(SafetyActivity.this);
        progressDialog.setTitle("我是个有进度条的Dialog");
        progressDialog.setMessage("等待中");
        progressDialog.setIndeterminate(false);
        progressDialog.setCancelable(false);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//进度条样式,参数写2效果相同
        progressDialog.setMax(max);//设置最大的进度条
        progressDialog.show();
    
        //新建线程执行关闭dialog
        new Thread(new Runnable() {
            @Override
            public void run() {
                int p=0;
                while (p<max){
                    try {
                        Thread.sleep(100);
                        p++;
                        //更新进度条样式
                        progressDialog.setProgress(p);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                progressDialog.cancel();
    
            }
        }).start();
    

    第七种:半自定义dialog
    在这里插入图片描述

        AlertDialog.Builder alertDialog=new AlertDialog.Builder(SafetyActivity.this);
    
        alertDialog.setTitle("半自定义的dialog");
    
        alertDialog.setPositiveButton("哈哈哈", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(SafetyActivity.this,"点击了哈哈哈",Toast.LENGTH_LONG).show();
            }
        });
    
        //===当想自定义dialog的一些样式(宽高、弹出位置)
        //1.获取dialog
        AlertDialog dialog=alertDialog.create();
        //2.获取Dialogwindow对象
        Window window=dialog.getWindow();
        //3.获取到window管理器
        WindowManager manager=getWindowManager();
        //4.获取屏幕参数
        Display display=manager.getDefaultDisplay();
        //5.添加参数
        WindowManager.LayoutParams params=window.getAttributes();
        params.height= (int) (display.getHeight()*0.4);//设置dialog的高
        params.width=(int) (display.getWidth()*0.6);//设置dialog的宽
        /*设置全屏(setBackgroundDrawableResource:不设置背景颜色咋不能全屏呢。。。)
                        window.setBackgroundDrawableResource(R.color.colorWhite);
                        params.width = WindowManager.LayoutParams.MATCH_PARENT;
                        params.height = WindowManager.LayoutParams.MATCH_PARENT;
                        * */
        params.gravity= Gravity.TOP;//弹出位置
        params.alpha=0.8f;
    
        //6.window设置参数
        window.setAttributes(params);
        //显示
        dialog.show();
    

    第八种:自定义dialog,添加布局文件:
    在这里插入图片描述

        AlertDialog.Builder alertDialog=new AlertDialog.Builder(SafetyActivity.this);
    
        alertDialog.setTitle("自定义的dialog,加载布局文件");
        alertDialog.setView(R.layout.test);//添加布局文件
    
        alertDialog.setPositiveButton("哈哈哈", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(SafetyActivity.this,"点击了哈哈哈",Toast.LENGTH_LONG).show();
            }
        });
        alertDialog.show();
    

    ps:若想只加载布局文件,把那句代码改为如下:(ps:如果不需要头部信息,可不设置setTitle)
    AlertDialog.Builder alertDialog=new AlertDialog.Builder(SafetyActivity.this,R.style.DialogTheme);
    R.style.DialogTheme:指的是:它可以设置dialog的样式

    在values/styles.xml新建一个样式DialogTheme,代码如下:

        <!--parent="@android:style/Theme.Dialog":点击dialog之外的界面就会关闭dialog-->
        <style name="DialogTheme"  parent="@android:style/Theme.Dialog">
            <!-- 边框 -->
            <item name="android:windowFrame">@null</item>
            <!-- 是否浮现在activity之上 -->
            <item name="android:windowIsFloating">true</item>
            <!-- 半透明 -->
            <item name="android:windowIsTranslucent">true</item>
            <!-- 无标题 -->
            <item name="android:windowNoTitle">true</item>
            <item name="android:background">@android:color/transparent</item>
            <!-- 背景透明 -->
            <item name="android:windowBackground">@android:color/transparent</item>
            <!-- 模糊 -->
            <item name="android:backgroundDimEnabled">true</item>
            <!-- 遮罩层透明度 -->
            <item name="android:backgroundDimAmount">0.5</item>
        </style>
    

    第九种:完全自定义dialog
    步骤一:先写一个需求需要的布局文件(例如下:名称为:test)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorPrimary"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorWhite"
            android:text="dialog测试,这青色背景是布局文件"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorWhite"
            android:text="dialog测试,这青色背景是布局文件"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorWhite"
            android:text="dialog测试,这青色背景是布局文件"/>
    
    </LinearLayout>
    

    步骤二:写一个类继承dialog

    public class TestDialog extends Dialog {
        
        //ps:!!!因为继承dialog,所以,在该类的方法里写dialog的方法即可(例:dismiss()),不用dialog.dismiss();
        
        public TestDialog(@NonNull Context context) {
            //如果要设置dialog占满宽或高,super里一定要添加R.style.DialogTheme,
            //否则params.width或params.height设置占满是没有效果的
            super(context,R.style.DialogTheme);
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //设置布test局
            setContentView(R.layout.test);
            
            //=======设置关于dialog的样式,这样式也可以在创建TestDialog对象时那里写
            Window window=getWindow();//也可这样写:dialog.getWindow();
              
            //dialog显示的位置
            window.setGravity(Gravity.BOTTOM);
            
            //dialog的大小
            //window.getDecorView().setPadding(50,0,50,50);
            
            //dialog的动画(R.style.dialog_menu_animStyle:自定义的动画)
            window.setWindowAnimations(R.style.dialog_menu_animStyle);
    
            //设置参数
            WindowManager.LayoutParams params=window.getAttributes();
            params.width=WindowManager.LayoutParams.MATCH_PARENT;
            params.height=WindowManager.LayoutParams.WRAP_CONTENT;
        }
    }
    

    步骤三:在需要弹出该dialog的地方,使用自定义的dialog

                    //==使用dialog
                    TestDialog testDialog=new TestDialog(SafetyActivity.this);
                    testDialog.show();
    

    第十种:日期:
    在这里插入图片描述

          Calendar calendar=Calendar.getInstance();
    	  //参1:当前上下文,参2日期改变监听,参3设置显示的年,参4设置显示的月(0-11代表1-12月),参5设置显示的日
          new DatePickerDialog(SafetyListActivity.this, new DatePickerDialog.OnDateSetListener() {
              @Override//参2为改变后的年,参3月,参4日
              public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    				//日期改变事件
                   Toast.makeText(SafetyListActivity.this,String.valueOf(year)+String.valueOf(month+1)+String.valueOf(dayOfMonth),Toast.LENGTH_LONG).show();
              }
          }, calendar.get(Calendar.YEAR) ,calendar.get(Calendar.MONTH) , calendar.get(Calendar.DAY_OF_MONTH)).show();
    

    自定义dialog弹出和退出的动画

    步骤一:在anim层(anim层时res层下的,是专门放动画的文件夹,第一次需要创建该文件夹,具体创建百度)
    新建dialog_in_anim.xml文件做弹出过程,代码如下:
    
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate
            android:duration="500"
            android:fromXDelta="0%p"
            android:toXDelta="0%"
            android:fromYDelta="100%p"
            android:toYDelta="0" />
    
    </set>
    
    步骤二:再新建一个退出过程的xml,名为dialog_out_anim
    
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate
            android:duration="500"
            android:fromXDelta="0"
            android:fromYDelta="0%p"
            android:toXDelta="0"
            android:toYDelta="100%p" />
    </set>
    
    步骤三:在values层的styles.xml添加显示过程和退出过程的样式(dialog_menu_animStyle:样式名称,
    可根据需求起)
    
        <style name="dialog_menu_animStyle">
            <item name="android:windowEnterAnimation">@anim/dialog_in_anim</item>
            <item name="android:windowExitAnimation">@anim/dialog_out_anim</item>
        </style>
    
    步骤四:使用dialog_menu_animStyle这个动画:例:在上面第九种dialog知识里有写
    
    		Window window=getWindow();//也可这样写:dialog.getWindow();
    		//dialog的动画(R.style.dialog_menu_animStyle:自定义的动画)
            window.setWindowAnimations(R.style.dialog_menu_animStyle);
    
    展开全文
  • 安卓Dialog的使用+如何自定义Dialog

    千次阅读 2020-09-16 16:44:42
    什么叫dialog 简单来说就是一句话: 弹出一个窗口,提示用户自己去选择,去提示,去分类的一些内容。 安卓自带的Diaalog有三种: - AlertDialog—-普通的提示对话框 - ProgressDialog–进度条对话 - ...

    什么叫dialog

    简单来说就是一句话:
    弹出一个窗口,提示用户自己去选择,去提示,去分类的一些内容。
    安卓自带的Diaalog有三种:

    - AlertDialog—-普通的提示对话框
    - ProgressDialog–进度条对话
    - DatePickerDialog/TimePickerDialog–日期对话框/时间对话框

    所有的对话框,都是直接或间接继承自Dialog类,而AlterDialog直接继承自Dialog,其他的几个类均继承自AlterDialog。

    系统自带的dialog基本上用AlertDialog
     AlertDialog继承自Dialog类,对于Android内置的AlterDialog,它可以包含一个标题、一个内容消息或者一个选择列表、最多三个按钮。而创建AlterDialog推荐使用它的一个内部类AlterDialog.Builder创 建。使用Builder对象,可以设置AlterDialog的各种属性,最后通过Builder.create()就可以得到AlterDialog对 象,如果只是还需要显示这个AlterDialog,一般可以直接使用Builder.show()方法,它会返回一个AlterDialog对象,并且显示它。

    下面我会讲三个层次的dialog的使用:

    • 简单的系统dialog调用//就是简单的系统dialog的调用
    • 半自定义的dialog//就是改变一些基础属性
    • 完全自定义dialog//自定义dialog类,自己写界面,点击事件
      ##简单的系统dialog
      简单的dialog也分好多种,但是我只说AlertDialog类的
      ###普通对话框
      这个就是最普通的那种,让你选择正确或者错误,也可以选择中立,这个是最常见的那种
      这里写图片描述
      用法很简单
    • 第一步:new个AlertDialog.Builder
    • 第二步:设置dialog的图标,文字,提示信息
    • 第三步:设置不同选择的点击事件
    • 第四步:显示dialog
     /**
         * 普通dialog
         */
        private void showAlterDialog(){
            final AlertDialog.Builder alterDiaglog = new AlertDialog.Builder(MainActivity.this);
            alterDiaglog.setIcon(R.drawable.icon);//图标
            alterDiaglog.setTitle("简单的dialog");//文字
            alterDiaglog.setMessage("生存还是死亡");//提示消息
            //积极的选择
            alterDiaglog.setPositiveButton("生存", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了生存",Toast.LENGTH_SHORT).show();
                }
            });
            //消极的选择
            alterDiaglog.setNegativeButton("死亡", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了死亡",Toast.LENGTH_SHORT).show();
                }
            });
           //中立的选择
            alterDiaglog.setNeutralButton("不生不死", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了不生不死",Toast.LENGTH_SHORT).show();
                }
            });
    
            //显示
            alterDiaglog.show();
        }

    列表对话框

    直接看图吧
    这里写图片描述
    这个和普通的dialog差不多,只不过是从中数组选择一个确定点击事件

     /**
         * 列表Dialog
         */
        private void showListDialog(){
            final String[] items = {"我是1","我是2","我是3"};
            AlertDialog.Builder listDialog = new AlertDialog.Builder(MainActivity.this);
            listDialog.setIcon(R.drawable.icon);//图标
            listDialog.setTitle("我就是个列表Dialog");
            listDialog.setItems(items, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了"+items[which],Toast.LENGTH_SHORT).show();
                }
            });
            listDialog.show();
        }
    •  

    单选对话框

    它和列表对话框区别是前面有选择的圆点
    也是一样的
    这里写图片描述

     /**
         * 单选Dialog
         */
        int choice;
        private void showSingDialog(){
            final String[] items = {"我是1","我是2","我是3"};
            AlertDialog.Builder singleChoiceDialog = new AlertDialog.Builder(MainActivity.this);
            singleChoiceDialog.setIcon(R.drawable.icon);
            singleChoiceDialog.setTitle("我是单选Dialo");
            //第二个参数是默认的选项
            singleChoiceDialog.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    choice= which;
                }
            });
            singleChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (choice!=-1){
                        Toast.makeText(MainActivity.this,
                                "你选择了" + items[choice],
                                Toast.LENGTH_SHORT).show();
                    }
                }
            });
            singleChoiceDialog.show();
        }

    多选对话框

    在单选的基础上加了多选这个,就是选择的函数不一样
    这里写图片描述

     /**
         * 多选对话框
         */
        ArrayList<Integer> choices= new ArrayList<>();
        private void showMultiChoiceDialog(){
            final String[] items = {"我是1","我是2","我是3"};
            //设置默认选择都是false
            final boolean initchoices[] = {false,false,false};
            choices.clear();
            AlertDialog.Builder multChoiceDialog = new AlertDialog.Builder(MainActivity.this);
            multChoiceDialog.setIcon(R.drawable.icon);
            multChoiceDialog.setTitle("我是个多选Dialog");
            multChoiceDialog.setMultiChoiceItems(items, initchoices, new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                    if (isChecked){
                        choices.add(which);
                    }else {
                        choices.remove(which);
                    }
                }
            });
            multChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    int size = choices.size();
                    String str = "";
                    for(int i = 0;i<size;i++){
                        str+=items[choices.get(i)]+"";
                    }
                    Toast.makeText(MainActivity.this,
                            "你选中了" + str,
                            Toast.LENGTH_SHORT).show();
                }
            });
            multChoiceDialog.show();
        }
    •  

    等待对话框

    等待Dialog具有屏蔽其他控件的交互能力
    @setCancelable 为使屏幕不可点击,设置为不可取消(false) 
    下载等事件完成后,主动调用函数关闭该Dialog
    这里写图片描述 

     private void showProgressDialog(){
            final int MAX = 100;
            final ProgressDialog progressDialog = new ProgressDialog(this);
            progressDialog.setTitle("我是个等待的Dialog");
            progressDialog.setMessage("等待中");
            progressDialog.setIndeterminate(true);
            progressDialog.setCancelable(false);
            progressDialog.show();
        }
    •  

    进度条对话框

    就是和那些app上一样,简单的一个等待的框
    这里写图片描述

    /**
         * 进度条Dialog
         */
        private void showWhiteDialog(){
            /* @setProgress 设置初始进度
             * @setProgressStyle 设置样式(水平进度条)
             * @setMax 设置进度最大值
             */
            final int Max = 100;
            final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setProgress(0);
            progressDialog.setIcon(R.drawable.icon);
            progressDialog.setTitle("我是一个进度条Dialog");
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.setMax(Max);
            progressDialog.show();
            /**
             * 开个线程
             */
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int p = 0;
                    while (p<Max){
                        try {
                            Thread.sleep(100);
                            p++;
                            progressDialog.setProgress(p);
                        }catch (InterruptedException e){
                            e.printStackTrace();
                        }
                    }
                    progressDialog.cancel();//达到最大就消失
                    }
    
            }).start();
        }
    •  

    半自定义对话框

    就是根据一些属性来自定义dialog,也可以添加自己的布局

    1控制不同普通的dialog的位置,大小,透明度

    这里写图片描述
    在不同的dialog的下面添加设置

     //自定义的东西
           //放在show()之后,不然有些属性是没有效果的,比如height和width
            Window dialogWindow = dialog.getWindow();
            WindowManager m = getWindowManager();
            Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
            WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
            // 设置高度和宽度
            p.height = (int) (d.getHeight() * 0.4); // 高度设置为屏幕的0.6
            p.width = (int) (d.getWidth() * 0.6); // 宽度设置为屏幕的0.65
    
            p.gravity = Gravity.TOP;//设置位置
    
            p.alpha = 0.8f;//设置透明度
            dialogWindow.setAttributes(p);

    整体的代码:

     /**
         * 自定义1 控制普通的dialog的位置,大小,透明度
         * 在普通的dialog.show下面添加东西
         */
        private void DiyDialog1(){
            AlertDialog.Builder alterDiaglog = new AlertDialog.Builder(MainActivity.this);
            alterDiaglog.setIcon(R.drawable.icon);//图标
            alterDiaglog.setTitle("简单的dialog");//文字
            alterDiaglog.setMessage("生存还是死亡");//提示消息
            //积极的选择
            alterDiaglog.setPositiveButton("生存", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了生存",Toast.LENGTH_SHORT).show();
                }
            });
            //消极的选择
            alterDiaglog.setNegativeButton("死亡", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了死亡",Toast.LENGTH_SHORT).show();
                }
            });
    
            alterDiaglog.setNeutralButton("不生不死", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(MainActivity.this,"点击了不生不死",Toast.LENGTH_SHORT).show();
                }
            });
            AlertDialog dialog = alterDiaglog.create();
    
            //显示
            dialog.show();
            //自定义的东西
           //放在show()之后,不然有些属性是没有效果的,比如height和width
            Window dialogWindow = dialog.getWindow();
            WindowManager m = getWindowManager();
            Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
            WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
            // 设置高度和宽度
            p.height = (int) (d.getHeight() * 0.4); // 高度设置为屏幕的0.6
            p.width = (int) (d.getWidth() * 0.6); // 宽度设置为屏幕的0.65
    
            p.gravity = Gravity.TOP;//设置位置
    
            p.alpha = 0.8f;//设置透明度
            dialogWindow.setAttributes(p);
        }
    •  

    自定义简单dialog的布局

    把自己写的xml加载进去
    这里写图片描述
    第一步:自定义布局
    自己定义dialog_1.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_centerInParent="true"
            android:background="#ed093a">
            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="自定义加强版的dialog"
                android:textColor="#fff"/>
        </LinearLayout>
    </RelativeLayout>
    • 第二步:在主活动里面设置dialog

    然后把这个布局扔进去

        /**
         * 自定义dialog2 简单自定义布局
         */
        private void DiyDialog2() {
            AlertDialog.Builder alterDiaglog = new AlertDialog.Builder(MainActivity.this,R.style.MyDialog);
            alterDiaglog.setView(R.layout.dialog_1);//加载进去
            AlertDialog dialog = alterDiaglog.create();
            //显示
            dialog.show();
            //自定义的东西
        }

    完全自定义dialog

    重要来到了最重头戏了,然后自定义dialog然后满足产品的需求,你只需要按照如下步骤来:
    这里写图片描述
    1.在values/styles.xml新建一个样式MyDialog

    •  

    2.新建一个MyDialog继承Dialog类

    public class MyDialog1 extends Dialog implements View.OnClickListener{
        //在构造方法里提前加载了样式
        private Context context;//上下文
        private int layoutResID;//布局文件id
        private int[] listenedItem;//监听的控件id
        public MyDialog1(Context context,int layoutResID,int[] listenedItem){
            super(context,R.style.MyDialog);//加载dialog的样式
            this.context = context;
            this.layoutResID = layoutResID;
            this.listenedItem = listenedItem;
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //提前设置Dialog的一些样式
            Window dialogWindow = getWindow();
            dialogWindow.setGravity(Gravity.CENTER);//设置dialog显示居中
            //dialogWindow.setWindowAnimations();设置动画效果
            setContentView(layoutResID);
    
    
            WindowManager windowManager = ((Activity)context).getWindowManager();
            Display display = windowManager.getDefaultDisplay();
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.width = display.getWidth()*4/5;// 设置dialog宽度为屏幕的4/5
            getWindow().setAttributes(lp);
            setCanceledOnTouchOutside(true);//点击外部Dialog消失
            //遍历控件id添加点击注册
            for(int id:listenedItem){
                findViewById(id).setOnClickListener(this);
            }
        }
        private OnCenterItemClickListener listener;
        public interface OnCenterItemClickListener {
            void OnCenterItemClick(MyDialog1 dialog, View view);
        }
        //很明显我们要在这里面写个接口,然后添加一个方法
        public void setOnCenterItemClickListener(OnCenterItemClickListener listener) {
            this.listener = listener;
        }
    
    
        @Override
        public void onClick(View v) {
            dismiss();//注意:我在这里加了这句话,表示只要按任何一个控件的id,弹窗都会消失,不管是确定还是取消。
            listener.OnCenterItemClick(this,v);
        }
    }
    

    3.主活动继承自己写的dialog的接口,实现点击方法

    //定义一个自己的dialog
     private MyDialog1 myDialog1;
    //实例化自定义的dialog
      myDialog1 = new MyDialog1(this,R.layout.dialog_2,new int[]{R.id.dialog_btn});
      //绑定点击事件
     myDialog1.setOnCenterItemClickListener((MyDialog1.OnCenterItemClickListener) this);
     //显示
      myDialog1.show();
     //调用点击函数
     @Override
        public void OnCenterItemClick(MyDialog1 dialog, View view) {
            switch (view.getId()){
                case R.id.dialog_btn:
                    Toast.makeText(getApplicationContext(),"点击了",Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
    
        }  
    

    总结

    最近项目还是没进度哇哇哇,心塞塞,准备开始弄个安卓游戏项目,要学一大堆东西。
    https://github.com/sakurakid/DialogDemo这个的git地址,希望对别人有帮助 

     

    展开全文
  • Easyui使用Dialog打印

    热门讨论 2015-05-20 10:03:03
    将Easyui的DataGrid内容放入Dialog中,打印该Dialog
  • 自定义万能dialog

    2016-04-15 17:01:29
    自定义万能dialog
  • 代码 RPG 对话框 RPG Dialog 1.05代码 RPG 对话框 RPG Dialog 1.05代码 RPG 对话框 RPG Dialog 1.05代码 RPG 对话框 RPG Dialog 1.05代码 RPG 对话框 RPG Dialog 1.05代码 RPG 对话框 RPG Dialog 1.05代码 RPG ...
  • HTML5 之 Dialog 标签

    千次阅读 2020-10-15 09:26:48
    dialog open> <p>hello world</p> </dialog>   浏览器呈现如下,含有部分默认样式,并且仅水平方向居中。   显示时样式。   隐藏时样式。 returnValue   保留clo.
  • Android五种显示Dialog的方法实现

    热门讨论 2013-03-01 19:48:07
    本资源为本人博客《Android五种显示Dialog的方法实现(附图+附源码)》使用的代码,里面含五种实现Dialog的方法,感兴趣的可以看看
  • Jquery dialog属性设置

    千次阅读 2019-04-30 11:17:40
    ·概述 一个浮动的窗口,包含标题和内容两部分。可以移动,调整大小,以及关闭图标 '×' 。...官方示例地址:http: //jqueryui.com/demos/dialog/ ·参数(名称 : 参数类型 : 默认值) auto...
  • 全网最简明的自定义Dialog
  • Android Dialog详解

    千次阅读 2018-06-02 11:58:53
    在Android开发过程中我们经常会遇到如下的场景: 在界面上弹出一个弹框,对用户进行提醒,并让用户做出某些选择性的操作 删除某个应用的系统级别的Dialog ...
  • 安卓自定义列表dialog

    万次阅读 2019-02-16 09:35:30
    这个形式也是最常用的,不过最近需要用到列表信息Dialog,原生的不光样式不能满足需求,而且是开发电视端的APP,需要对焦点进行特殊处理,所以就需要自定义Dialog 我们先来看一下系统自带的列表Dialog。 系统...
  • 今天在使用element-ui中的el-dialog的时候遇到了个这样的问题:页面上点击添加的按钮,弹出el-dialog对话框,该对话框中有个添加表单的子组件,然后填写值进行保存,点击保存按钮之后,el-dialog框关闭。继续点击...
  • dialog的使用方法

    千次阅读 2021-03-04 10:03:08
    dialog的使用方法发布时间:2020-06-03 14:09:01来源:亿速云阅读:563作者:Leah今天小编给大家分享的是dialog的使用方法的介绍,相信大部分人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,话不多说...
  • Android-Popupwindow和Dialog做弹出窗口

    热门讨论 2014-05-04 15:45:51
    (1)Popupwindow在显示之前一定要设置宽高,Dialog无此限制。 (2)Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);而在点击back的时候,Dialog会消失。 (3)Popupwindow不会...
  • 安卓自定义Dialog的实现

    万次阅读 多人点赞 2019-02-16 09:52:11
    安卓自定义Dialog
  • Android列表选择dialog

    千次阅读 2022-04-21 11:33:58
    dialog代码 public void showMutilAlertDialog(View view){ AlertDialog.Builder alertBuilder = new AlertDialog.Builder(deviceInfoActivity); alertBuilder.setTitle("请选择传感器"); /** *第一个参数:弹出框的...
  • el-dialog嵌套el-dialog问题

    千次阅读 2021-10-28 11:26:05
    ⼀定要⽗级 el-dialog :modal-append-to-body=“false” ⼦级 el-dialog 同时加上 :append-to-body=“true” 含义: modal-append-to-body 遮罩层是否插⼊⾄ body 元素上,若为 false,则遮罩层会插⼊⾄ Dialog的⽗...
  • android dialog悬浮和圆角

    千次阅读 2022-04-26 13:54:38
    final Dialog dialog = new Dialog(context); dialog.setContentView(view); if (dialog.getWindow() != null) { dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); //设置对话框...
  • dialog自适应高度

    千次阅读 2021-05-26 17:48:04
    继承Dialog,自定义从底部弹出diglog,因为有列表所以,自适应高度,目前设置0.5倍屏幕高度,如下:@Overridepublic void onWindowFocusChanged(boolean hasFocus) {Window window = this.getWindow();window....
  • 使用Dialog可能引起的内存泄漏

    千次阅读 2020-03-22 20:11:21
    其次,Handler虽然持有的是Dialog的弱引用,但是Dialog本身可能会持有外部强引用(比如Dialog的Context,View,Interface里包含外部强引用),因此Handler对Dialog的弱引用失效,最终Handler一直持有Dialog的引用。...
  • Kotlin中自定义dialog

    千次阅读 2020-04-07 14:00:36
    文章目录效果dialog样式dialog 背景 common_dialog_bgdialog布局 base_common_dialog_layout全局工具类 CommonDialog(建造者模式)使用 效果 dialog样式 <style name="custom_dialog2" parent="@android:style...
  • Android之底部Dialog里面放EditText点击布局顶上去效果

    千次阅读 多人点赞 2021-09-29 20:45:16
    1、需求 在底部Dialog里面放EditText点击,布局需要顶上去,不顶上去很烦。 2、Dialog里面关键样式属性 ...style name="DialogTheme" tools:ignore="DuplicateDefinition">

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 452,940
精华内容 181,176
关键字:

dialog

友情链接: App_Code.zip