经常会有这样的需求,就是去隐藏年月日中的年或者日,下面我通过反射来达到这样的目的
现在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();
}