Android项目实战(三十二):圆角对话框Dialog

 

前言:

  项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框。

  

  对话框包括:1、圆角

        2、app图标 , 提示文本,关闭对话框的"确定"按钮

  难点:1、对话框边框圆角显示

     2、考虑到提示文本字数不确定,在不影响美观的情况下,需要在一行内显示提示的文字信息

       3、设置对话框的宽和高

  技术储备:

     1、安卓开发_使用AlertDialog实现对话框    知道AlertDialog有setView(view) ,Dialog 有ContentView(view) 方法。

     2、Android项目实战(五):TextView自适应大小   一行内显示文本信息,当文本字数少的时候 ,文字大小大,当文本字数多的时候,文字大小小。   

    

--------------------------------------------------------------------------------------------------------------------

1、布局

  1.  dialog_message.xml

其中根容器用到

  1. android:background="@drawable/dialog_corner_bg"

这是shape来设置 边缘圆角

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- 用于设置信息对话框的圆角 -->
  3. <shape xmlns:android="http://schemas.android.com/apk/res/android">
  4. <corners android:radius="@dimen/dp_12"></corners>
  5. <solid android:color="@color/white"></solid>
  6. </shape>

2、从上面可以看到设置对话框的圆角只需要一个 drawable文件,shape设置 corners属性即可。

  也许大家从别的文章发现, 有的人用圆角背景图片来实现对话框圆角,有的人用style来实现对话框圆角。

  经过我1个多小时的折腾,发现这些方法都不可靠,其实很简单,以上方法用的是AlertDialog , 但是我们这里用的Dialog类,一个shape 足矣。

  因为项目中必定多出用到对话框,所以我写一个静态方法,传上下文参数 和 提示文本的内容即可 :

  1. public static void showEditDialog(Context context , String message) {}

  

  1、初始化对话框相关操作:

  1.      View view = LayoutInflater.from(context).inflate(R.layout.dialog_message, null);
  2. TextView confirm; //确定按钮
  3. final TextView content; //内容
  4. confirm = (TextView) view.findViewById(R.id.dialog_btn_comfirm);
  5. content = (TextView) view.findViewById(R.id.dialog_txt_content);
  6. content.setText(message);
  7. final Dialog dialog = new Dialog(context);
  8. dialog.setContentView(view);
  9. dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); //设置对话框背景透明 ,对于AlertDialog 就不管用了

  

  2、设置"确定"按钮的点击事件

  1.     confirm.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. dialog.dismiss();
  5. }
  6. });

  3、显示对话框

  1. dialog.show();

  

  4、设置对话框的宽度和高度

  1.     DisplayMetrics dm = context.getResources().getDisplayMetrics();
  2. int displayWidth = dm.widthPixels;
  3. int displayHeight = dm.heightPixels;
  4. android.view.WindowManager.LayoutParams p = dialog.getWindow().getAttributes(); //获取对话框当前的参数值
  5. p.width = (int) (displayWidth * 0.55); //宽度设置为屏幕的0.55
  6. p.height = (int) (displayHeight * 0.28); //高度设置为屏幕的0.28
  7. dialog.setCanceledOnTouchOutside(false);// 设置点击屏幕Dialog不消失
  8. dialog.getWindow().setAttributes(p); //设置生效

  注意:这里就是用屏幕的宽高比例来设置对话框的宽高比例。

  还有一个做法:

  1. AlertDialog dialog = builder.create();
  2. dialog.setView(view);
  3. dialog.show();
  4. WindowManager m = getWindowManager(); //这里会发现不在activity中的话 就没法调用getWindowManager()方法,所以此方法不能使用
  5. Display d = m.getDefaultDisplay(); //为获取屏幕宽、高
  6. android.view.WindowManager.LayoutParams p = dialog.getWindow().getAttributes(); //获取对话框当前的参数值
  7. p.height = (int) (d.getHeight() * 0.3); //高度设置为屏幕的0.3
  8. p.width = (int) (d.getWidth() * 0.5); //宽度设置为屏幕的0.5
  9. dialog.getWindow().setAttributes(p); //设置生效

附提示文本多的时候的对话框界面:

完整代码:

 

  1. /*----------------------------dialog---------------------------------*/
  2. public static void showEditDialog(Context context , String message) {
  3. View view = LayoutInflater.from(context).inflate(R.layout.dialog_message, null);
  4. TextView confirm; //确定按钮
  5. final TextView content; //内容
  6. confirm = (TextView) view.findViewById(R.id.dialog_btn_comfirm);
  7. content = (TextView) view.findViewById(R.id.dialog_txt_content);
  8. content.setText(message);
  9. final Dialog dialog = new Dialog(context);
  10. dialog.setContentView(view);
  11. dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
  12.  
  13. confirm.setOnClickListener(new View.OnClickListener() {
  14. @Override
  15. public void onClick(View v) {
  16. dialog.dismiss();
  17. }
  18. });
  19. dialog.show();
  20. DisplayMetrics dm = context.getResources().getDisplayMetrics();
  21. int displayWidth = dm.widthPixels;
  22. int displayHeight = dm.heightPixels;
  23. android.view.WindowManager.LayoutParams p = dialog.getWindow().getAttributes(); //获取对话框当前的参数值
  24. p.width = (int) (displayWidth * 0.55); //宽度设置为屏幕的0.5
  25. p.height = (int) (displayHeight * 0.28); //宽度设置为屏幕的0.5
  26. dialog.setCanceledOnTouchOutside(false);// 设置点击屏幕Dialog不消失
  27. dialog.getWindow().setAttributes(p); //设置生效
  28.  
  29. }

(转载)Android项目实战(三十二):圆角对话框Dialog的更多相关文章

  1. Android项目实战(十二):解决OOM的一种偷懒又有效的办法

    在程序的manifest文件的application节点加入android:largeHeap=“true” 即可. 对,只需要一句话! 那么这行代码的意思是什么呢? 简单的说就是使该APP获取最大可 ...

  2. Android项目实战(十九):Android Studio 优秀插件: Parcelable Code Generator

    Android Studio 优秀插件系列: Android Studio 优秀插件(一):GsonFormat Android Studio 优秀插件(二): Parcelable Code Gen ...

  3. Android项目实战(十四):TextView显示html样式的文字

    项目需求: TextView显示一段文字,格式为:(消息个数,不确定)条消息 这段文字中名字和数字的长度是不确定的,还要求名字和数字各自有各自的颜色. 一开始我想的是用(转) SpannableStr ...

  4. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十二之铭文升级版

    铭文一级: ======Pull方式整合 Flume Agent的编写: flume_pull_streaming.conf simple-agent.sources = netcat-sources ...

  5. Android项目实战(十六):QQ空间实现(一)—— 展示说说中的评论内容并有相应点击事件

    大家都玩QQ空间客户端,对于每一个说说,我们都可以评论,那么,对于某一条评论: 白雪公主 回复 小矮人 : 你们好啊~ 我们来分析一下: .QQ空间允许我们 点击 回复人和被回复人的名字就可以进入对于 ...

  6. Android项目实战(十):自定义倒计时的TextView

    项目总结 -------------------------------------------------------------------------------------------- 有这 ...

  7. android 项目学习随笔十二(ListView加脚布局)

    1.ListView加脚布局 头布局initHeaderView,在onTouchEvent事件中进行显示隐藏头布局切换 脚布局initFooterView,实现接口OnScrollListener, ...

  8. 潭州课堂25班:Ph201805201 django 项目 第三十二课 后台站点管理(课堂笔记)

    一.后台站点模版抽取 1.获取静态站点模版 可以使用git clone到本地 git clone https://github.com/almasaeed2010/AdminLTE.git 也可以在g ...

  9. <Android 基础(三十二)> ViewFlipper

    简介 View Flipper,是ViewAnimator的子类,而ViewAnimator又是继承自FrameLayout,而FrameLayout就是平时基本上只显示一个子视图的布局,由于Fram ...

  10. Java并发编程原理与实战三十二:ForkJoin框架详解

    1.Fork/Join框架有什么用呢? ------->Fork使用来切分任务,Join是用来汇总结果.举个简单的栗子:任务是1+2+3+...+100这个任务(当然这个任务的结果有好的算法去做 ...

随机推荐

  1. 【从零开始】【Java】【3】改造成多模块项目

    闲聊 前几天还是太懒惰了,毕竟也是世界杯期间嘛,可以自我理解的,嘿嘿. 毕竟是从头开始,但是不一定适合所有新入门的人,所以搭框架啊.引入框架什么的,是占据最开始时间比较多的,代码层面的,可能要到靠后面 ...

  2. Symmetric Difference FreeCodeCamp

    function sym(args) { var arr = Array.prototype.slice.call(arguments); return arr.reduce((arr1, arr2) ...

  3. Centos 7 安装图形化界面

    Centos 7 默认是没有图形化界面的,但我们很多人在习惯了 Windows 的图形化界面之后,总是希望有一个图形化界面从而方便我们使用,这里介绍一下 CentOS7安装图形化桌面系统的方法. 一. ...

  4. java 常用API 时间 练习

    package com.orcal.demc01; import java.util.Date; public class Xuexi { public static void main(String ...

  5. elasticsearch的核心概念

    1.elasticsearch的核心概念 (1)Near Realtime(NRT):近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒):基于es执行搜索和分析可以达到秒级 (2) ...

  6. 网络教程(8)IP协议

    两台计算机间不是直接连接的,所以不能使用PPP协议,那么它们是怎么链接的呢? host A想把信息传给host B ethernet帧中的目标mac地址传到SFO后开始使用PPP协议   [Media ...

  7. php ob缓存

    用PHP的ob_start();控制您的浏览器cache Output Control 函数可以让你自由控制脚本中数据的输出.它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况.输出 ...

  8. Project Euler 45 Triangular, pentagonal, and hexagonal( 二分 + 函数指针 )

    题意: 三角形数.五边形数和六角形数分别由以下公式给出:       三角形数 Tn=n(n+1)/2 1, 3, 6, 10, 15, - 五边形数 Pn=n(3n−1)/2 1, 5, 12, 2 ...

  9. Yii2.0 RESTful API 认证教程

    认证介绍 和Web应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sess ...

  10. BA-siemens-点位类型表

    X(超级点)  输入 0-10v 4-20ma(不可用) Ni 1000 Pt 1000 10k & 100k 热敏电阻 数字输入 脉冲计数输入 输出 0-10v 4-20ma(不可用) 数字 ...