【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)。它的访问权限由 public、private、protected 或default(默认)控制

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

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

3:月份+1

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


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

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

相关推荐
Escalating_xu7 分钟前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
程序猿乐锅32 分钟前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
Highcharts.js37 分钟前
React 中原生支持使用 JSX 组件配置自定义表格 Highcharts Grid
前端·javascript·react.js·前端框架·jsx·highcharts·自定义表格
Java后端的Ai之路43 分钟前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
薛定谔的猫-菜鸟程序员1 小时前
Electron开发超详细教程(从入门到放弃)
前端·javascript·electron
AntsData1 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat1 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰1 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
Flynn Liang2 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞2 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin