以前一直都是用系统提供的日期选择控件,然后开发项目需要需要隐藏年月日等不同的组合。然后就从网上找了些Demo用,项目完成之后测试人员选择系统不同的年月日显示方式引起年月日显示的错位,卧槽!后来随之了解5.0以下的和以上的执行方式也不一样 ,只得改了,改完赶紧记录一下。
TimeDialog
public class TimeDialog extends Dialog { private DatePicker datePicker; private int type = 3; //1表示只显示年; 2表示显示年月 ;3表示显示年月日 //设置监听 时间 public interface myTimeListener{ public void timeListener(String time) ; }; public myTimeListener iTimeListener = null ; public void setTimeListener(myTimeListener listener) { iTimeListener = listener; } /* 1表示只显示年; 2表示显示年月 ;3表示显示年月日 */ public TimeDialog(Context context) { super(context); // TODO Auto-generated constructor stub setContentView(R.layout.time_dialog); initView(); } /* 1表示只显示年; 2表示显示年月 ;3表示显示年月日 */ public TimeDialog(Context context, int theme, int type) { super(context, theme); // TODO Auto-generated constructor stub setContentView(R.layout.time_dialog); this.type = type; initView(); } /** *传入一个DatePicker对象,隐藏或者显示相应的时间项 */ private void hidePicker() { // 利用java反射技术得到picker内部的属性,并对其进行操作 Class<? extends DatePicker> c = datePicker.getClass(); try { Field fd = null, fm = null, fy = null; // 系统版本大于5.0 if (Build.VERSION.SDK_INT >= 5) { int daySpinnerId = Resources.getSystem().getIdentifier("day", "id", "android"); int monthSpinnerId = Resources.getSystem().getIdentifier("month", "id", "android"); // int yearSpinnerId = Resources.getSystem().getIdentifier("year", "id", "android"); //隐藏日 if (daySpinnerId != 0) { View daySpinner = datePicker.findViewById(daySpinnerId); if (daySpinner != null) { daySpinner.setVisibility(View.GONE); return; } } //隐藏月 if(type == 1){ if (daySpinnerId != 0) { View monthSpinner = datePicker.findViewById(monthSpinnerId); if (monthSpinner != null) { monthSpinner.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(datePicker); View vm = (View) fm.get(datePicker); View vy = (View) fy.get(datePicker); if (type == 2) { vd.setVisibility(View.GONE); vm.setVisibility(View.VISIBLE); vy.setVisibility(View.VISIBLE); } else if (type == 1) { vd.setVisibility(View.GONE); vm.setVisibility(View.GONE); vy.setVisibility(View.VISIBLE); }else { vd.setVisibility(View.VISIBLE); vm.setVisibility(View.VISIBLE); vy.setVisibility(View.VISIBLE); } } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } private void initView(){ datePicker = (DatePicker) findViewById(R.id.time_dialog_datepicker); if(type!=3) { hidePicker(); } findViewById(R.id.time_dialog_sure).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 回调 日期 iTimeListener.timeListener(datePicker.getYear() + "-" + (datePicker.getMonth() + 1) + "-" + datePicker.getDayOfMonth()); dismiss(); } }); } }主题样式放在values styles.xml里
<style name="MyDialog" > <item name="android:windowFrame">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">true</item> <item name="android:windowContentOverlay">@null</item> </style>
下面是调用显示
private void initView(){ final TextView timeshow= (TextView) findViewById(R.id.ID_SHOW_TIME); /* 1表示只显示年; 2表示显示年月 ;3表示显示年月日 得到的time是返回日的,得自己出来 */ final TimeDialog timeDialog=new TimeDialog(this,R.style.MyDialog,2); timeDialog.setTimeListener(new TimeDialog.myTimeListener() { @Override public void timeListener(String time) { timeshow.setText(time); timeDialog.dismiss(); } }); timeshow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { timeDialog.show(); } }); }Ok
