Android开发之轻松打造DatePickterDialog可自由选择显示Day或者隐藏
2017-03-07 15:13
417 查看
先上效果图:
源码已上传到码云:https://git.oschina.net/osczaizai/AndroidDemo
更多开发分享请移步:http://cherylgood.cn/c/Android开发之轻松打造DatePickterDialog可自由选择显示Day或者隐藏.php
通过反射将datepickter里面的dayView隐藏,增加了几个接口
布局文件:
点击打开链接
源码已上传到码云:https://git.oschina.net/osczaizai/AndroidDemo
更多开发分享请移步:http://cherylgood.cn/c/Android开发之轻松打造DatePickterDialog可自由选择显示Day或者隐藏.php
通过反射将datepickter里面的dayView隐藏,增加了几个接口
package guanaj.com.easydatepickerdialog; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; import android.os.Build; import android.os.Bundle; import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.DatePicker; import java.lang.reflect.Field; import java.util.Calendar; /** * Created by guanaj on 2017/3/7. */ class EasyDatePickerDialog extends AlertDialog implements DialogInterface.OnClickListener, DatePicker.OnDateChangedListener { private static final String YEAR = "year"; private static final String MONTH = "month"; private static final String DAY = "day"; private final DatePicker mDatePicker; private final OnDateSetListener mDateSetListener; private final Calendar mCalendar; private boolean mHidDay =false; private Context mContext; public interface OnDateSetListener { void onDateSet(DatePicker startDatePicker, int startYear, int startMonthOfYear, int startDayOfMonth); } private boolean mTitleNeedsUpdate = true; public EasyDatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth,boolean hidDay) { this(context, 0, callBack, year, monthOfYear, dayOfMonth,hidDay); } public EasyDatePickerDialog(Context context, int theme, OnDateSetListener listener, int year, int monthOfYear, int dayOfMonth,boolean hidDay) { super(context, theme); mDateSetListener = listener; mCalendar = Calendar.getInstance(); mHidDay = hidDay; mContext = getContext(); final LayoutInflater inflater = LayoutInflater.from(mContext); final View view = inflater.inflate(R.layout.easydatepickterview, null); setButton(BUTTON_POSITIVE, "确定", this); setButton(BUTTON_NEGATIVE, "取消", this); //setIcon(0); //移除按钮效果 setView(view); mDatePicker = (DatePicker) view.findViewById(R.id.easydatePicker); mDatePicker.init(year, monthOfYear, dayOfMonth, this); if (hidDay) { hideDayView(mDatePicker); } } private void hideDayView(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(); } } @Override public void onDateChanged(DatePicker view, int year, int month, int day) { if (view.getId()==R.id.easydatePicker) { mDatePicker.init(year, month, day, this); //可根据需要在此处更新title } } @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case BUTTON_POSITIVE: if (mDateSetListener != null) { // Clearing focus forces the dialog to commit any pending // changes, e.g. typed text in a NumberPicker. mDatePicker.clearFocus(); mDateSetListener.onDateSet(mDatePicker, mDatePicker.getYear(), mDatePicker.getMonth(), mDatePicker.getDayOfMonth()); } break; case BUTTON_NEGATIVE: cancel(); break; } } public DatePicker getDatePicker() { return mDatePicker; } public void updateDate(int year, int monthOfYear, int dayOfMonth) { mDatePicker.updateDate(year, monthOfYear, dayOfMonth); } @Override public Bundle onSaveInstanceState() { final Bundle state = super.onSaveInstanceState(); state.putInt(YEAR, mDatePicker.getYear()); state.putInt(MONTH, mDatePicker.getMonth()); state.putInt(DAY, mDatePicker.getDayOfMonth()); return state; } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); final int year = savedInstanceState.getInt(YEAR); final int month = savedInstanceState.getInt(MONTH); final int day = savedInstanceState.getInt(DAY); mDatePicker.init(year, month, day, this); } public void setMaxDate(int year,int month,int day){ mCalendar.set(year,month-1,day); mDatePicker.setMaxDate(mCalendar.getTimeInMillis()); } public void setMinDate(int year,int month,int day){ mCalendar.set(year,month-1,day); mDatePicker.setMinDate(mCalendar.getTimeInMillis()); } }
布局文件:
点击打开链接
相关文章推荐
- Android开发之轻松打造DatePickterDialog可自由选择显示Day或者隐藏
- Android开发:自由选择TextView的文字
- Android开发:自由选择TextView的文字
- android——TextView默认文字开发时显示运行时隐藏
- Android 注册页面 设置显示或者隐藏密码 和 点击获取验证码倒计时60s
- login界面 checkbox选择显示或者隐藏密码
- Android开发:自由选择TextView的文字
- Xamarin 中开发Android实现全屏或者不显示标题栏的方法-宋兴柱
- Android开发软键盘的隐藏和显示
- Android打造带删除的EditText并且实现输入框密码显示、隐藏
- iOS开发上下滑动UIScrollview隐藏或者显示导航栏
- Android 程式开发:(九)使用活动栏 —— 9.1隐藏或显示ActionBar
- Android开发每次都需要按一个退格键或者回车才能显示出我edittext控件里面的内容
- android开发隐藏和显示密码
- Android开发:自由选择TextView的文字
- Code maturity level options 代码成熟度选项 [*]Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择 我是开发者,所以选[*] Loadable module support 可加载模块支持 [*]Enable loadable module support 内核编译配置选项简介 (2.4.20-8
- android 开发 checkBox的显示和隐藏
- Android开发:输入法键盘的显示和隐藏
- Android开发 -- 控件的显示与隐藏 setVisibility View.VISIBLE View.INVISIBLE View.GONE
- 安卓开发中的双日期选择控件(可隐藏日,只显示年月)