如何修改Android自定义DatePicker Fragment代码将日期显示到EditText
把DatePicker选中的日期显示到EditText的解决方案
要实现将选中的日期替换Toast显示到dob EditText中,核心是解决Fragment与宿主Activity的UI通信问题——Fragment不能直接操作Activity的视图元素,这里推荐用接口回调的方式,既符合Android开发规范,又能让代码解耦。下面是具体修改步骤:
1. 在DatePicker Fragment中定义回调接口
首先在MyDatePickerFragment里新增一个接口,用来把选中的日期传递给Activity:
public class MyDatePickerFragment extends DialogFragment { // 定义回调接口,用于传递选中的日期 public interface OnDateSelectedListener { void onDateSelected(String formattedDate); } private OnDateSelectedListener dateSelectedListener; // 当Fragment依附到Activity时,初始化监听对象 @Override public void onAttach(Context context) { super.onAttach(context); try { dateSelectedListener = (OnDateSelectedListener) context; } catch (ClassCastException e) { throw new ClassCastException(context.toString() + " 必须实现OnDateSelectedListener接口!"); } } // 保留你原来的onCreateDialog方法 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); return new DatePickerDialog(getActivity(), dateSetListener, year, month, day); } // ... 后面的代码继续修改 }
2. 替换Toast为回调传递日期
修改onDateSet方法,把原来的Toast提示改成通过回调接口把格式化后的日期传给Activity:
private DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { public void onDateSet(DatePicker view, int year, int month, int day) { // 格式化日期(注意月份要+1,因为Calendar的月份从0开始) String formattedDate = day + " / " + (month + 1) + " / " + year; // 通过回调把日期传给Activity if (dateSelectedListener != null) { dateSelectedListener.onDateSelected(formattedDate); } } };
如果想要更规范的日期格式(比如yyyy-MM-dd或dd/MM/yyyy),可以用SimpleDateFormat来格式化,替换上面的格式化代码:
Calendar selectedDate = Calendar.getInstance(); selectedDate.set(year, month, day); SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()); String formattedDate = dateFormat.format(selectedDate.getTime());
3. 让宿主Activity实现回调接口并更新EditText
修改RegistrationActivity,实现我们定义的接口,在回调方法里把日期设置到dob EditText中:
public class RegistrationActivity extends AppCompatActivity implements MyDatePickerFragment.OnDateSelectedListener { private TextView textView; private EditText dobEditText; // 新增EditText引用 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout); textView = (TextView) findViewById(R.id.link_login); dobEditText = (EditText) findViewById(R.id.dob); // 初始化EditText // 保留原来的登录跳转点击事件 textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(RegistrationActivity.this, LoginActivity.class); startActivity(intent); } }); } public void showDatePicker(View v) { DialogFragment newFragment = new MyDatePickerFragment(); newFragment.show(getFragmentManager(), "Date Picker"); } // 实现回调方法,更新EditText内容 @Override public void onDateSelected(String formattedDate) { dobEditText.setText(formattedDate); } }
这样修改完成后,当你在DatePicker中选中日期,就会直接显示到dob输入框里,替代原来的Toast提示啦。
内容的提问来源于stack exchange,提问作者Ajay Kulkarni
相关产品推荐
相关产品推荐

