Android自定义时间控件选择开始时间到结束时间

本文介绍了如何在Android中创建一个自定义时间控件,该控件允许用户选择开始和结束时间,并确保结束时间不早于当前时间,开始时间不早于结束时间且最早为2017年1月1日。文章提供了相关代码示例和bug修复方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文出自:http://blog.csdn.net/dt235201314/article/details/78678419

Android自定义时间控件选择开始时间到结束时间

Android自定义时间控件不可选择未来时间

一丶效果图


二丶概述

大概是去年的这个时候说要做一个关于时间控件的总结,到这会才开始。在整理demo时,发现直接上代码也无法由浅入深讲解,眨眼就是11月30号了,踩着11月份的尾巴,先来一篇,后面再补充。

三丶看代码

(1).需求分析

1.选择开始时间到结束时间

2.结束时间不能超过今天

3.开始时间不能超过结束时间

4.最早选择2017年1月1日

5.仿iOS(表示很无奈)


(2)看代码

首先是一个Dialog

DoubleTimeSelectDialog.java

public class DoubleTimeSelectDialog extends Dialog implements View.OnClickListener{

    private Context mContext;

    /**
     * 事件选取完毕监听
     */
    private OnDateSelectFinished onDateSelectFinished;
    /**
     * 开始、结束年份
     */
    private static int START_YEAR = 1990, END_YEAR = 2100;
    /**
     * 最大年龄
     */
    private final int LARGEST_AGE = 119;
    /**
     * 年
     */
    private WheelView mYearView;
    /**
     * 月
     */
    private WheelView mMonthView;
    /**
     * 日
     */
    private WheelView mDayView;
    /**
     * 时
     */
    private WheelView mHourView;
    /**
     * 分
     */
    private WheelView mMinuteView;
    /**
     * list列表(大月份)
     */
    private List<String> mListBig;
    /**
     * list列表(小月份)
     */
    private List<String> mListLittle;

    /* 是否只选择本年 */
    private boolean isOnlyThisYear = false;

    private boolean isShowMinute = false;
    /* 是否只选择本月 */
    private boolean isOnlyThisMonth = false;

    public static final String YEAR = "year";
    public static final String MONTH = "month";
    public static final String DAY = "day";
    private int year;
    private int month;
    private int day;
    private int hour;
    private int minute;

    private int curYear;
    private int curMonth;
    private int curDay;

    /**时间容器*/
    private LinearLayout mTimeContainerLl;
    /**开始时间*/
    private TextView mBeginTimeTv;
    /**结束时间*/
    private TextView mEndTimeTv;

    /**选择的开始时间*/
    private String mSelectStartTime;
    /**选择的结束时间*/
    private String mSelectEndTime;

    /**当前选择时间模式*/
    private TIME_TYPE mTimeType = TIME_TYPE.TYPE_START;

    /**最小时间*/
    private String allowedSmallestTime;
/**最大时间*/
private String allowedBiggestTime;
    private enum TIME_TYPE {
        TYPE_START,
        TYPE_END
    }



    public DoubleTimeSelectDialog(Context context) {
        super(context, R.style.PopBottomDialogStyle);
    }

    public DoubleTimeSelectDialog(Context context, String curTime, String startTime) {
        super(context, R.style.PopBottomDialogStyle);
        this.mContext = context;
        this.allowedSmallestTime = startTime;
        setContentView(R.layout.popwindow_bottom_layout);
        setCanceledOnTouchOutside(true);
        Window mDialogWindow = getWindow();
        mDialogWindow.setGravity(Gravity.BOTTOM);
        WindowManager.LayoutParams lp = mDialogWindow.getAttributes();
        lp.y = 0;//设置Dialog距离底部的距离
        lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
        mDialogWindow.setAttributes(lp);

        initDialogView();

        init(curTime, false);

        String monthS = String.format("%02d", curMonth);
        String dayS = String.format("%02d", curDay);
        String yearS = String.format("%02d", curYear);
        if(!TextUtils.isEmpty(curTime)){
            mSelectStartTime = curTime;
            mBeginTimeTv.setText(makeFormatContent(mContext.getString(R.string.begin_at), curTime.replaceAll("-",".")));
            mSelectEndTime = curTime;
            mEndTimeTv.setText(makeFormatContent(mContext.getString(R.string.end_at), curTime.replaceAll("-",".")));
        }else{
            mSelectStartTime = yearS + "-" + monthS + "-" + dayS;
            mBeginTimeTv.setText(makeFormatContent(mContext.getString(R.string.begin_at), yearS + "." + monthS + "." + dayS));
            mSelectEndTime = yearS + "-" + monthS + "-" + dayS;
            mEndTimeTv.setText(makeFormatContent(mContext.getString(R.string.end_at), yearS + "." + monthS + "." + dayS));
        }
    }

    public DoubleTimeSelectDialog(Context context, String earliestTime, String startTime, String endTime) {
        super(context, R.style.PopBottomDialogStyle);
        this.mContext = context;
        this.allowedSmallestTime = earliestTime;
        this.allowedBiggestTime = endTime;
        setContentView(R.layout.popwindow_bottom_layout);
        setCanceledOnTouchOutside(true);
        Window mDialogWindow = getWindow();
        mDialogWindow.setGravity(Gravity.BOTTOM);
        WindowManager.LayoutParams lp = mDialogWindow.getAttributes();
        lp.y = 0;//设置Dialog距离底部的距离
        lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
        mDialogWindow.setAttributes(lp);

        initDialogView();

        init(startTime, false);

        String monthS = String.format("%02d", curMonth);
        String dayS = String.format("%02d", curDay);
        String yearS = String.format("%02d", curYear);
        if(!TextUtils.isEmpty(startTime)){
            mSelectStartTime = startTime;
            mBeginTimeTv.setText(makeFormatContent(mContext.getString(R.string.begin_at), startTime.replaceAll("-",".")));
            mSelectEndTime = endTime;
            mEndTimeTv.setText(makeFormatContent(mContext.getString(R.string.end_at), endTime.replaceAll("-",".")));
        }else{
            mSelectStartTime = yearS + "-" + monthS + "-" + dayS;
            mBeginTimeTv.setText(makeFormatContent(mContext.getString(R.string.begin_at), yearS + "." + monthS + "." + dayS));
            mSelectEndTime =
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值