前言:

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

  

  对话框包括:1、圆角

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

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

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

       3、设置对话框的宽和高

  技术储备:

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

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

    

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

1、布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
xmlns:autofit="http://schemas.android.com/apk/res-auto"
android:layout_height="wrap_content"
android:background="@drawable/dialog_corner_bg"
android:paddingBottom="@dimen/dp_16"
>
<ImageView
android:id="@+id/dialog_img"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@mipmap/icon1"
android:layout_marginTop="@dimen/dp_12"
android:layout_centerHorizontal="true"
/> <me.grantland.widget.AutofitTextView
android:id="@+id/dialog_txt_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:maxLines=""
android:textSize="14sp"
autofit:minTextSize="10sp"
android:text="下载失败,请重试"
android:gravity="center"
android:layout_margin="@dimen/dp_6"
android:layout_centerInParent="true"
/> <TextView
android:id="@+id/dialog_btn_comfirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确定"
android:gravity="center"
android:background="@drawable/bg_btn_blue_big"
android:textColor="@color/white"
android:paddingTop="@dimen/dp_6"
android:paddingBottom="@dimen/dp_6"
android:paddingLeft="@dimen/dp_30"
android:paddingRight="@dimen/dp_30"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
/> </RelativeLayout>

dialog_message.xml

其中根容器用到

   android:background="@drawable/dialog_corner_bg"

这是shape来设置 边缘圆角

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

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

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

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

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

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

  

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

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

  

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

    confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});

  3、显示对话框

dialog.show();

  

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

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

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

  还有一个做法:

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

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

完整代码:

 

  /*----------------------------dialog---------------------------------*/
public static void showEditDialog(Context context , String message) {
View view = LayoutInflater.from(context).inflate(R.layout.dialog_message, null);
TextView confirm; //确定按钮
final TextView content; //内容
confirm = (TextView) view.findViewById(R.id.dialog_btn_comfirm);
content = (TextView) view.findViewById(R.id.dialog_txt_content);
content.setText(message);
final Dialog dialog = new Dialog(context);
dialog.setContentView(view);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
DisplayMetrics dm = context.getResources().getDisplayMetrics();
int displayWidth = dm.widthPixels;
int displayHeight = dm.heightPixels;
android.view.WindowManager.LayoutParams p = dialog.getWindow().getAttributes(); //获取对话框当前的参数值
p.width = (int) (displayWidth * 0.55); //宽度设置为屏幕的0.5
p.height = (int) (displayHeight * 0.28); //宽度设置为屏幕的0.5
dialog.setCanceledOnTouchOutside(false);// 设置点击屏幕Dialog不消失
dialog.getWindow().setAttributes(p); //设置生效 }

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

本人目前单挑两个APP,负责leancloud云端开发,同学们可关注我这个小程序员,有问题互相帮忙解决。

 

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. 微信小程序 web-view 的 url 带参问题

    在微信小程序开发过程中,会需要跳转到外部链接,微信提供了 <web-view>组件供我们使用. 为减少重复代码,一般会将这个功能单独抽取为一个页面供大家使用: <template&g ...

  2. 《机器学习实战(基于scikit-learn和TensorFlow)》第二章内容的学习心得

    请支持正版图书, 购买链接 下方内容里面很多链接需要我们***,请大家自备梯子,实在不会再请留言,节约彼此时间. 源码在底部,请自行获取,谢谢! 当开始着手进行一个端到端的机器学习项目,大致需要以下几 ...

  3. .NET手记-Autofac进阶(传递注册参数 Passing Parameters to Register)

    当你注册组件时,可以为组件服务传入一系列参数,用于服务解析时使用. 可使用的参数类型 Available Parameter Types Autofac提供了集中参数匹配类别: NamedParame ...

  4. vue moment库格式化处理后端传的日期

    开篇 日期时间格式前端和后端都可以处理,我比较推荐前端来处理(定制化高),下面我就介绍下两种处理的方式 后端处理 django默认不经处理传给前端的日期格式为2018-08-26T19:53:36.5 ...

  5. c++编程之内存的分配

    当我们在进行编程时,特别是使用c++语言进行编程时,需要知道内存有几个内存区可供我们使用,因为c++可以直接操作内存.接下让我们来看看内存中的几大内存区. 1.栈区 栈区(stack)是速度最快的一个 ...

  6. 怎么样在windows命令下创建一个没有文件名的文件?

    直接上图 echo ' ' >> .aa //创建一个空字符的 .aa 的文件

  7. NFS部署教程

    NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可 ...

  8. 使用gitlab, jenkins搭建CI(持续集成)系统(3) -- 根据不同触发条件执行不同的构建任务

    前面在jenkins中安装的gitlab hook支持不同的参数,具体可以参考gitlab hook文档https://github.com/jenkinsci/gitlab-hook-plugin# ...

  9. Python和Java分别实现冒泡排序

    1.基本思想 冒泡排序的基本思想是对比相邻的元素值.相邻元素值比较,如果满足条件两者就交换,把较小的移动到前面,把较大的移动到后面,这样较小的元素就像气泡一样浮上来了.可以看出,冒泡排序的每一次循环都 ...

  10. 基于tcp协议下粘包现象和解决方案,socketserver

    一.缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送 ...