【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)时序图
- ModifyBrithdayActivity 创建 PickerBrithdayDialog 实例
- ModifyBrithdayActivity 设置监听器(实现 onResult() 方法)
- 用户点击按钮,对话框显示
- 用户选择日期并确认
- 对话框触发 onDateSet()
- 对话框调用 listener.onResult()
- ModifyBrithdayActivity 的 onResult() 被执行,更新 UI
简单总结就是:
绿色线完成监听器注册(告诉对话框结果该传给谁) ,蓝色方框里调用 listener.onResult
时,借助注册好的关联,就能触发紫色箭头对应的、Activity
里的回调方法,实现 “用户点击按钮 → 显示日期选择对话框 → 用户选择日期并确认 →对话框通过接口回调通知活动 → 活动更新 UI 显示日期” 的完整流程
(2)写代码的顺序
写代码的顺序,其实都是一环扣着一环的
(3)提取成员变量
2:成员接口
两件事
在类内部可以定义接口,称为成员接口(Member Interface)。它的访问权限由 public
、private
、protected
或default(默认)控制
接口中的方法默认是抽象方法(public abstract
),必须被实现类重写才能使用
如果接口是 public
的,可以直接通过类名访问接口,
3:月份+1
问题引入:选择的月份跟显示出来的不一样我也是醉了
打断点,走流程,无敌了兄弟(打断点、走流程是必须掌握的技能)
month默认是从0开始的,需要+1