安卓弹出框控件jjdxm-dialogui之日期选择小结_com.dou361.dialogui:jjdxm-dialogui-程序员宅基地

技术标签: AlertDialog  dialog  日期选择控件  jjdxm-dialogui  安卓弹出框  Android  

        哈喽!好久没写博客了,因为前段时间工作比较忙,网站又是第一次搞,进度有点慢,最近终于算是告一段落,今天给大家分享一下安卓中日期选择控件jjdxm-dialogui如何更好的导入到自己的项目,并且在源码的基础上修改一些东东以满足我们的需求。

        大神项目GitHub传送门:https://github.com/jjdxmashl/jjdxm_dialogui/

       “是时候表演真正的技术了偷笑”老规矩最终效果图奉上(忽略其他布局委屈):

   

       下面具体的实现步骤和修改:

       第一步、移步到传送门进行demo的下载并在Android Studio中打开调试到可以正常运行的状态

   

       第二步、就是把这个功能添加到自己的项目中了,GitHub导入方法,在build.gradle文件中使用

       compile 'com.dou361.dialogui:jjdxm-dialogui:x.x.x'

       我一般的添加时直接使用module的方式把一些第三方的控件导入到自己的项目中,以便让控件更加符合自己的功能需求,demo中的jjdxm-dialogui就是我最终要导入到我项目中的module,导入后会发现jjdxm-dialogui下的build.gradle会飘红有木有,因为他的配置是和demo中整个项目下的build.gradle关联的,你也可以用他项目下的方法,也可以修改module下的配置信息,因为我的项目已经是开发很长时间了,所以就直接改module中的配置信息了,配置效果如下:

 

              (这个你可以根据你的项目具体配置如果有不懂的也可以留言互相讨论)

       第三步、开始使用弹出代码调用弹出框了,接下来我从调用显示日期到分钟的情况分析,并且对源码做一些需求上的修改,首先是调用弹出框的代码

   

DialogUIUtils.showDatePick(getActivity(), Gravity.CENTER, "选择日期", System.currentTimeMillis() + 60000, DateSelectorWheelView.TYPE_YYYYMMDDHHMM, 0, new DialogUIDateTimeSaveListener() {
    @Override
    public void onSaveSelectedDate(int tag, String selectedDate) {
        ;
    }

    @Override
    public void onCancelSelectedDate() {
    }

}).show();

点击showDataPick()方法会发现他调用的是DialogAssigner下的assignDatePick()方法点击进去

@Override
public BuildBean assignDatePick(Context context,int gravity, String dateTitle, long date, int dateType, int tag, DialogUIDateTimeSaveListener listener) {
    BuildBean bean = new BuildBean();
    bean.mContext = context;
    bean.dateTitle = dateTitle;
    bean.gravity = gravity;
    bean.cancelable = true;
    bean.outsideTouchable = true;
    bean.type = DialogConfig.TYPE_DATEPICK;
    bean.dateTimeListener = listener;
    bean.dateType = dateType;
    bean.date = date;
    bean.tag = tag;
    return bean;
}
又一次出现一个BuildBean类,这个类中起到关键作用的是DialogConfig.TYPE_DATEPECK和dateType因为后期这两个参数会用来做判断,点击进入到弹出框的show()方法你会发现他会调用一个buildByType(this)

@Override
public Dialog show() {
    buildByType(this);
    if (dialog != null && !dialog.isShowing()) {
        ToolUtils.showDialog(dialog);
        return dialog;
    } else if (alertDialog != null && !alertDialog.isShowing()) {
        ToolUtils.showDialog(alertDialog);
        return alertDialog;
    }
    return null;
}
这个方法就是具体的实现方法了,点击buildByType(this)方法会进入到Buildable这个类里,他是BuildBean的父类,负责控件的具体展示和逻辑的类具体代码如下:

protected BuildBean buildByType(BuildBean bean) {
    ToolUtils.fixContext(bean);
    switch (bean.type) {
        case DialogConfig.TYPE_DATEPICK:
            buildDatePick(bean);
            break;
        case DialogConfig.TYPE_LOADING:
            buildLoading(bean);
            break;
        case DialogConfig.TYPE_MD_LOADING:
            buildMdLoading(bean);
            break;
        case DialogConfig.TYPE_MD_ALERT:
            buildMdAlert(bean);
            break;
        case DialogConfig.TYPE_SINGLE_CHOOSE:
            buildSingleChoose(bean);
            break;
        case DialogConfig.TYPE_MD_MULTI_CHOOSE:
            buildMdMultiChoose(bean);
            break;
        case DialogConfig.TYPE_ALERT:
            buildAlert(bean);
            break;
        case DialogConfig.TYPE_SHEET:
            buildSheet(bean);
            break;
        case DialogConfig.TYPE_CUSTOM_ALERT:
            buildCustomAlert(bean);
            break;
        case DialogConfig.TYPE_CUSTOM_BOTTOM_ALERT:
            buildCustomBottomAlert(bean);
            break;
        case DialogConfig.TYPE_BOTTOM_SHEET:
            buildBottomSheet(bean);
            break;
        default:
            break;


    }
    ToolUtils.setDialogStyle(bean);
    ToolUtils.setCancelable(bean);
    return bean;
}
这就是从GitHub下载的demo中的哪几种弹出框的具体实现代码,我们那个日期选择刚好是第一个分支下的内容,点击进去会发现具体的逻辑处理如下:

private BuildBean buildDatePick(final BuildBean bean) {
    AlertDialog.Builder builder = new AlertDialog.Builder(bean.mContext);
    View root = View.inflate(bean.mContext, R.layout.dialogui_datepick_layout, null);

    RelativeLayout rl_title_panel = (RelativeLayout) root
            .findViewById(R.id.rl_title_panel);
    FrameLayout flFirst = (FrameLayout) root
            .findViewById(R.id.fl_first);
    FrameLayout flNext = (FrameLayout) root
            .findViewById(R.id.fl_next);
    TextView tv_title = (TextView) root
            .findViewById(R.id.tv_title);
    TextView tv_first = (TextView) root
            .findViewById(R.id.tv_first);
    TextView tv_next = (TextView) root
            .findViewById(R.id.tv_next);
    FrameLayout fl_top_customPanel = (FrameLayout) root
            .findViewById(R.id.fl_top_customPanel);
    final DateSelectorWheelView dwvDate = (DateSelectorWheelView) root
            .findViewById(R.id.dwv_date);
    FrameLayout fl_bottom_customPanel = (FrameLayout) root
            .findViewById(R.id.fl_bottom_customPanel);
    dwvDate.setShowDate(bean.date);
    dwvDate.setShowDateType(bean.dateType);
    dwvDate.setTitleClick(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int id = v.getId();
            if (id == R.id.rl_date_time_title) {
                if (dwvDate.getDateSelectorVisibility() == View.VISIBLE) {
                    dwvDate.setDateSelectorVisiblility(View.GONE);
                } else {
                    dwvDate.setDateSelectorVisiblility(View.VISIBLE);
                }
            }
        }
    });

    builder.setView(root);
    final AlertDialog dialog = builder.create();
    bean.alertDialog = dialog;
    if (bean.gravity == Gravity.BOTTOM) {
        Window window = dialog.getWindow();
        window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    }

    flFirst.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (null != bean.dateTimeListener) {
                bean.dateTimeListener.onCancelSelectedDate();
            }
            dialog.dismiss();
        }
    });
    flNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (null != bean.dateTimeListener) {
                bean.dateTimeListener.onSaveSelectedDate(bean.tag, dwvDate.getSelectedDate());
            }
            dialog.dismiss();
        }
    });
    return bean;
}
如果要改变一些布局中的内容可以直接在布局文件R.layout.dialogui_datepick_layout文件中修改,根据项目需求我这对弹出看的取消按钮也做了监听和回调的功能,具体做的思路如下,点击弹出框代码中的new DialogUIDateTimeSaveListener()因为是监听取消并且要做逻辑的处理,所以从这入手在这个类下增加一个点击取消的回调的方法如下:

public abstract class DialogUIDateTimeSaveListener {

    public abstract void onSaveSelectedDate(int tag, String selectedDate);

    public abstract void onCancelSelectedDate();
    public void onTitleClick() {
    }
}

然后就是查找取消按钮并且给他添加点击事件的处理了,如果不出意外的话你添加完取消的回调后已经有代码飘红了,就是你调用弹出框那块的部分,会因为你没有实现他的抽象方法(java抽象类的知识),你实现一下,然后在初始化日期的地方找到取消键并添加逻辑处理,也就是上文中的flFirst啦,好了到此整个流程也就通了,改逻辑,改布局是不是变得so easy啦!

        非常感谢大神的贡献,一些基本控件免去了我们去自定义的烦恼,可以直接拿来用。看大神的源码不仅能很好的使用控件,同时也可以对自己的技术有很大的提升。

        最后再次奉上源码的GitHub传送门https://github.com/jjdxmashl/jjdxm_dialogui/

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bobo1127881870/article/details/78496362

智能推荐

房屋租赁管理系统 基于SSM框架_基于ssm框架实现的房屋租赁管理系统-程序员宅基地

文章浏览阅读2k次。房屋租赁管理系统 基于SSM框架一.功能介绍包括管理员、房东、租客三种角色,外加游客(未登录情况)出租类型包含整租和合租权限游客 < 租客 < 房东 < 管理员1、游客功能登录、注册(可以注册房东或租客)、搜索房子、查看箱子信息、新闻资讯查询搜索功能,根据价格范围,面积范围,城市,小区,整租/合租搜索房子信息,基本信息、轮播图、地图定位2、租客功能预定房子(创建订单、签订合同、支付订单)订单管理(取消订单、查看订单、查看合同、退租)我的家(查看我的当前有效订单房子信息、_基于ssm框架实现的房屋租赁管理系统

VCED跨模态学习与实践(一)_could not import extension myst_parser (exception:-程序员宅基地

文章浏览阅读509次。学习路径。_could not import extension myst_parser (exception: no module named 'myst_par

readelf_creating extended listing: xfkz.lss avr-objdump -h-程序员宅基地

文章浏览阅读360次。13. readelf elf文件格式分析这个工具和objdump命令提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件);ELF文件类型ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了_creating extended listing: xfkz.lss avr-objdump -h -s xfkz.elf > xfkz.lss /u

html语言怎么让字体加粗,css怎么让字体加粗?-程序员宅基地

文章浏览阅读504次。我们常常对HTML代码中文字字体进行加粗,无论中文、英文、数字以及符合进行加粗布局。下面我们来看一下如何使用css设置字体加粗。css设置字体加粗使用css属性font-weight。该属性用于设置显示元素的文本中所用的字体加粗。数字值400相当于关键字normal,700等价于bold。每个数字值对应的字体加粗必须至少与下一个最小数字一样细,而且至少与下一个最大数字一样粗。font-weight..._html font thick

2021年中国X射线开关电源电容器市场趋势报告、技术动态创新及2027年市场预测_国内航空开关电源市场-程序员宅基地

文章浏览阅读60次。X射线开关电源电容器市场的企业竞争态势 该报告涉及的主要国际市场参与者有AVX、IXYS Corporation、Murata、TDK、J. Schneider Elektrotechnik GmbH等。这些参与者的市场份额、收入、公司概况和SWOT分析都包含在X射线开关电源电容器市场调研报告中。产品分类:自动控制直流应用领域:数码产品汽车用品航空航天其他【出版日期】2021-10【出版商】湖南贝哲斯信息咨询有限公司报告指南(共十五..._国内航空开关电源市场

ibus计算机组成原理,计算机组成原理课程设计报告模板.doc-程序员宅基地

文章浏览阅读137次。计算机组成原理课程设计报告PAGE3 / NUMPAGES10计算机组成原理课程设计报告2014计算机组成原理课程设计报告 班级:计科1202组号:2-4北京化工大学计算机科学与技术专业计算机组成原理课程设计报告院 系: 信息科学与技术学院专 业: 计算机科学与技术班 级: 计科1202组 号: ..._ibus控制原理

随便推点

嵌入式入门之51单片机_嵌入式51单片机-程序员宅基地

文章浏览阅读1.7k次,点赞4次,收藏28次。单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。数码管的接法,有共阳和共阴之分。共阴时,拉高电压即可点亮。_嵌入式51单片机

axios和fetch、async和await_await怎么放到axios前面-程序员宅基地

文章浏览阅读278次。与axios使用方式相似,fetch("数据接口").then(回调函数返回数据),返回的数据调用json方法转为json格式,再用then()获取数据。axios是网络请求工具与我们自己封装的myaxios函数使用方法一样,但是它的功能更多。在ES7的时候新出了acync和await新语法,再次进行了优化,不再采用链式调用,而是将每个请求独立出来,做到了高内聚低耦合。我们只需要在函数前面加上async,再axios前面加上await,即可实现。前面的方法都优化了回调地狱,采用链式调用的方法。..._await怎么放到axios前面

P2737 [USACO4.1]麦香牛块Beef McNuggets-程序员宅基地

文章浏览阅读108次。题目传送门:P2737 [USACO4.1]麦香牛块Beef McNuggets简化题意:其实就是给你 nnn 个数,a1a_1a1​ 到 ana_nan​ ,对于每个数取任意个,把它们的和放到集合 SSS 中,找出在集合 SSS 中最大的正整数 xxx ,使得 $x \not \in S $这题大概思路就是确定两个范围,设有两数 m, rm,\ rm, r,它们满足:所有的测试点里的答案 ≤m\le m≤m如果凑出来的数有上限,那么 {x∣x∈[r,m],x∈N+}⊆S\{x _[usaco4.1]麦香牛块beef mcnuggets

上海有学计算机的职业学校吗,我初中没有毕业,现在17岁,我想去职业学校读计算机,请问去哪里读呢?我在上海...-程序员宅基地

文章浏览阅读204次。上海市现代职业技术学校上海曹杨职业学校中华职业学校上海商业学校上海海业学校上海市建筑工程学校上海市戏剧学院附属舞蹈学校上海市交通学校上海市工商外国语学校上海电子工业学校上海市贸易学校上海市临港科技学校上海市航空服务学校上海城市建设工程学校上海市体育运动学校上海市音乐学院附属中等音乐专科学校上海市公用事业学校上海市医药学校上海市工业技术学校上海市物资学校上海市行政管理学校上海市西南工程学校上海交通大..._上海计算机职业学校

1.4 MyBatis数据库逆向生成工具_mybatis反向生成工具-程序员宅基地

文章浏览阅读960次。MyBatis数据库逆向生成工具_mybatis反向生成工具

HBase 安装_修改pid文件存放路径 进入 /opt/hbase-2.0.0/conf 目录,找到 hbase-e-程序员宅基地

文章浏览阅读175次。文章目录HBase 安装查看更多:http://www.coffeecode.codes/HBase 安装启动 zookeepera. 进入 zookeeper 目录:/opt/module/zookeeper-3.4.10b. 启动 zookeeper 命令:bin/zkServer.sh start启动 Hadoopa. 进入 Hadoop 目录:/opt/module/hadoop-2.7.2b. 启动 DFS 命令:sbin/start-dfs.shc. Yarn_修改pid文件存放路径 进入 /opt/hbase-2.0.0/conf 目录,找到 hbase-env.sh 进

推荐文章

热门文章

相关标签