介绍

传入布局、宽和高,就可以完成一个Dialog。需要什么功能通过Build配置实现。
代码简单,只使用了Build模式、lifecycle。
可以继承当前CommonDialog,继续封装或者直接修改CommonDialog扩展。

github代码地址(最新代码)

主要功能

  1. 简化代码,美化代码
  2. 通过传入布局,直接显示布局的效果
  3. 根据监听生命周期,自动销毁

使用案例

先看看正常创建一个传入布局的Dialog需要的代码,不包括子View的点击事件设置。

     Dialog dialog = new Dialog(this, R.style.Base_Theme_AppCompat_Dialog);View view = View.inflate(this, R.layout.comm_dialog, null);dialog.setContentView(view);dialog.setCanceledOnTouchOutside(true);Window dialogWindow = dialog.getWindow();WindowManager.LayoutParams lp = dialogWindow.getAttributes();lp.width = WindowManager.LayoutParams.WRAP_CONTENT;lp.height = WindowManager.LayoutParams.WRAP_CONTENT;dialogWindow.setAttributes(lp);dialog.show();

使用CommonDialog

  val dialog = CommonDialog.Build(this).setWidth(ViewGroup.LayoutParams.WRAP_CONTENT).setHeight(ViewGroup.LayoutParams.WRAP_CONTENT).setLayout(R.layout.common_dia_log).setText(R.id.tile, "自定义标题").setText(R.id.message, "点击确定销毁Activity").setText(R.id.left_button, "自动销毁Dialog").setText(R.id.right_button, "手动销毁Dialog").setOnClickListener(R.id.left_button) {finish()}.setCanceledOnTouchOutside(true).build()dialog.findViewById<Button>(R.id.right_button).setOnClickListener {// 经过测试多次调用dialog.dismiss()没有异常dialog.dismiss()dialog.dismiss()}dialog.show()

ViewPage案列

   val dialog = CommonDialog.Build(this).setWidth(ViewGroup.LayoutParams.MATCH_PARENT).setHeight(ViewGroup.LayoutParams.MATCH_PARENT).setLayout(R.layout.fragment_dia_log).setCanceledOnTouchOutside(true).build() val viewPager = dialog.findViewById<ViewPager2>(R.id.view_pager)val adapter = BaseRecyclerViewAdapter.Build<String>().setContext(this).setDataList(list).setLayoutId(R.layout.view_page_item).build()adapter.setBaseRecyclerViewAdapterBackCall { holder, position ->holder.getView<Button>(R.id.coles).setOnClickListener {dialog.dismiss()}holder.getView<TextView>(R.id.text_view).text = list[position]}viewPager.adapter = adapter;dialog.show()

源代码----最新版本在github上


import android.app.Dialog;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;import androidx.annotation.DrawableRes;
import androidx.annotation.IdRes;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.StyleRes;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.LifecycleOwner;import com.wang.javatools.base.LifecycleObserver;/*** 自定义Dialog类,* 帮你简化Dialog创建,使用Build类快速创建。* 通过传入的布局、按钮、Text,快速获取到Dialog,不提供默认模板* 返回对象是Dialog,你依然可以拿到返回Dialog进行封装和修改* 无需关注Dialog的生命周期,会跟随传入的页面自动销毁,也可以自己调用dismiss* <p>* 使用指南* 1.如何定义Dialog中的属性* 如果是初始化属性直接去布局修改.* 示例:<TextView android:textColor="@android:color/holo_blue_bright"/>* <p>* 如果有在点击事件中修改Dialog修改按钮属性* 示例 onClick(v) 拿v来设置* <p>* 如果需要在点击事件修改Dialog其他属性* 先Build创建完Dialog,再使用@getView()获取View的点击事件,再拿Dialog对象设置* <p>* 2.大部分方法使用了注解来避免传入错误,使用的注解都是androidx.annotation里面的注解,没有自定义,注意导包。* <p>* 3.设置宽和高的属性* 使用ViewGroup.LayoutParams的字段设置填充效果,或者直接传入具体大小* 示例:* .setHeight(ViewGroup.LayoutParams.WRAP_CONTENT)* .setWidth(ViewGroup.LayoutParams.MATCH_PARENT)* .setWidth(10)* <p>* 4.如果出现* 找不到***方法,原因这个view不是继承**** 请查看传入的View是否带有***的方法,如果有直接修改当前方法或者增加重载方法* <p>*/public class CommonDialog extends Dialog implements LifecycleObserver {private static final String TAG = "CommonDialog";private Build mBuild;/*** 提供给Activity创建的Dialog的构造方法** @param build            Build对象* @param fragmentActivity Activity对象*/private CommonDialog(@NonNull Build build, FragmentActivity fragmentActivity) {// 使用自定义Dialog样式super(fragmentActivity, build.mStyle);fragmentActivity.getLifecycle().addObserver(this);mBuild = build;build();}/*** 提供给Fragment对象创建的Dialog的构造方法** @param build    Build对象* @param fragment fragment对象*/private CommonDialog(@NonNull Build build, Fragment fragment) {// 使用自定义Dialog样式super(fragment.getContext(), build.mStyle);fragment.getLifecycle().addObserver(this);mBuild = build;build();}private void build() {setContentView(mBuild.mRoot);// 设置宽和高WindowManager.LayoutParams params = getWindow().getAttributes();params.height = this.mBuild.mHeight;params.width = this.mBuild.mWidth;getWindow().setAttributes(params);// 设置点击Dialog以外的区域时Dialog消失setCanceledOnTouchOutside(mBuild.mCancel);}public <T extends View> T getView(@IdRes int viewId) {return this.mBuild.mRoot.findViewById(viewId);}/*** 自动处理生命周期,当Activity销毁时销毁自己* 解决忘记调用dismiss 出现的异常* android.view.WindowLeaked: Activity xxxActivity has leaked window DecorView[xxxActivity] that was originally added here** @param owner LifecycleOwner对象*/@Overridepublic void onDestroy(@NonNull LifecycleOwner owner) {// 经过测试多次调用dismiss()没有异常Log.e(TAG, "自动销毁Dialog");this.dismiss();}@Overridepublic void dismiss() {Log.d(TAG, "dismiss");super.dismiss();}public static class Build {private final Context mContext;private FragmentActivity fragmentActivity;private Fragment fragment;private View mRoot;private int mWidth;private int mHeight;private boolean mCancel;private int mStyle;public Build(FragmentActivity fragmentActivity) {this.mContext = fragmentActivity;this.fragmentActivity = fragmentActivity;}public Build(Fragment fragment) {this.mContext = fragment.getContext();this.fragment = fragment;}public Build setLayout(@LayoutRes int mLayout) {mRoot = LayoutInflater.from(mContext).inflate(mLayout, null, false);return this;}public Build setWidth(int width) {mWidth = width;return this;}public Build setHeight(int height) {mHeight = height;return this;}public Build setText(@IdRes int viewId, @NonNull String text) {View view = mRoot.findViewById(viewId);if (view instanceof TextView) {TextView textView = (TextView) view;textView.setText(text);} else {throw new NullPointerException("找不到setText方法,原因这个view不是继承TextView");}return this;}public Build setImageResource(@IdRes int viewId, @DrawableRes int drawableResId) {View view = mRoot.findViewById(viewId);if (view instanceof ImageView) {ImageView imageView = (ImageView) view;imageView.setImageResource(drawableResId);} else {throw new NullPointerException("找不到setImageResource方法,原因这个view不是继承ImageView");}return this;}public Build setOnClickListener(@IdRes int viewId, View.OnClickListener onClickListener) {View view = mRoot.findViewById(viewId);view.setOnClickListener(v -> onClickListener.onClick(v));return this;}public Build startAnimation(@IdRes int viewId, Animation animation) {View view = mRoot.findViewById(viewId);view.startAnimation(animation);animation.start();return this;}public Build setCanceledOnTouchOutside(boolean cancel) {mCancel = cancel;return this;}public Build setStyle(@StyleRes int style) {mStyle = style;return this;}public CommonDialog build() {if (fragmentActivity != null) {return new CommonDialog(this, fragmentActivity);} else {return new CommonDialog(this, fragment);}}}
}

一个通用的CommonDialog相关推荐

  1. 写一个通用数据访问组件

    出处:http://www.csharp-corner.com willsound(翻译) 我收到过好多Email来问我如何用一个通用的数据提供者(data provider)在不失自然数据提供者(n ...

  2. 干货!如何设计实现一个通用的分布式事务框架?

    来源:https://www.bytesoft.org/ 一个TCC事务框架需要解决的当然是分布式事务的管理.关于TCC事务机制的介绍,可以参考TCC事务机制简介. TCC事务模型虽然说起来简单,然而 ...

  3. 如何构建一个通用的垂直爬虫平台?

    阅读本文大约需要15~20分钟. 本文章内容较多,非常干货!如果手机阅读体验不好,建议先收藏后到 PC 端阅读. 之前做爬虫时,在公司设计开发了一个通用的垂直爬虫平台,后来在公司做了内部的技术分享,这 ...

  4. 为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式...

    为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式,代码如下: public class DataComparer<T>:IEqualityCompare ...

  5. 一个通用的计数限制解决方案

    一个通用的计数限制解决方案 参考文章: (1)一个通用的计数限制解决方案 (2)https://www.cnblogs.com/loogn/p/9023211.html 备忘一下.

  6. 用netty实现zcool_《Netty官方指南》把Netty当做一个通用的库

    原文链接 译者:lijunshu 校对:方腾飞 Netty是一个用来开发基于网络应用的框架,同时也提供了其他与socket I/O无关的基础类. Buffer API io.netty.buffer ...

  7. Qt Creator建立一个通用项目

    Qt Creator建立一个通用项目 建立一个通用项目 导入通用项目 处理通用项目文件 指定文件 将标志转发到Clang代码模型 提供部署信息 创建运行配置 建立一个通用项目 通用项目支持使您可以将Q ...

  8. 实现一个通用的中英文排序工具

    前言 利用Collator类可以轻松实现排序,但是我们可能有各种model都需要进行排序,这样就会有一个问题,如果单独为每个model写一段排序代码,代码重复量很大. 所以我打算写一个通用的工具,使用 ...

  9. Android 封装一个通用的PopupWindow

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 先上效果图: 完整代码地址已上传Github:CommonPopupWindow PopupWindow这个类用来实现一个弹出框, ...

最新文章

  1. vb.net怎么调用fastreport报表_零编码制作报表可能吗?
  2. ustc小道消息20220120
  3. Linux生成随机字符串
  4. Maven搭建SpringMVC+Mybatis项目详解【转】
  5. asp.net 报表页面模板_CP:基于JSON配置和vue-cli插件机制的模板复用方案
  6. centos下使用composer安装yii2框架
  7. Emacs一个键绑定多个命令
  8. Centos linux php扩展安装步骤
  9. 利用计算机模拟专家给病人,《计算机应用基础2007》复习资料
  10. 10月18号、19号、20号三天PC端云音乐项目总结
  11. win10家庭版升级为专业版
  12. 推导手机QQ聊天记录db文件加密IMEI值
  13. icem密度盒怎么设置_ICEM学习笔记
  14. Zcash中的signatures
  15. 计算机辅助项目管理实验论文,计算机辅助项目管理课程设计--毕设论文.doc
  16. 安卓游戏优化加速器v1.0.5
  17. Android 8.1 DisplayPowerController(五) 自动调节亮度(2)——算法
  18. 上传文件- rz -be -y
  19. luoguP4098「HEOI2013」ALO
  20. 一台云服务器可以干什么?

热门文章

  1. NLP——Tokenizer
  2. python 泛型_编写泛型
  3. 通俗的解释什么是Docker,一文搞懂
  4. 诚之和:淘宝这个特殊服务,让无数男人直接破防
  5. 看雇主是如何面试的: star面试法
  6. 循环赛 c语言,循环赛日程安排问题(分治法)
  7. word二级标题自动编号,本来应该是2.1,可是却变成1.2,标题不匹配,怎么办
  8. Android Permission denied 错误 ( 附Android权限大全 )
  9. 化工业环境容器衬里防腐设备用环氧酚醛面漆 具有非常好的耐酸性
  10. 华为终端云服务的华为云空间怎么样?