如何将Android DatePicker返回日期改为yyMMdd格式 实现同页双选择器用于startAt检索
实现步骤
1. 修正布局文件
你当前的布局只声明了1个按钮,需要补充2个对应id的日期选择按钮:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Search"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/button_tanggal_awal" android:layout_centerHorizontal="true" android:layout_marginBottom="28dp" android:text="date" android:textSize="30sp" /> <Button android:id="@+id/button_tanggal_awal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:textColor="@color/black" android:text="选择开始日期" /> <Button android:id="@+id/button_tanggal_akhir" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/button_tanggal_awal" android:layout_centerHorizontal="true" android:layout_marginTop="20dp" android:textColor="@color/black" android:text="选择结束日期" /> </RelativeLayout>
2. 修改DatePickerFragment支持传递选择器标记
添加参数传递逻辑,区分是开始日期选择器还是结束日期选择器:
public class DatePickerFragment extends DialogFragment { // 标记参数key private static final String ARG_PICKER_TYPE = "picker_type"; // 选择器类型常量 public static final int TYPE_START = 0; public static final int TYPE_END = 1; // 提供实例创建方法,传递类型参数 public static DatePickerFragment newInstance(int pickerType) { DatePickerFragment fragment = new DatePickerFragment(); Bundle args = new Bundle(); args.putInt(ARG_PICKER_TYPE, pickerType); fragment.setArguments(args); return fragment; } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); // 拿到类型参数,传给回调 int pickerType = getArguments() != null ? getArguments().getInt(ARG_PICKER_TYPE) : TYPE_START; return new DatePickerDialog(getActivity(), (view, year1, month1, dayOfMonth) -> { DatePickerDialog.OnDateSetListener listener = (DatePickerDialog.OnDateSetListener) getActivity(); if (listener != null) { // 自定义回调,把类型传过去 listener.onDateSet(new DatePicker(getContext()) { @Override public int getId() { return pickerType; } }, year1, month1, dayOfMonth); } }, year, month, day); } }
3. 修改Activity逻辑,处理日期格式化和双选择器区分
public class Search extends AppCompatActivity implements DatePickerDialog.OnDateSetListener { private Button buttontanggalawal, buttontanggalakhir; private TextView textView; // 保存格式化后的开始、结束日期,后续直接用这两个变量调用检索 private String startDateStr, endDateStr; // 自定义日期格式化规则,yyMMdd对应两位年+两位月+两位日 private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd", Locale.getDefault()); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); buttontanggalawal = findViewById(R.id.button_tanggal_awal); buttontanggalakhir = findViewById(R.id.button_tanggal_akhir); textView = findViewById(R.id.textView); buttontanggalawal.setOnClickListener(v -> { DatePickerFragment datePicker = DatePickerFragment.newInstance(DatePickerFragment.TYPE_START); datePicker.show(getSupportFragmentManager(), "date_picker_start"); }); buttontanggalakhir.setOnClickListener(v -> { DatePickerFragment datePicker = DatePickerFragment.newInstance(DatePickerFragment.TYPE_END); datePicker.show(getSupportFragmentManager(), "date_picker_end"); }); } @Override public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month); c.set(Calendar.DAY_OF_MONTH, dayOfMonth); // 格式化日期为yyMMdd格式 String formattedDate = dateFormat.format(c.getTime()); // 根据选择器类型处理 if (view.getId() == DatePickerFragment.TYPE_START) { startDateStr = formattedDate; buttontanggalawal.setText(formattedDate); } else if (view.getId() == DatePickerFragment.TYPE_END) { endDateStr = formattedDate; buttontanggalakhir.setText(formattedDate); } // 两个日期都选完之后可以直接调用检索逻辑 if (startDateStr != null && endDateStr != null) { // 示例:调用你的检索方法 // query.startAt(startDateStr).endAt(endDateStr); textView.setText(String.format("检索区间:%s - %s", startDateStr, endDateStr)); } } }
注意事项
- SimpleDateFormat的月份要使用大写
MM,小写mm对应分钟,会出现格式错误 - 后续调用检索方法时直接使用成员变量
startDateStr和endDateStr即可
内容的提问来源于stack exchange,提问作者billy
相关产品推荐
相关产品推荐

