Android开发:DatePicker选日期后TextView显示异常及自动设动态日期问题
解决DatePicker选中日期更新TextView及初始化显示当前日期的问题
嗨,我来帮你一步步搞定这两个问题哈!
一、选中日期后更新TextView
问题核心是你的DateTimePicker没有把选中的日期回调给Activity,导致TextView一直拿不到新值。咱们先完善DateTimePicker的回调逻辑,再在Activity里处理更新:
1. 完善DateTimePicker类,添加日期选中回调接口
修改你的DateTimePicker.java,新增一个回调接口,让它能把选中的日期传递出去:
public class DateTimePicker { // 定义回调接口,用于传递选中的日期 public interface OnDateSelectedListener { void onDateSelected(Date selectedDate); } private Activity mActivity; private OnDateSelectedListener mListener; private Calendar calendar; // 修改构造方法,接收Activity和监听器 public DateTimePicker(Activity activity, OnDateSelectedListener listener) { this.mActivity = activity; this.mListener = listener; this.calendar = Calendar.getInstance(); } public void showDateTimePicker() { // 这里用系统DatePickerDialog做示例,可替换成你自己的日期选择逻辑 DatePickerDialog datePickerDialog = new DatePickerDialog( mActivity, (view, year, month, dayOfMonth) -> { // 把选中的年月日组装成Date对象 calendar.set(year, month, dayOfMonth); Date selectedDate = calendar.getTime(); // 回调给Activity if (mListener != null) { mListener.onDateSelected(selectedDate); } }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH) ); datePickerDialog.show(); } }
2. 在Activity中处理回调,更新TextView
先在Activity里初始化TextView,然后在点击事件里传入监听器,拿到选中日期后格式化并设置:
// 定义TextView实例 private TextView tvDueDate; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); tvDueDate = findViewById(R.id.tv_due_date); // 替换成你的TextView ID // 处理日期选择区域的点击事件 findViewById(R.id.llDueDate).setOnClickListener(v -> { new DateTimePicker(this, selectedDate -> { // 把Date格式化成你需要的字符串,比如yyyy-MM-dd SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); String dateStr = sdf.format(selectedDate); // 设置到TextView tvDueDate.setText(dateStr); }).showDateTimePicker(); }); }
二、打开Activity时自动显示当前日期
这个很简单,在Activity的onCreate方法里,直接获取当前日期格式化后设置到TextView就行,写个小方法实现:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); tvDueDate = findViewById(R.id.tv_due_date); // 初始化显示当前日期 initCurrentDate(); // 上面的日期选择点击事件代码... } // 初始化当前日期的方法 private void initCurrentDate() { Calendar currentCal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); String currentDateStr = sdf.format(currentCal.getTime()); tvDueDate.setText(currentDateStr); }
关键点总结
- 必须通过回调接口让
DateTimePicker把选中的日期传递回Activity,不然Activity拿不到新日期 - 日期对象要转成字符串才能设置到TextView,用
SimpleDateFormat可以自定义显示格式 - 初始化当前日期直接用
Calendar.getInstance()获取系统当前时间即可
内容的提问来源于stack exchange,提问作者MohammadAli
相关产品推荐
相关产品推荐

