經常會有這樣的需求,就是去隱藏年月日中的年或者日,下面我通過反射來達到這樣的目的
現在5.0以上的也需要去單獨判斷一下,有的寫5.0的Build.VERSION_CODES出現錯誤的話,建議直接寫成數字
/**
* @param picker 傳入一個DatePicker對象,隱藏或者顯示相應的時間項
*/
public static void hidePicker(DatePicker picker) {
// 利用java反射技術得到picker內部的屬性,並對其進行操作
Class<? extends DatePicker> c = picker.getClass();
try {
Field fd = null, fm = null, fy = null;
// 系統版本大於5.0
if (Build.VERSION.SDK_INT >= TELVERSION) {
int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android");
if (daySpinnerId != 0) {
View daySpinner = picker.findViewById(daySpinnerId);
if (daySpinner != null) {
daySpinner.setVisibility(View.GONE);
return;
}
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
// 系統版本大於4.0
fd = c.getDeclaredField("mDaySpinner");
fm = c.getDeclaredField("mMonthSpinner");
fy = c.getDeclaredField("mYearSpinner");
} else {
fd = c.getDeclaredField("mDayPicker");
fm = c.getDeclaredField("mMonthPicker");
fy = c.getDeclaredField("mYearPicker");
}
// 對字段獲取設置權限
fd.setAccessible(true);
fm.setAccessible(true);
fy.setAccessible(true);
// 得到對應的控件
View vd = (View) fd.get(picker);
View vm = (View) fm.get(picker);
View vy = (View) fy.get(picker);
vd.setVisibility(View.GONE);
vm.setVisibility(View.VISIBLE);
vy.setVisibility(View.VISIBLE);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}