项目开发中 如果你需要一个年月日时分秒类型时间选择器 用DataPicker和TimePicker联动去实现得话 会非常得不方便 会碰到布局不协调得问题 灵活性很低 可实现的布局也就两种 所以为了更好的效果 个人建议你使用 numberPicker 数字选择器 去实现 本人思路是 numberpicker结合PopupWindow 去实现 简单实现代码奉上 欢迎各位大神指正
第一步 popupwindow 的布局效果(底部有图)及xml文件
可根据自己得需要布局 底部效果图 是本案样例
第二步 自定义PopupWindow java 代码
public SPopupWindow(Context context, View.OnClickListener clickListener){
// 填充试图 实例化空间
this.view = LayoutInflater.from(context).inflate(R.layout.popupwindow,null);
day = (NumberPicker) view.findViewById(R.id.day);
hour = (NumberPicker) view.findViewById(R.id.hour);
minte = (NumberPicker) view.findViewById(R.id.minte);
time = (NumberPicker) view.findViewById(R.id.time);
quxiao = (Button) view.findViewById(R.id.quxiao);
year = (NumberPicker) view.findViewById(R.id.year);
month = (NumberPicker) view.findViewById(R.id.month);
// 按钮点击事件
this.setOutsideTouchable(true);
quxiao.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
queren = (Button) view.findViewById(R.id.queren);
queren.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int yearValue = year.getValue();
int monthValue = month.getValue();
int dayValue = day.getValue();
int timeValue = time.getValue();
int hourValue = hour.getValue();
int minteValue = minte.getValue();
String time = ""+yearValue+monthValue+dayValue+timeValue+hourValue+minteValue;
if (onClickButton!=null){
onClickButton.OnClickButton(time);
}
dismiss();
}
});
this.view.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
int height = view.findViewById(R.id.pop_layout).getTop();
int y = (int) event.getY();
if (event.getAction() == MotionEvent.ACTION_UP) {
if (y < height) {
dismiss();
}
}
return true;
}
});
/* 设置弹出窗口特征 */
// 设置视图
this.setContentView(this.view);
// 设置弹出窗体的宽和高
this.setHeight(RelativeLayout.LayoutParams.WRAP_CONTENT);
this.setWidth(RelativeLayout.LayoutParams.MATCH_PARENT);
// 设置弹出窗体可点击
this.setFocusable(true);
// 实例化一个ColorDrawable颜色为半透明
ColorDrawable dw = new ColorDrawable(0xb0000000);
// 设置弹出窗体的背景
this.setBackgroundDrawable(dw);
// 获取当前时间 取出年月日时分 作为当前得时间基点
long t = System.currentTimeMillis();
SimpleDateFormat df1 = new SimpleDateFormat("yyyy");
SimpleDateFormat df2 = new SimpleDateFormat("MM");
SimpleDateFormat df3 = new SimpleDateFormat("dd");
SimpleDateFormat df4 = new SimpleDateFormat("HH");
SimpleDateFormat df5 = new SimpleDateFormat("mm");
String y = df1.format(t);
final String m = df2.format(t);
final String d = df3.format(t);
final String h = df4.format(t);
final String mi = df5.format(t);
Log.d("tag", "SPopupWindow: BBB---"+y+m+d+h+mi);
final String[] noons = {"上午","下午"};
day.setMaxValue(31);
day.setMinValue(1);
time.setDisplayedValues(noons);
day.setValue(Integer.valueOf(d));
time.setMaxValue(noons.length-1);
time.setMinValue(0);
time.setValue(0);
hour.setMaxValue(12);
hour.setMinValue(1);
hour.setValue(Integer.valueOf(h));
minte.setMaxValue(60);
minte.setMinValue(1);
minte.setValue(Integer.valueOf(mi));
year.setMinValue(Integer.valueOf(y));
year.setMaxValue(Integer.valueOf(y)+20);
year.setValue(Integer.valueOf(y));
month.setMinValue(1);
month.setMaxValue(12);
month.setValue(Integer.valueOf(m));
// numberpicker 内容的变化监听 时间得逻辑处理可在此处
day.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
Log.d(“tt”, “onValueChange: day–>”+newVal);
day.setValue(newVal);
if (oldVal!=newVal){
hour.setValue(1);
}else {
hour.setValue(Integer.valueOf(h));
}
}
});
time.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
Log.d(“tt”, “onValueChange: tiem–>”+noons[newVal].toString());
time.setValue(newVal);
}
});
hour.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
Log.d("tt", "onValueChange: hour-->"+ newVal);
hour.setValue(newVal);
if (oldVal!=newVal){
minte.setValue(1);
}else {
minte.setValue(Integer.valueOf(mi));
}
}
});
minte.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
}
});
month.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
month.setValue(newVal);
if (oldVal!=newVal){
day.setValue(1);
}else {
day.setValue(Integer.valueOf(d));
}
}
});
year.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
year.setValue(newVal);
if (oldVal!= newVal){
month.setValue(1);
}else {
month.setValue(Integer.valueOf(m));
}
}
});
}
// 定义按钮得点击接口
public interface OnClickButton{
void OnClickButton(String s);
}
// 设置按钮点击方法
public void setOnCilckButton(OnClickButton onClickButton){
this.onClickButton= onClickButton;
}
第三步 在需要activity 中实例化popupwindow 并调用
takePhotoPopWin = new SPopupWindow(this,this);
// 设置Popupwindow显示位置(从底部弹出)
takePhotoPopWin.showAtLocation(findViewById(R.id.main_view), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0);
params = getWindow().getAttributes();
//当弹出Popupwindow时,背景变半透明
params.alpha=0.7f;
getWindow().setAttributes(params);
//设置Popupwindow关闭监听,当Popupwindow关闭,背景恢复1f
takePhotoPopWin.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
params = getWindow().getAttributes();
params.alpha=1f;
getWindow().setAttributes(params);
}
});
takePhotoPopWin.setOnCilckButton(new SPopupWindow.OnClickButton() {
@Override
public void OnClickButton(String s) {
Log.d(“tt”, “OnClickButton:———– “+s);
text.setText(s);
}
效果图
});
xml布局效果
此时 属于你自己的时间选择器 就完成了 超级简单
喜欢得可以点个赞
下载链接 http://download.csdn.net/download/naide_s/9992028