
三三要成为安卓糕手
这一章节主要想让我学会的是,利用接口实现联调,这是一种非常棒的编程思想,好好体会
零:需求引入
点击去修改按钮,弹出日历对话框,选择某个日期,点击确定,修改后的数据展示在原先的视图上

先上代码
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)时序图
- 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