关闭

安卓原生时间选择器,DatePicker和TimePicker并用,弹窗dialog

标签: android时间选择器时间弹窗DatePickerTimePicker
16948人阅读 评论(8) 收藏 举报
分类:

封装安卓原生时间选择器,DatePicker和TimePicker并用,弹窗dialog,用起来非常方便...

之前写的用起来麻烦,这回又优化了一下,有什么不对或是更简单的办法大家可评论....
看效果(看见不好看自己修修偷笑):
                  

public class TimePickerDialog {

    private Context mContext;
    private AlertDialog.Builder mAlertDialog;
    private int mHour, mMinute;
    private TimePickerDialogInterface timePickerDialogInterface;
    private TimePicker mTimePicker;
    private DatePicker mDatePicker;
    private int mTag = 0;
    private int mYear, mDay, mMonth;

    public TimePickerDialog(Context context) {
        super();
        mContext = context;
        timePickerDialogInterface = (TimePickerDialogInterface) context;
    }

    /**
     * 初始化DatePicker
     *
     * @return
     */
    private View initDatePicker() {
        View inflate = LayoutInflater.from(mContext).inflate(
                R.layout.datepicker_layout, null);
        mDatePicker = (DatePicker) inflate
                .findViewById(R.id.datePicker);
        resizePikcer(mDatePicker);
        return inflate;
    }

    /**
     * 初始化TimePicker
     *
     * @return
     */
    private View initTimePicker() {
        View inflate = LayoutInflater.from(mContext).inflate(
                R.layout.timepicker_layout, null);
        mTimePicker = (TimePicker) inflate
                .findViewById(R.id.timePicker);
        mTimePicker.setIs24HourView(true);
        resizePikcer(mTimePicker);
        return inflate;
    }

    private View initDateAndTimePicker() {
        View inflate = LayoutInflater.from(mContext).inflate(
                R.layout.dateandtimepicker_layout, null);
        mTimePicker = (TimePicker) inflate
                .findViewById(R.id.dateAndTimePicker_timePicker);
        mDatePicker = (DatePicker) inflate
                .findViewById(R.id.dateAndTimePicker_datePicker);
        mTimePicker.setIs24HourView(true);
        resizePikcer(mTimePicker);
        resizePikcer(mDatePicker);
        return inflate;
    }

    /**
     * 创建dialog
     *
     * @param view
     */
    private void initDialog(View view) {
        mAlertDialog.setPositiveButton("确定",
                new android.content.DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                        dialog.dismiss();

                        if (mTag == 0) {
                            getTimePickerValue();
                        } else if (mTag == 1) {
                            getDatePickerValue();
                        } else if (mTag == 2) {
                            getDatePickerValue();
                            getTimePickerValue();
                        }
                        timePickerDialogInterface.positiveListener();

                    }
                });
        mAlertDialog.setNegativeButton("取消",
                new android.content.DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                        timePickerDialogInterface.negativeListener();
                        dialog.dismiss();
                    }
                });
        mAlertDialog.setView(view);
    }

    /**
     * 显示时间选择器
     */
    public void showTimePickerDialog() {
        mTag=0;
        View view = initTimePicker();
        mAlertDialog = new AlertDialog.Builder(mContext);
        mAlertDialog.setTitle("选择时间");
        initDialog(view);
        mAlertDialog.show();
        
    }

    /**
     * 显示日期选择器
     */
    public void showDatePickerDialog() {
        mTag=1;
        View view = initDatePicker();
        mAlertDialog = new AlertDialog.Builder(mContext);
        mAlertDialog.setTitle("选择时间");
        initDialog(view);
        mAlertDialog.show();
    }
    /**
     * 显示日期选择器
     */
    public void showDateAndTimePickerDialog() {
        mTag=2;
        View view = initDateAndTimePicker();
        mAlertDialog = new AlertDialog.Builder(mContext);
        mAlertDialog.setTitle("选择时间");
        initDialog(view);
        mAlertDialog.show();
    }

    /*
    * 调整numberpicker大小
    */
    private void resizeNumberPicker(NumberPicker np) {
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(120,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(10, 0, 10, 0);
        np.setLayoutParams(params);
    }

    /**
     * 调整FrameLayout大小
     *
     * @param tp
     */
    private void resizePikcer(FrameLayout tp) {
        List<NumberPicker> npList = findNumberPicker(tp);
        for (NumberPicker np : npList) {
            resizeNumberPicker(np);
        }
    }

    /**
     * 得到viewGroup里面的numberpicker组件
     *
     * @param viewGroup
     * @return
     */
    private List<NumberPicker> findNumberPicker(ViewGroup viewGroup) {
        List<NumberPicker> npList = new ArrayList<NumberPicker>();
        View child = null;
        if (null != viewGroup) {
            for (int i = 0; i < viewGroup.getChildCount(); i++) {
                child = viewGroup.getChildAt(i);
                if (child instanceof NumberPicker) {
                    npList.add((NumberPicker) child);
                } else if (child instanceof LinearLayout) {
                    List<NumberPicker> result = findNumberPicker((ViewGroup) child);
                    if (result.size() > 0) {
                        return result;
                    }
                }
            }
        }
        return npList;
    }

    public int getYear() {
        return mYear;
    }

    public int getDay() {
        return mDay;
    }

    public int getMonth() {
        //返回的时间是0-11
        return mMonth+1;
    }

    public int getMinute() {
        return mMinute;
    }

    public int getHour() {
        return mHour;
    }

    /**
     * 获取日期选择的值
     */
    private void getDatePickerValue() {
        mYear = mDatePicker.getYear();
        mMonth = mDatePicker.getMonth();
       mDay= mDatePicker.getDayOfMonth();
    }

    /**
     * 获取时间选择的值
     */
    private void getTimePickerValue() {
        // api23这两个方法过时
        mHour = mTimePicker.getCurrentHour();// timePicker.getHour();
        mMinute = mTimePicker.getCurrentMinute();// timePicker.getMinute();
    }



    public interface TimePickerDialogInterface {
        public void positiveListener();
        public void negativeListener();
    }

}


dialog布局:

这是datePicker和timePicker同时显示的时候的布局(这个是横向的适配可能不是很),其他两个没有就不贴了,自己建一个布局写个DatePicker或TimePicker,再或者写在一个布局自己判断调用...


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:layout_width="match_parent"
  android:weightSum="2"
  android:gravity="center"
  android:layout_height="match_parent">
    <DatePicker 
        android:id="@+id/datePicker1"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:calendarViewShown="false"
        />
    <TimePicker 
        android:id="@+id/timePicker1"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"/>
</LinearLayout>



这个是纵向的适配会非常容易,推荐使用


<?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:gravity="center"
    android:layout_height="match_parent">
    <DatePicker
        android:id="@+id/dateAndTimePicker_datePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:calendarViewShown="false"
        />
    <TimePicker
        android:id="@+id/dateAndTimePicker_timePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>


使用方法很简单:

1.new出来在activity或fragment定义成全局的变量。

  mTimePickerDialog = new TimePickerDialog(RouteSetOwnerActivity.this);

2.就像这样想显示那个显示那个。

 mTimePickerDialog.showTimePickerDialog();

3.现实TImePickerDialog里面接口,并且重写里面的方法,然后根据自己的 需要来取时间。如下:

public class RouteSetOwnerActivity extends Activity implements TimePickerDialog.TimePickerDialogInterface {
 
   
    private TimePickerDialog mTimePickerDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_route_set_owner);
        mTimePickerDialog = new TimePickerDialog(RouteSetOwnerActivity.this);
      
      
    }

    //时间选择器----------确定
    @Override
    public void positiveListener() {
        int hour = mTimePickerDialog.getHour();
        int minute = mTimePickerDialog.getMinute();
        Log.i("=====","=======year======"+mTimePickerDialog.getYear());
        Log.i("=====","=======getMonth======"+mTimePickerDialog.getMonth());
        Log.i("=====","=======getDay======"+mTimePickerDialog.getDay());
        Log.i("=====","=======getHour======"+mTimePickerDialog.getHour());
        Log.i("=====","=======getMinute======"+mTimePickerDialog.getMinute());
        mTv_getOffWork.setText(hour+":"+minute);
    }

    //时间选择器-------取消
    @Override
    public void negativeListener() {

    }
}




6
2
查看评论

GitHub 整理|那些优秀的开源时间日期选择器

GitHub 整理|那些优秀的开源时间日期选择器,总有一款适合你 选择时间日期是大部分项目中都会遇到的功能之一。然而,Android 系统 API 提供的一些控件在设计和功能上并不是很完善,如 TimePicker 和 DatePicker 等,很多时候满足不了我们应用的需求。 这里给大家分享几...
  • kisty_yao
  • kisty_yao
  • 2017-11-28 14:08
  • 929

Android原生日期选择器对话框DatePickerDialog

调用Android原生日期选择器对话框就是DatePickerDialog 在Android4.4系统上效果如图: 在Android5.0以上效果如图: 1、Activity的onCreate方法中获取当时的年 ,月,日 Calendar ca = Calendar.getInstan...
  • zhangyong7112
  • zhangyong7112
  • 2017-01-14 16:33
  • 4719

Android自定义DataTimePicker(日期选择器)

Android自定义DataTimePicker(日期选择器) 笔者有一段时间没有发表关于Android的文章了,关于Android自定义组件笔者有好几篇想跟大家分享的,后期会记录在博客中。本篇博客给大家分享的是自定义一个日期选择器,可以让用户同时选择年月日和当前时间。先看看效果:实现的效...
  • wwj_748
  • wwj_748
  • 2014-08-23 15:39
  • 154390

Android之日期时间选择控件DatePicker和TimePicker

这个月根据需求在项目中做了一个时间选择器,虽然没有用到Android原生的时间选择控件,但我羞愧地发现自己竟然从来没有用过这方面控件!趁现在有时间,赶紧查缺补漏,写一篇博客吧。(注:为了便于区分,本文将选择年月日的控件称为日期选择控件,将选择时分的控件称为时间选择控件。)1、创建项目新建一个项目,M...
  • Lindroid20
  • Lindroid20
  • 2017-05-23 17:30
  • 2201

Android 选择日期时间对话框(可选择开始结束时间,已解决弹出键盘问题)

直接行代码: MainActivity:package wkk.demo6;import android.app.AlertDialog; import android.app.DatePickerDialog; import android.app.TimePickerDialog; impor...
  • w18756901575
  • w18756901575
  • 2016-05-19 18:44
  • 4970

使用Android-PickerView实现地址选择器时间选择器

这里贡献下我使用Android-PickerView实现地址选择器遇到的坑,算是一个笔记。首先要吐槽下后台接口,为了实现移动端和web端的统一(ps:可能他没搞过后台接口),修改地址的时候本来要用下拉框。。。我去,后面ios的大兄弟苦苦哀求,改成了他们ios的PickerView,就是地址选择联动的...
  • z_zT_T
  • z_zT_T
  • 2016-12-21 10:35
  • 6576

安卓开发 Time-Selector时间选择器

起源的Github:https://github.com/mrfluency/Time-Selector 必备依赖: //时间选择器 compile 'com.feezu.liuli:timeselector:1.1.3+' 第一种默认呈现: ...
  • Drunken_pirate
  • Drunken_pirate
  • 2017-08-02 15:56
  • 2957

安卓开发-高仿ios时间选择控件timepicker

在开发中如果有地址或者日期选择等就会涉及到时间或者条件选择器,大家都会想到仿ios的三级联动的效果,用wheelview实现,其实安卓原生自带了时间和日期选择器可能是效果来说太粗犷了,所以很多产品效果图都是清一色的ios那种效果,ok,废话说完了上图 demo地址:https://gith...
  • panghaha12138
  • panghaha12138
  • 2017-06-20 14:38
  • 3288

android 实现点击输入框弹出日期选择对话框(DatePickerDialog)

前言 这里我们实现一个功能,点击日期输入框(EditText),即可弹出日期选择对话框(DatePickerDialog),等用户选择日期后,将用户选择的日期显示在日期输入框。 1.activity_main.xml 这里只有一个TextView和EditText。 <Linear...
  • hzh_csdn
  • hzh_csdn
  • 2016-08-25 20:15
  • 8249

高大上的安卓日期选择器

  • 2014-09-03 12:40
  • 1.43MB
  • 下载
    个人资料
    • 访问:92498次
    • 积分:1025
    • 等级:
    • 排名:千里之外
    • 原创:29篇
    • 转载:3篇
    • 译文:0篇
    • 评论:66条
    最新评论