您的位置:首页 > 移动开发 > Android开发

DateTimePicker改写学习

2015-11-22 15:19 453 查看
这两天自己在做项目的时候需要用到时间选择器,但系统自带的日期选择器和时间选择器是分开的,不太符合我想要的东西,,所以作为一个新手自然就是找找看有没有demo可以拿来参照学习改改啦~~

像这种日期和时间做在一起的例子网上还是不少的,但是找下来有些总是要自己改改。。这些都是废话啦,我写这篇博客主要是想要记录一下我所遇到的问题。

网上找的demo里这6个文件基本上是不用动了 ,如果是要改样式的话就要自定义shape还有layer-list进去wheelview里面改咯



由于人家的demo都是把年月日时分这些初始化和监听事件写在了mainactivity里,所以我就想要自己把它们搞到一个类里面,做成像工具类那样的。


就直接这么调用就可以了



这个是ShowDTPicker 的代码-----这边是没有问题的代码
package com.kaka.picker.activity;

import java.util.Calendar;

import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.Toast;
import android.widget.PopupWindow.OnDismissListener;

import com.kaka.picker.widget.NumericWheelAdapter;
import com.kaka.picker.widget.OnWheelChangedListener;
import com.kaka.picker.widget.WheelView;
import com.kakal.datetimepicker.R;

public class ShowDTPicker {
Context context;
private PopupWindow menuWindow;
private LayoutInflater inflater = null;
private WheelView year;
private WheelView month;
private WheelView day;
private WheelView hour;
private WheelView mins;

private int curYear;
private int curMonth;
private int curDate;
private int curHour;
private int curMins;

private int changeYear;
private int changeMonth;

public ShowDTPicker(Context context) {
// TODO Auto-generated constructor stub
this.context = context;
inflater = LayoutInflater.from(context);
}

/**
* 初始化popupWindow
*
* @param view
*/
public void showPopwindow() {
View view = getTimePick();
menuWindow = new PopupWindow(view, LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT);
menuWindow.setFocusable(true);
menuWindow.setBackgroundDrawable(new BitmapDrawable());
menuWindow.showAtLocation(view, Gravity.CENTER_HORIZONTAL, 0, 0);
menuWindow.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
menuWindow = null;
}
});
}

/**
*
* @return
*/
private View getTimePick() {

Calendar c = Calendar.getInstance();
curYear = c.get(Calendar.YEAR);
curMonth = c.get(Calendar.MONTH) + 1;
curDate = c.get(Calendar.DATE);
curHour = c.get(Calendar.HOUR_OF_DAY);
curMins = c.get(Calendar.MINUTE);
changeYear = curYear;
changeMonth = curMonth;
View view = inflater.inflate(R.layout.timepick, null);
year = (WheelView) view.findViewById(R.id.year);
year.setAdapter(new NumericWheelAdapter(curYear, curYear + 20));
year.setLabel("年");
year.setCyclic(false);
year.addChangingListener(changedListener);
month = (WheelView) view.findViewById(R.id.month);
month.setAdapter(new NumericWheelAdapter(1, 12));
month.setLabel("月");
month.setCyclic(false);
month.addChangingListener(changedListener);
day = (WheelView) view.findViewById(R.id.day);
day.setLabel("日");
day.setCyclic(false);

hour = (WheelView) view.findViewById(R.id.hour);
hour.setAdapter(new NumericWheelAdapter(0, 23));
hour.setLabel("时");
hour.setCyclic(false);

mins = (WheelView) view.findViewById(R.id.mins);
mins.setAdapter(new NumericWheelAdapter(00, 59, "%02d"));
mins.setLabel("分");
mins.setCyclic(false);

year.setCurrentItem(curYear);
month.setCurrentItem(curMonth - 1);
day.setCurrentItem(curDate - 1);
hour.setCurrentItem(curHour);
mins.setCurrentItem(curMins);

initDay(curYear, curMonth);
Button bt = (Button) view.findViewById(R.id.set);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String str = (year.getCurrentItem() + curYear) + "-"
+ (month.getCurrentItem() + 1) + "-"
+ (day.getCurrentItem() + 1) + "  "
+ hour.getCurrentItem() + ":" + mins.getCurrentItem();
Toast.makeText(context, str, Toast.LENGTH_LONG).show();
menuWindow.dismiss();
}
});
Button cancel = (Button) view.findViewById(R.id.cancel);
cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
menuWindow.dismiss();
}
});

return view;
}

OnWheelChangedListener changedListener = new OnWheelChangedListener() {

@Override
public void onChanged(WheelView wheel, int oldValue, int newValue) {
switch (wheel.getId()) {
case R.id.year:
changeYear = newValue + curYear;
break;
case R.id.month:
changeMonth = newValue + 1;
break;
default:
break;
}
initDay(changeYear, changeMonth);
}
};

/**
*
* @param year
* @param month
* @return
*/
private int getDay(int year, int month) {
int day = 30;
boolean flag = false;
switch (year % 4) {
case 0:
flag = true;
break;
default:
flag = false;
break;
}
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 2:
day = flag ? 29 : 28;
break;
default:
day = 30;
break;
}
System.out.println(day);
return day;
}

/**
*
* @param changeYear
* @param changeMonth
*/
private void initDay(int changeYear, int changeMonth) {
day.setAdapter(new NumericWheelAdapter(1, getDay(changeYear,
changeMonth), "%02d"));
System.out.println(getDay(changeYear, changeMonth));
}
}


最终修改后的结果就是





主要遇到的问题在这里

但是如果我把代码改一下


改成



就是不再通过那个View 直接把getTimePick放进去结果就是 选择不同月份的时候 日 不会再改变,返回回来的日期就是弹窗弹出来的日期 不管选择什么日期都不会改变。

就像这样。。。。!





会出现这个问题的原因在于:

如果直接填getTimePick(),那么menuWindow在实例化的时候和showAtLocation的时候两个view是不一样的

所以要在前面使用一个View来接收,这样子设置进去的view才是同一个.

本文链接:http://blog.csdn.net/lang523493505/article/details/49978051
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息