一、基本介紹
在Android應用開發中,日期選擇器是一個非常常用的組件,可以讓用戶方便地選擇日期。本文將介紹如何使用Android官方提供的DatePicker控件實現日期選擇器。
二、DatePicker控件的基本用法
在XML布局文件中添加DatePicker控件:
<DatePicker
android:id="@+id/datePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
在Java代碼中獲取DatePicker控件並設置其監聽器:
DatePicker datePicker = findViewById(R.id.datePicker);
datePicker.init(year, monthOfYear, dayOfMonth, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
// 當用戶改變DatePicker控件中的日期時觸發此方法
}
});
其中year、monthOfYear和dayOfMonth分別表示DatePicker控件初始化時顯示的年、月、日。
三、DatePicker控件的擴展用法
1、設置日期範圍
使用DatePicker控件時,可以通過setMinDate()和setMaxDate()方法設置可以選擇的日期範圍。例如,以下代碼設置只能選擇當前日期之後的日期:
DatePicker datePicker = findViewById(R.id.datePicker);
datePicker.setMinDate(System.currentTimeMillis() - 1000);
其中,System.currentTimeMillis()-1000表示當前時間減去1秒。
2、自定義日期格式
DatePicker控件默認顯示的日期格式為“月/日/年”,可以通過覆寫onTouchEvent()方法的方式實現自定義日期格式。例如,以下代碼實現顯示為“年-月-日”的日期格式:
DatePicker datePicker = findViewById(R.id.datePicker);
datePicker.init(year, monthOfYear, dayOfMonth, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
// 當用戶改變DatePicker控件中的日期時觸發此方法
}
@Override
public boolean onTouchEvent(MotionEvent event) {
try {
Field mDelegateField = datePicker.getClass().getDeclaredField("mDelegate");
mDelegateField.setAccessible(true);
Object delegateObj = mDelegateField.get(datePicker);
Class delegateClass = Class.forName("android.widget.DatePicker$DatePickerDelegate");
Method setCurrentViewMethod = delegateClass.getDeclaredMethod("setCurrentView", int.class);
setCurrentViewMethod.setAccessible(true);
setCurrentViewMethod.invoke(delegateObj, 0);
View datePickerChild = datePicker.getChildAt(0);
if (datePickerChild instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) datePickerChild;
int childCount = viewGroup.getChildCount();
for (int i = 0; i < childCount; i++) {
NumberPicker childPicker = (NumberPicker) viewGroup.getChildAt(i);
setNumberPicker(childPicker);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
});
private void setNumberPicker(NumberPicker pickerView) {
Field[] pickerFields = NumberPicker.class.getDeclaredFields();
for (Field field : pickerFields) {
if (field.getName().equals("mInputText")) {
field.setAccessible(true);
try {
((EditText) field.get(pickerView)).setFilters(new InputFilter[0]);
break;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
List rawList = new ArrayList();
try {
Calendar calendar = Calendar.getInstance();
calendar.setTime(simpleDateFormat.parse("1970-01-01"));
for (int i = 0; i < pickerView.getMaxValue(); i++) {
rawList.add(simpleDateFormat.format(calendar.getTime()));
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
String[] displayedValues = new String[rawList.size()];
displayedValues = rawList.toArray(displayedValues);
pickerView.setMinValue(0);
pickerView.setDisplayedValues(displayedValues);
pickerView.setMaxValue(displayedValues.length - 1);
int year = Integer.parseInt(displayedValues[pickerView.getValue()].substring(0, 4));
int month = Integer.parseInt(displayedValues[pickerView.getValue()].substring(5, 7)) - 1;
int day = Integer.parseInt(displayedValues[pickerView.getValue()].substring(8));
datePicker.init(year, month, day, this);
} catch (ParseException e) {
e.printStackTrace();
}
}
四、總結
DatePicker控件在Android應用開發中是一個非常實用和基礎的控件,可以通過設置日期範圍和自定義日期格式等方式適應不同的需求。本文通過實例講解了DatePicker控件的基本用法和擴展用法,希望對讀者有所幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/229225.html