自定义时间选择器
来源:互联网 发布:小孩学英语口语软件 编辑:程序博客网 时间:2024/06/05 01:03
NumberPicker实现简单的时间选择器,代码如下:最近项目需要用到时间选择器,官方给的DatePicker和TimePicker有许多问题,没办法自己只好动手
实现效果图:
实现代码:
自定义时间选择器DateTimeDialog.java
package cn.zszh.customs.widget;import java.util.Calendar;import java.util.Locale;import android.content.Context;import android.graphics.Color;import android.os.Bundle;import android.view.Gravity;import android.view.View;import android.view.Window;import android.view.WindowManager;import android.widget.LinearLayout;import android.widget.NumberPicker;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;import cn.zszh.customs.widget.base.BaseDialog;/** * 自定义时间选择器 * @author Administrator * */public class DateTimeDialog extends BaseDialog{private Calendar mCalendar=Calendar.getInstance(Locale.CHINA);private NumberPicker mYearNumberPicker;//年private NumberPicker mMonthNumberPicker;//月private NumberPicker mDayNumberPicker;//日private NumberPicker mHourNumberPicker;//时private NumberPicker mMinuteNumberPicker;//分private NumberPicker[] mDatePickers={mYearNumberPicker,mMonthNumberPicker,mDayNumberPicker};private NumberPicker[] mTimePickers={mHourNumberPicker,mMinuteNumberPicker};private String[] dates={"年","月","日"};private String[] times={"时","分"};//保存当前选中的时间private int mSelectYear,mSelectMonth,mSelectDate,mSelectHour,mSelectMinute;private TextView mCancel;private TextView mOK;private OnClickListener mListener;//保存是否显示日期和时间private boolean mShowDate;private boolean mShowTime;public DateTimeDialog(Context context) {this(context,true,true);}public DateTimeDialog(Context context,boolean showDate,boolean showTime){super(context);mShowDate=showDate;mShowTime=showTime;mCreateView=initView();initData();initEvent();}@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置Dialog没有标题。需在setContentView之前设置,在之后设置会报错 this.requestWindowFeature(Window.FEATURE_NO_TITLE); //设置Dialog背景透明效果,必须设置一个背景,否则会有系统的Dialog样式:外部白框 this.getWindow().setBackgroundDrawableResource(android.R.color.transparent); setContentView(mCreateView);//添加视图布局 initLayout();} private void initLayout(){WindowManager.LayoutParams params=getWindow().getAttributes();params.width=mScreenWidth;params.gravity=Gravity.BOTTOM;getWindow().setAttributes(params);}private View initView() { LinearLayout group=new LinearLayout(mContext); LinearLayout.LayoutParams params=new LinearLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); group.setLayoutParams(params); group.setBackgroundColor(Color.BLACK); group.setOrientation(LinearLayout.VERTICAL);//设置垂直方向 //标题 RelativeLayout rl=new RelativeLayout(mContext);params=new LinearLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 60*mDensity); params.bottomMargin=1*mDensity;rl.setLayoutParams(params);rl.setBackgroundColor(Color.WHITE);group.addView(rl);mCancel=new TextView(mContext); RelativeLayout.LayoutParams rlParams=new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); rlParams.leftMargin=20*mDensity;rlParams.addRule(RelativeLayout.CENTER_VERTICAL);mCancel.setLayoutParams(rlParams); mCancel.setText("取消"); mCancel.setTextColor(Color.BLUE); mCancel.setTextSize(16); rl.addView(mCancel); TextView title=new TextView(mContext);rlParams=new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); rlParams.addRule(RelativeLayout.CENTER_IN_PARENT);//居中title.setLayoutParams(rlParams);title.setText("请选择时间");title.setTextColor(Color.BLUE); title.setTextSize(16); rl.addView(title); mOK=new TextView(mContext); rlParams=new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); rlParams.rightMargin=20*mDensity;rlParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT );rlParams.addRule(RelativeLayout.CENTER_VERTICAL );mOK.setLayoutParams(rlParams); mOK.setText("确定"); mOK.setTextColor(Color.BLUE); mOK.setTextSize(16); rl.addView(mOK); //设置内容 RelativeLayout rlContent=new RelativeLayout(mContext);params=new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, mScreenHeight/3); rlContent.setLayoutParams(params);rlContent.setBackgroundColor(Color.WHITE);group.addView(rlContent);LinearLayout ll=new LinearLayout(mContext); rlParams=new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); rlParams.addRule(RelativeLayout.CENTER_IN_PARENT);ll.setLayoutParams(rlParams); ll.setOrientation(LinearLayout.HORIZONTAL);//设置水平方向 rlContent.addView(ll); //设置Date部分LinearLayout mDate=new LinearLayout(mContext); params=new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);params.gravity=Gravity.CENTER_VERTICAL;mDate.setLayoutParams(params); mDate.setBackgroundColor(Color.WHITE); mDate.setOrientation(LinearLayout.HORIZONTAL);//设置水平方向 ll.addView(mDate); if(mShowDate)//显示日期选择器for(int i=0;i<mDatePickers.length;i++){params=new LinearLayout.LayoutParams( 50*mDensity, LinearLayout.LayoutParams.WRAP_CONTENT);if(i!=0)params.width=30*mDensity;params.gravity=Gravity.CENTER_VERTICAL;mDatePickers[i]=new NumberPicker(mContext);mDatePickers[i].setLayoutParams(params);mDate.addView(mDatePickers[i]);params=new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);params.gravity=Gravity.CENTER_VERTICAL;params.leftMargin=5*mDensity;params.rightMargin=5*mDensity;TextView textview=new TextView(mContext);textview.setText(dates[i]);textview.setLayoutParams(params);mDate.addView(textview);}//设置Time部分LinearLayout mTime=new LinearLayout(mContext); params=new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);params.gravity=Gravity.CENTER_VERTICAL;mTime.setLayoutParams(params); mTime.setBackgroundColor(Color.WHITE); mTime.setOrientation(LinearLayout.HORIZONTAL);//设置水平方向 ll.addView(mTime); if(mShowTime)//显示时间选择器for(int i=0;i<mTimePickers.length;i++){params=new LinearLayout.LayoutParams( 30*mDensity, LinearLayout.LayoutParams.WRAP_CONTENT);params.gravity=Gravity.CENTER_VERTICAL;mTimePickers[i]=new NumberPicker(mContext);mTimePickers[i].setLayoutParams(params);mTime.addView(mTimePickers[i]);params=new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);params.gravity=Gravity.CENTER_VERTICAL;params.leftMargin=5*mDensity;params.rightMargin=5*mDensity;TextView textview=new TextView(mContext);textview.setText(times[i]);textview.setLayoutParams(params);textview.setGravity(Gravity.CENTER);mTime.addView(textview);}return group; } public void initData(){//关联mYearNumberPicker=mDatePickers[0];mMonthNumberPicker=mDatePickers[1];mDayNumberPicker=mDatePickers[2];mHourNumberPicker=mTimePickers[0];mMinuteNumberPicker=mTimePickers[1];//年if(mYearNumberPicker!=null){mYearNumberPicker.setMaxValue(2050);mYearNumberPicker.setMinValue(1900);mSelectYear=mCalendar.get(Calendar.YEAR);mYearNumberPicker.setValue(mSelectYear);}//月if(mMonthNumberPicker!=null){mMonthNumberPicker.setMinValue(1);mMonthNumberPicker.setMaxValue(12);mSelectMonth=mCalendar.get(Calendar.MONTH)+1;mMonthNumberPicker.setValue(mSelectMonth);}//日if(mDayNumberPicker!=null){mDayNumberPicker.setMinValue(1);int maxDayNumber=mCalendar.getActualMaximum(Calendar.DATE);//获得当月最大值mDayNumberPicker.setMaxValue(maxDayNumber);mSelectDate=mCalendar.get(Calendar.DATE);mDayNumberPicker.setValue(mSelectDate);}//时if(mHourNumberPicker!=null){mHourNumberPicker.setMinValue(0);mHourNumberPicker.setMaxValue(23);mSelectHour=mCalendar.get(Calendar.HOUR_OF_DAY);// 得到24小时机制 mHourNumberPicker.setValue(mSelectHour);}//分if(mMinuteNumberPicker!=null){mMinuteNumberPicker.setMinValue(0);mMinuteNumberPicker.setMaxValue(59);mSelectMinute=mCalendar.get(Calendar.MINUTE);mMinuteNumberPicker.setValue(mSelectMinute);}}private void initEvent(){//年if(mYearNumberPicker!=null)mYearNumberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {public void onValueChange(NumberPicker picker, int oldVal, int newVal) {mSelectYear=newVal;mCalendar.set(Calendar.YEAR, mSelectMonth);//设置日历选择的年份int maxDayNumber=mCalendar.getActualMaximum(Calendar.DATE);mDayNumberPicker.setMaxValue(maxDayNumber);}});//月if(mMonthNumberPicker!=null)mMonthNumberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {public void onValueChange(NumberPicker picker, int oldVal, int newVal) {mSelectMonth=newVal;mCalendar.set(Calendar.MONTH, mSelectMonth-1);//设置日历选择的月份int maxDayNumber=mCalendar.getActualMaximum(Calendar.DATE);mDayNumberPicker.setMaxValue(maxDayNumber);}});//日if(mDayNumberPicker!=null)mDayNumberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {public void onValueChange(NumberPicker picker, int oldVal, int newVal) {mSelectDate=newVal;}});//时if(mHourNumberPicker!=null)mHourNumberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {public void onValueChange(NumberPicker picker, int oldVal, int newVal) {mSelectHour=newVal;}});//分if(mMinuteNumberPicker!=null)mMinuteNumberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {public void onValueChange(NumberPicker picker, int oldVal, int newVal) {mSelectMinute=newVal;}});//取消mCancel.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {cancel();}});//确定mOK.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {Toast.makeText(mContext, getDateTime(), Toast.LENGTH_SHORT).show();if(mListener!=null)//将时间值提供给需要者mListener.onClick(mCalendar,getDateTime(),getSelectState());cancel();}});}public String getDateTime(){return mSelectYear+"年"+String.format("%02d", mSelectMonth)+"月"+String.format("%02d", mSelectDate)+"日 "+String.format("%02d", mSelectHour)+"时"+String.format("%02d", mSelectMinute)+"分";}/** * 获取选中的时间值的接口 * @author zszh */public interface OnClickListener {void onClick(Calendar calendar,String dateTime,int selectState);}public void setOnClickListener(OnClickListener listener){mListener=listener;}/** * 返回选择的时间戳,与当前时间的大小 * @return -1表示以前,0表示今天,1表示以后 */private int getSelectState(){Calendar calendar=Calendar.getInstance(Locale.CHINA);//得到当前的时间int year=calendar.get(Calendar.YEAR);int month=calendar.get(Calendar.MONTH)+1;int date=calendar.get(Calendar.DATE);if(year==mSelectYear && month==mSelectMonth && date==mSelectDate){//今天return 0;}else if(mSelectYear==year && mSelectMonth==month && mSelectDate>date||mSelectYear==year && mSelectMonth>month ||mSelectYear>year){//以后return 1;}else{//以前return -1;}}}
基类BaseDialog.java
package cn.zszh.customs.widget.base; import android.app.Dialog; import android.content.Context; import android.util.DisplayMetrics; import android.view.KeyEvent;import android.view.View; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener;import android.view.animation.TranslateAnimation; public class BaseDialog extends Dialog{ public View mCreateView; public Context mContext; public int mScreenWidth;//屏幕宽 public int mScreenHeight;//屏幕高 public int mDensity;//单位像素 public Animation mExitAnim;//退出动画 public Animation mEnterAnim;//进入动画 public BaseDialog(Context context) { super(context); init(context); } private void init(Context context) { mContext=context; //计算屏幕的宽高像素 DisplayMetrics metrics=mContext.getResources().getDisplayMetrics(); mScreenHeight=metrics.heightPixels; mScreenWidth=metrics.widthPixels; mDensity=(int) metrics.density; } @Override public void show() { super.show(); enterAnimation();//进入动画 } /** * 进入动画 */ private void enterAnimation(){ if(mEnterAnim==null){ mEnterAnim=new TranslateAnimation(1, 0, 1, 0, 1, 1, 1, 0); mEnterAnim.setDuration(500); } mCreateView.startAnimation(mEnterAnim); } /** * 退出动画 */ private void exitAnimation(){ if(mExitAnim==null){ mExitAnim=new TranslateAnimation(1, 0, 1, 0, 1, 0, 1, 1); mExitAnim.setDuration(500); mExitAnim.setAnimationListener( new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { dismissDialog(); //动画完成执行关闭 } }); } mCreateView.startAnimation(mExitAnim); } /** * 执行关闭 */ private void dismissDialog() { super.dismiss(); } /** * 执行动画 */ @Override public void dismiss() { exitAnimation(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { dismiss(); } return super.onKeyDown(keyCode, event); } }
好了,代码到此完成
阅读全文
0 0
- 自定义日期时间选择器
- NumberPicker自定义时间选择器
- Android 自定义时间选择器
- 自定义时间选择器
- android自定义时间选择器
- Android自定义时间选择器
- 自定义时间选择器DatePicker
- 自定义时间选择器
- 自定义时间选择器
- 自定义时间选择器
- 自定义日期时间选择器
- Android自定义时间选择器
- 自定义时间选择器
- 自定义时间选择器RZDatePickerView
- 自定义时间选择器UIPickerView
- 一个自定义时间选择器
- 自定义时间选择器
- 自定义时间选择器
- haoop集群的网络配置
- 在ShareLatex中使用中文
- 第4周项目4
- Java两圆是否重叠
- 第四周作业:上机练习2类与对象
- 自定义时间选择器
- 最近在做一个关于颜色色差的项目,自己动手做了一个
- 欢迎使用CSDN-markdown编辑器
- 算法总结与思考(一)
- Linux练习
- JS全局函数
- Spring学习--JDBC
- Spring Boot第六弹:Spring Boot之静态内容
- SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解