【Android】日期选择器

三三要成为安卓糕手

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

零:需求引入

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

先上代码

java 复制代码
public class PickerBrithdayDialog extends DialogFragment{

    private BrithdayDialogListener listener;

    @NonNull
    @Override
    public 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() {
            @Override
            public 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);
    }
}
java 复制代码
public class ModifyBrithdayActivity extends AppCompatActivity {

    @Override
    protected 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() {
            @Override
            public void onClick(View v) {
                dialog.show(getSupportFragmentManager(),"btn_modify");
            }
        });

        PickerBrithdayDialog.BrithdayDialogListener dialogListener =
                new PickerBrithdayDialog.BrithdayDialogListener(){
            @Override
            public void onResult(int year, int month, int day) {
                tvDate.setText(year + "年" + month + "月" + day +"日");
            }
        };
        dialog.setBirthdayDialogListener(dialogListener);
    }
}
xml 复制代码
<?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">

    <TextView
        android: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" />

    <TextView
        android: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" />


    <Button
        android: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

相关推荐
Mu.3875 分钟前
加密与安全
java·开发语言
程序视点14 分钟前
FDM下载神器:免费多线程下载工具,速度90+M/S,完美替代1DM!
windows·后端
东风西巷15 分钟前
猫眼浏览器:简约安全的 Chrome 内核增强版浏览器
前端·chrome·安全·电脑·软件需求
太阳伞下的阿呆15 分钟前
npm安装下载慢问题
前端·npm·node.js
DKPT20 分钟前
Java设计模式之行为型模式(解释器模式)实现方式详解
java·笔记·学习·设计模式·解释器模式
happycode70035 分钟前
数据库迁移实践
后端
_extraordinary_39 分钟前
Java 字符串常量池 +反射,枚举和lambda表达式
android·java·开发语言
pe7er39 分钟前
Tauri 应用打包与签名简易指南
前端
前端搬砖仔噜啦噜啦嘞41 分钟前
Cursor AI 编辑器入门教程和实战
前端·架构
alexhilton41 分钟前
学会说不!让你彻底学会Kotlin Flow的取消机制
android·kotlin·android jetpack