DateTimePicker改写学习

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

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

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


由于人家的demo都是把年月日时分这些初始化和监听事件写在了mainactivity里,所以我就想要自己把它们搞到一个类里面,做成像工具类那样的。我也比较随便点,就把我自己写的那个showDTPicker放在activity那个包里了
就直接这么调用就可以了
这里写图片描述

这个是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放进去结果就是 选择不同月份的时候 日 不会再改变,返回回来的日期就是弹窗弹出来的日期 不管选择什么日期都不会改变。
就像这样。。。。!
12月居然只有30天,明显数据没有更新过去,就好像没有了监听一样
这里写图片描述

会出现这个问题的原因在于:
如果直接填getTimePick(),那么menuWindow在实例化的时候和showAtLocation的时候两个view是不一样的

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

本文链接:http://blog.csdn.net/lang523493505/article/details/49978051

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hrx-@@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值