文档章节

自定义时间选择器的实现

HenryHsu
 HenryHsu
发布于 2015/02/12 16:37
字数 793
阅读 83
收藏 1

首先是布局文件time_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <TableLayout
            android:layout_gravity="center_horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
        <TableRow>
         <NumberPicker
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/year_picker"/>
        <NumberPicker
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/month_picker"/>
        <NumberPicker
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/day_picker"/>
        </TableRow>
    </TableLayout>

    <TableLayout
            android:layout_gravity="center_horizontal"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:orientation="horizontal">
        <TableRow>
        <NumberPicker
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/hour_picker"/>
        <NumberPicker
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/minute_picker"/>
        <NumberPicker
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/second_picker"/>
        </TableRow>
    </TableLayout>

</LinearLayout>



可见6个NumberPicker以2*3的形式排列。

接下来是自定义控件的实现

package com.example.TimeSelector;

import android.content.Context;
import android.text.format.Time;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.NumberPicker;

/**
 * Created by Administrator on 2015/2/12.
 */
public class TimeSelector extends FrameLayout {
    NumberPicker npYear,npMonth,npDay,npHour,npMinute,npSecond;
    int year,month,day,hour,minute,second;
    public TimeSelector(Context context)
    {
        this(context, null);

    }
    public TimeSelector(Context context, AttributeSet attrs)
    {
        this(context, attrs, 0);
    }
    public TimeSelector(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        View v = LayoutInflater.from(context).inflate(R.layout.time_selector,this);
        npYear = (NumberPicker)v.findViewById(R.id.year_picker);
        npMonth = (NumberPicker)v.findViewById(R.id.month_picker);
        npDay = (NumberPicker)v.findViewById(R.id.day_picker);
        npHour = (NumberPicker)v.findViewById(R.id.hour_picker);
        npMinute = (NumberPicker)v.findViewById(R.id.minute_picker);
        npSecond = (NumberPicker)v.findViewById(R.id.second_picker);

        init();
    }

    public void init(){
        Time time = new Time("GMT+8");
        time.setToNow();
        year = time.year;
        month = time.month + 1;
        day = time.monthDay;
        hour = time.hour + 8;
        minute = time.minute;
        second = time.second;

        initBasicSettings(year,month,day,hour,minute,second);
        setTime();

        /**
         *change scale when date is changed
         */
        npYear.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
            @Override
            public void onValueChange(NumberPicker numberPicker, int i, int i1) {
                year  = i1;
                initBasicSettings(year,month,day,hour,minute,second);
                setTime();
            }
        });
        npMonth.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
            @Override
            public void onValueChange(NumberPicker numberPicker, int i, int i1) {
                month = i1;
                initBasicSettings(year,month,day,hour,minute,second);
                setTime();
            }
        });
        npDay.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
            @Override
            public void onValueChange(NumberPicker numberPicker, int i, int i1) {
                day = i1;
                setTime();
            }
        });
        npHour.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
            @Override
            public void onValueChange(NumberPicker numberPicker, int i, int i1) {
                hour = i1;
                setTime();
            }
        });
        npMinute.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
            @Override
            public void onValueChange(NumberPicker numberPicker, int i, int i1) {
                minute = i1;
                setTime();
            }
        });
        npSecond.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
            @Override
            public void onValueChange(NumberPicker numberPicker, int i, int i1) {
                second = i1;
                setTime();
            }
        });
    } public void initBasicSettings(int year,int month,int day,int hour,int minute,int second){
        /**
         * basic settings
         */
        npYear.setMinValue(1970);
        npYear.setMaxValue(2100);
        npMonth.setMinValue(0);
        npMonth.setMaxValue(12);
        npDay.setMinValue(1);
        switch (month)
        {   //set days is 28 days or 29 when February
            case 1:
            case 3:
            case 5:
            case 7:
            case 10:
            case 12:
                npDay.setMaxValue(31);break;
            case 2:
                if (year%100 == 0){
                    if(year%400 == 0){
                        npDay.setMaxValue(29);
                    }
                }else{
                    if(year%4 == 0){
                        npDay.setMaxValue(29);
                    }
                    else {
                        npDay.setMaxValue(28);
                    }
                }
                break;
            default:
                npDay.setMaxValue(30);break;
        }
        npHour.setMinValue(0);
        npHour.setMaxValue(23);
        npMinute.setMinValue(0);
        npMinute.setMaxValue(59);
        npSecond.setMinValue(0);
        npSecond.setMaxValue(59);
    }
    public void setTime()
    {
        /**
         * set time to now
         */
        npYear.setValue(year);
        npMonth.setValue(month);
        npDay.setValue(day);
        npHour.setValue(hour);
        npMinute.setValue(minute);
        npSecond.setValue(second);
    }


}



其中主要涉及到NumberPicker控件的使用,注意setValue函数一定得在setMaxValue()和setMinValue()之后调用,不然数字都会显示为0。

如果想调用这个控件,在布局文件中声明即可,比如这里是main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <com.example.TimeSelector.TimeSelector
            android:layout_height="fill_parent"
            android:layout_width="fill_parent"
            android:id = "@+id/ts"
            />

</LinearLayout>



最后在Activity中载入这个布局即可。

package com.example.TimeSelector;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

/**
 * Created by Administrator on 2015/2/12.
 */
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);

    }
}



使用截图如下:

参考:

http://blog.csdn.net/sun_star1chen/article/details/16330459

源码下载:

https://github.com/bldhdh/TimeSelector

© 著作权归作者所有

上一篇: Fresco学习初步
HenryHsu
粉丝 3
博文 17
码字总数 6260
作品 0
崇明
私信 提问
一步步打造一个支持异步加载数据的移动端选择器

选择器在应用中是使用比较频繁的一个组件。在移动端,不同的操作系统默认的选择器存在各种差异,iOS为底部滚动的选择器,不同的Android系统,默认的选择器也是不尽相同的。同时,默认的选择器...

深海鱼在掘金
2018/10/30
0
0
andorid择器类库,包括日期及时间选择器性别、职业、学历、星座等

andorid择器类库,包括日期及时间选择器性别、职业、学历、星座等 安度博客 » 安度博客2017-05-1827 阅读 Andorid时间星座日期选择器 描述: 安卓选择器类库,包括日期及时间选择器(可设置...

安度博客 » 安度博客
2017/05/18
0
0
回味jQuery系列(1)-选择器

jQuery-选择器浅析 jQuery 最核心的组成部分就是:选择器引擎,选择器引擎Sizzle占了jQuery很大一部分。它继承了CSS 的语法,可以对DOM 元素的标签名、属性名、状态等进行快速准确的选择,并...

xzavier
2018/08/27
0
0
利用Android TimePicker 和 DatePicker 实现对时间的限制

最近项目里需要对时间限制的时间选择器,当然实现这种功能完全可以自定义一个,网上也有很多自定义的 时间选择器,在原来的基础上根据自己的需要修改一下就可以了。我才用了android 自带的T...

下雨下雨下不停
2016/06/07
822
0
使用xpath实现document.querySelector样式选择器进行html解析(二):扩展一下xpath以便支持正则

使用xpath实现document.querySelector样式选择器进行html解析(一):将html转成xml 使用xpath实现document.querySelector样式选择器进行html解析(二):扩展一下xpath以便支持正则 使用xpa...

玄学酱
2018/06/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

启动参数

常用启动参数,通过 -Dxx.yy=zz注入应用参数 -Deureka.instance.metadata-map.starkGroup=test3 -Dserver.port=8989 本地调试过程中,可改变端口来启动多个相同服务。修改启动的VM参数即可...

ZH-JSON
14分钟前
4
0
ES配置修改

查看配置 GET /_cluster/settings 修改配置 PUT /_cluster/settings{ "persistent" : { "xpack" : { "monitoring" : { "collection" : { "enabled" : ......

messud4312
25分钟前
3
0
Spring事务传播属性有那么难吗?看这一篇就够了

Spring事务传播属性有那么难吗?看这一篇就够了 笔者文笔功力尚浅,如有不妥,请慷慨指出,必定感激不尽 学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过...

不学无数的程序员
25分钟前
4
0
VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
50分钟前
5
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部