当前位置: 首页 > news >正文

【Android】日期选择器

在这里插入图片描述

三三要成为安卓糕手
这一章节主要想让我学会的是,利用接口实现联调,这是一种非常棒的编程思想,好好体会

零:需求引入

点击去修改按钮,弹出日历对话框,选择某个日期,点击确定,修改后的数据展示在原先的视图上

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

先上代码

public class PickerBrithdayDialog extends DialogFragment{private BrithdayDialogListener listener;@NonNull@Overridepublic Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {Calendar calendar = Calendar.getInstance();//单例模式int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH);int day = calendar.get(Calendar.DAY_OF_MONTH);DatePickerDialog datePickerDialog=new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {@Overridepublic void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {//选择完点击确定后,当前方法会被触发listener.onResult(year,month+1,dayOfMonth);}},year,month,day);return datePickerDialog;}public void setBirthdayDialogListener(BrithdayDialogListener listener){this.listener = listener;}public interface BrithdayDialogListener{void onResult(int year , int month , int day);}
}
public class ModifyBrithdayActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_modify_brithday);TextView tvDate = findViewById(R.id.tv_date);PickerBrithdayDialog dialog= new PickerBrithdayDialog();//不要放在onClick中创建,节约资源findViewById(R.id.btn_modify).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dialog.show(getSupportFragmentManager(),"btn_modify");}});PickerBrithdayDialog.BrithdayDialogListener dialogListener =new PickerBrithdayDialog.BrithdayDialogListener(){@Overridepublic void onResult(int year, int month, int day) {tvDate.setText(year + "年" + month + "月" + day +"日");}};dialog.setBirthdayDialogListener(dialogListener);}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".dialog.ModifyBrithdayActivity"><TextViewandroid:id="@+id/tv_label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="你的生日是"android:textSize="28sp"android:textStyle="bold"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.3" /><TextViewandroid:id="@+id/tv_date"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="2025.07.09"android:textSize="28sp"android:textStyle="bold"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/tv_label" /><Buttonandroid:id="@+id/btn_modify"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="12dp"android:text="去修改"android:textSize="20sp"android:textStyle="bold"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/tv_date" /></androidx.constraintlayout.widget.ConstraintLayout>

一:日期选择器

1:DatePickerDialog用法

(1)参数

Android 中,Picker 翻译为 “选择器” 。具体到 DatePickerDialog 里,它指的是用于选择日期的界面组件,所以更准确的表述是 “日期选择器对话框”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(2)源码

源码参数,默认显示的年月日是什么

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • @NonNull 注解表示方法返回值不能为 null
  • @Nullable 注解表示方法返回值可能为 null

五个参数

  • Context上下文
  • OnDateSetListen 日期设置监听器
  • 年月日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2:Calendar

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(1)getInstance

单例模式,本质其实也是new 一个对象

Calendar.YEAR

Calendar.MONTH

Calendar.DAY_OF_MONTH

这三个参数确实是默认值,但它们不是写死的固定值,而是动态获取的当前系统日期

当然也可以手动设定默认的年月日,直接在构造方法中给具体的数字

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意这里创建DatePickerDialog是在

3:日期页面跳转

每次点击都要创建一个对象,浪费资源,写到外面;

点击事件中的代码上一篇文章中有介绍过,不必多说

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意xml代码中控件的id

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

效果如下——页面正常跳转

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在这三块代码的执行逻辑就非常清楚了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二:日期修改与视图联动

提出问题:DialogFragment与Activity如何做数据交互

我的数据是出现在这里

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

怎么把数据传到ModifyBrithdayActivity中的视图中并子啊view中去显示呢??

假如这里我选择7月1日,点击确定。选择好的数据怎么传过去呢?我咧哇666

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1:联调流程图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(1)时序图

  1. ModifyBrithdayActivity 创建 PickerBrithdayDialog 实例
  2. ModifyBrithdayActivity 设置监听器(实现 onResult() 方法)
  3. 用户点击按钮,对话框显示
  4. 用户选择日期并确认
  5. 对话框触发 onDateSet()
  6. 对话框调用 listener.onResult()
  7. ModifyBrithdayActivity 的 onResult() 被执行,更新 UI

简单总结就是:
绿色线完成监听器注册(告诉对话框结果该传给谁) ,蓝色方框里调用 listener.onResult 时,借助注册好的关联,就能触发紫色箭头对应的、Activity 里的回调方法,实现 “用户点击按钮 → 显示日期选择对话框 → 用户选择日期并确认 →对话框通过接口回调通知活动 → 活动更新 UI 显示日期” 的完整流程

(2)写代码的顺序

写代码的顺序,其实都是一环扣着一环的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(3)提取成员变量

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2:成员接口

两件事

在类内部可以定义接口,称为成员接口(Member Interface)。它的访问权限由 publicprivateprotected 或default(默认)控制

接口中的方法默认是抽象方法public abstract),必须被实现类重写才能使用

如果接口是 public 的,可以直接通过类名访问接口

3:月份+1

问题引入:选择的月份跟显示出来的不一样我也是醉了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

打断点,走流程,无敌了兄弟(打断点、走流程是必须掌握的技能)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

month默认是从0开始的,需要+1

http://www.lryc.cn/news/603680.html

相关文章:

  • GitHub下载项目完整配置SSH步骤详解
  • iOS-实用框架
  • go标准库log模块学习笔记
  • Gartner发布2025年数据安全技术成熟度曲线:29项最新数据安全相关技术发展和应用趋势
  • 2025-07-29 学习记录--LaTeX-LaTeX知识点总结
  • 从硬编码到自主智能体:营销AI的20年技术演进与未来展望
  • decoupleQ:通过将参数解耦为整数与浮点数,实现2比特后训练统一量化
  • AI搜索SEO优化解决方案指南
  • 基于Dify构建本地化知识库智能体:从0到1的实践指南
  • 6、微服务架构常用十种设计模式
  • elememtor 添加分页功能
  • Vant:轻量可靠的移动端 Vue 组件库深度解析
  • prometheus_client 调用统计
  • HBase、MongoDB 和 Redis 的区别详解
  • Ubuntu 抽取系统制作便于chroot的镜像文件
  • P1020 [NOIP 1999 提高组] 导弹拦截
  • 动态库示例
  • 代码随想录算法训练营第三十五天
  • BGP团体属性
  • MybatisPlus-20.插件功能-通用分页实体与MP转换
  • 【IQA技术专题】纹理相似度图像评价指标DISTS
  • AAA 与 FTP:网络认证授权及文件传输的原理与实践
  • 如何在 Ubuntu 24.04 或 22.04 Linux 上安装和运行 Redis 服务器
  • Redis的持久化策略-AOF和RDB(详细图解)
  • 广告投放数据与管理全解析:从数据解读到高效运营
  • ansible 使用更高版本的python版本
  • 设计一个高可用、可拓展、监控报警系统,使用普罗米修斯和grafana,并给出go实现
  • 第2章 cmd命令基础:常用基础命令(1)
  • SQL排查、分析海量数据以及锁机制
  • 微算法科技(NASDAQ:MLGO)应用区块链联邦学习(BlockFL)架构,实现数据的安全传输