Android时间选择器

前提是你 提交于 2019-12-01 18:05:38

文末提供源码下载地址!!!

效果见图:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

对于gif的录制,采用的是LICEcap软件,mac,windows都可以。

对于这个选择器,主要的几个功能的实现:

1. 时间的处理

主要用的是Calendar类,可以方便的对日期进行加减。

获取实例:

_currentCalendar = Calendar.getInstance();

计算日期的加减发:

_currentCalendar.add(Calendar.YEAR,+1);

_currentCalendar.add(Calendar.MONTH,-1);

时间的显示:

每一个方框中都是一个TextView,分别获取年,月,日,时,分设置在TextView上,获取时间的方法:

calendar.get(Calendar.YEAR)//获取年份

需要注意的是月份在获取的时候是少一个月的,比如现在是10月,当调用

calendar.get(Calendar.MONTH)

的时候返回的是9.

2.时间的显示格式,12H和24H

因为本例中需要处理12H格式和24H格式,文中采用的是:

DateFormat.is24HourFormat(getDialog().getContext())

通过调用这个方法,得到系统中用户设定默认的时间格式。返回true即为24小时格式。

当用户在时间选择器上选择12H时,用以下方法来保证小时部分显示正确:

int h = (calendar.get(Calendar.HOUR_OF_DAY)+12)%12;
if(h==0){
    h = 12;
}

简单粗暴。

3.dialog在界面上显示的大小

开发中经常碰到dilog不能理想的显示的问题,本例中自定义了一个DialogFragment,在Dialog的onStart方法中调用以下代码,可以设置dialog相对于界面的大小比例:

public void onStart() {
    super.onStart();
    DisplayMetrics dm = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
    //设置dialog在界面上所在宽高占比0.75 0.5
    getDialog().getWindow().setLayout((int) (dm.widthPixels * 0.75), (int) (dm.widthPixels * 0.5));
}

文中设置宽度为全屏的3/4,高度为全屏的1/2。

 

最后说下大体思路:

        主Activity的布局文件中只有一个按钮,用来出发Dialog。自定义了一个DataPickerDialog,继承自DialogFragment,它有一个监听,在DataPickerDialog中定义了一个接口,用来处理弹框中的确定和取消事件。onSure方法中可以得到当前时间(用Calendar承载的)和当前值的时间格式,String类型,在DataPickerDialog中有定义。

        DataPickerDialog.java中主要设置一些按钮的监听。确认取消键提供接口共外部使用。这个Dialog布局的的中间一些调节时间的上下按键设置响应事件。如果一个一个find的话太麻烦了,其实六个是一样的,可以再封装一次。于是自定义一个DataPickerItemView。另外,这个文件中对时间进行统一处理:

    @Override
    public void onItemUpPress(View v) {
        switch (v.getId()){
            case R.id.data_picker_item_year:
                _currentCalendar.add(Calendar.YEAR,+1);
                break;
            case R.id.data_picker_item_month:
                _currentCalendar.add(Calendar.MONTH,+1);
                break;
            case R.id.data_picker_item_day:
                _currentCalendar.add(Calendar.DAY_OF_MONTH,+1);
                break;
            case R.id.data_picker_item_hour:
                _currentCalendar.add(Calendar.HOUR_OF_DAY,+1);
                break;
            case R.id.data_picker_item_min:
                _currentCalendar.add(Calendar.MINUTE,+1);
                break;
            case R.id.data_picker_item_format:
                switchFormat();
                break;
            default:
        }
        setCurrentDate(_currentCalendar,_currentFormat);
    }

    @Override
    public void onItemBottomPress(View v) {
        switch (v.getId()){
            case R.id.data_picker_item_year:
                _currentCalendar.add(Calendar.YEAR,-1);
                break;
            case R.id.data_picker_item_month:
                _currentCalendar.add(Calendar.MONTH,-1);
                break;
            case R.id.data_picker_item_day:
                _currentCalendar.add(Calendar.DAY_OF_MONTH,-1);
                break;
            case R.id.data_picker_item_hour:
                _currentCalendar.add(Calendar.HOUR_OF_DAY,-1);
                break;
            case R.id.data_picker_item_min:
                _currentCalendar.add(Calendar.MINUTE,-1);
                break;
            case R.id.data_picker_item_format:
                switchFormat();
                break;
            default:
        }
        setCurrentDate(_currentCalendar,_currentFormat);
    }

        DataPickerItemView.java有三个控件两个ImageButton,一个TextView,提供方法setText(Object number)来设置需要显示的数字。在组件中提供上下两个ImageButton点击事件的接口,传出参数为DataPickerItemView这个View,以方便在DataPickerDialog.java中集中处理时间的变化。

        最后的最后,上源码:http://git.oschina.net/164587694/MyDatePicker

本文地址:https://my.oschina.net/reone/blog/759774

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!