最近使用了DatePicker 這個控件,採用的是往上又一次分裝的這種,就是兩個卡片切換選擇年月日和時間。
有一個需求時這個選擇器不顯示出來“天”的這個選項。查資料發現,有人做了實現,具體代碼還沒弄清楚,可以研究DatePicker源碼,這裏主要是根據反射原理獲取到DatePicker中的一些域,同時代碼獲取到佈局,然後在進行操作,如:修改分割線顏色,隱藏某一個域等。這裏做一個記錄,方便後續使用。
創建對象是調用方法:
/**
* 隱藏“天”
* @param mDatePicker
*/
private void hideDay(DatePicker mDatePicker) {
try {
/* 處理android5.0以上的特殊情況 */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
if (daySpinnerId != 0) {
View daySpinner = mDatePicker.findViewById(daySpinnerId);
if (daySpinner != null) {
daySpinner.setVisibility(View.GONE);
}
}
} else {
Field[] datePickerfFields = mDatePicker.getClass().getDeclaredFields();
for (Field datePickerField : datePickerfFields) {
if ("mDaySpinner".equals(datePickerField.getName()) || ("mDayPicker").equals(datePickerField.getName())) {
datePickerField.setAccessible(true);
Object dayPicker = new Object();
try {
dayPicker = datePickerField.get(mDatePicker);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
((View) dayPicker).setVisibility(View.GONE);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
這個方法就可以完成需求的操作。由此方法也能衍生出“月”,“年”等不同項的操作,這幾個操作沒有詳細瞭解,待後續研究。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
if (daySpinnerId != 0) {
View daySpinner = dp_mes.findViewById(daySpinnerId);
if (daySpinner != null) {
daySpinner.setVisibility(View.GONE);
}
}
int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android");
if (monthSpinnerId != 0) {
View monthSpinner = dp_mes.findViewById(monthSpinnerId);
if (monthSpinner != null) {
monthSpinner.setVisibility(View.VISIBLE);
}
}
int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android");
if (yearSpinnerId != 0) {
View yearSpinner = dp_mes.findViewById(yearSpinnerId);
if (yearSpinner != null) {
yearSpinner.setVisibility(View.GONE);
}
}
} else { //Older SDK versions
Field f[] = dp_mes.getClass().getDeclaredFields();
for (Field field : f) {
if (field.getName().equals("mDayPicker") || field.getName().equals("mDaySpinner")) {
field.setAccessible(true);
Object dayPicker = null;
try {
dayPicker = field.get(dp_mes);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
((View) dayPicker).setVisibility(View.GONE);
}
if (field.getName().equals("mMonthPicker") || field.getName().equals("mMonthSpinner")) {
field.setAccessible(true);
Object monthPicker = null;
try {
monthPicker = field.get(dp_mes);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
((View) monthPicker).setVisibility(View.VISIBLE);
}
if (field.getName().equals("mYearPicker") || field.getName().equals("mYearSpinner")) {
field.setAccessible(true);
Object yearPicker = null;
try {
yearPicker = field.get(dp_mes);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
((View) yearPicker).setVisibility(View.GONE);
}
}
}
}