DatePicker和TimePicker组合后的Dialog

####记录一下刚刚实现的一个组合的选择时间和日期的Dialog,可以根据自己的实际需要把日期中的 年、月、日的spinner隐藏,在类中已经提供了此方法,但是实际Demo并没有使用。
先展示完整的图片:
这里写图片描述
这里写图片描述
以下是:这是Activity代码

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


public class TimeDateActivity extends Activity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_date);
        Button btnDialog = (Button) findViewById(R.id.btn_dialog);
        btnDialog.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        new DateDialog(TimeDateActivity.this, new DateDialog.DateCallBack() {
            @Override
            public void onClick(String date) {
                Toast.makeText(TimeDateActivity.this, date + "", Toast.LENGTH_LONG).show();
            }
        });
    }
}

下面是主布局部分代码:

  <Button
        android:text="弹出Dialog"
        android:id="@+id/btn_dialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

下面是Dialog的布局代码:

<?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">

    <DatePicker
        android:layout_width="match_parent"
        android:id="@+id/date"
        android:calendarViewShown="false"
        android:layout_height="wrap_content" />

    <TimePicker
        android:layout_width="match_parent"
        android:id="@+id/time"
        android:layout_height="wrap_content" />
</LinearLayout>

接下来才是最重要的Dialog的代码:

package cn.edu.jxufe.demo01;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;
import android.widget.TimePicker;

import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Calendar;


/**
 * 日期时间选择组合控件
 * 使用方法:
 * 在Activity中:点击按钮,调用下面的函数
 * new DateDialog(this, new DateDialog.DateCallBack() {
 *
 * @ Override
 * public void onChanged(String date) {
 * Toast.makeText(TimeDateActivity.this, date + "", Toast.LENGTH_LONG).show();
 * }
 * });
 */
public class DateDialog implements DatePicker.OnDateChangedListener, TimePicker.OnTimeChangedListener {
    private String dateTime;
    private Context context;
    private DateCallBack listener;
    private DatePicker datePicker;
    private TimePicker timePicker;
    private View view;

    /**
     * 日期时间弹出选择框构造函数
     *
     * @param context:获取组件的上下文
     */
    public DateDialog(Context context, DateCallBack listener) {
        this.context = context;
        this.listener = listener;
        //初始化视图中的控件
        initPicker();
        //初始化Dialog
        initDialog();

    }

    /**
     * 初始化Picker和主视图
     */
    private void initPicker() {
        view = LayoutInflater.from(context).inflate(R.layout.dialog_time_date_view, null);

        datePicker = (DatePicker) view.findViewById(R.id.date);
        timePicker = (TimePicker) view.findViewById(R.id.time);

        Calendar calendar = Calendar.getInstance();
        //隐藏年份 spinner 控件,也可以隐藏月份或日份
        //hidYear(datePicker);
        datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DAY_OF_MONTH), this);
        timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
        timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));
        timePicker.setIs24HourView(true);
        timePicker.setOnTimeChangedListener(this);
    }

    /**
     * 弹出日期时间选择框方法
     */
    public void initDialog() {
        //初始化Dialog
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setIcon(R.drawable.ic_launcher);
        builder.setView(view);
        builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                listener.onClick(dateTime);
            }
        });
        builder.setNegativeButton("取消", null).create();
        builder.show();
        //刷新数据
        onDateChanged(null, 0, 0, 0);
    }

    /**
     * 隐藏 选择 年份 的spinner
     * mYearSpinner:年份spinner
     * mMonthSpinner:月份spinner
     * mDaySpinner:日份spinner
     */
    private void hidYear(DatePicker mDatePicker) {
        Field[] datePickerFields = mDatePicker.getClass().getDeclaredFields();
        for (Field datePickerField : datePickerFields) {

            if ("mYearSpinner".equals(datePickerField.getName())) {
                datePickerField.setAccessible(true);
                Object dayPicker = new Object();
                try {
                    dayPicker = datePickerField.get(mDatePicker);
                } catch (IllegalAccessException | IllegalArgumentException e) {
                    e.printStackTrace();
                }
                ((View) dayPicker).setVisibility(View.GONE);
            }
        }
    }

    @Override
    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
        onDateChanged(null, 0, 0, 0);
    }

    @Override
    public void onDateChanged(DatePicker view, int year, int monthOfYear,
                              int dayOfMonth) {
        Calendar calendar = Calendar.getInstance();

        calendar.set(datePicker.getYear(), datePicker.getMonth(),
                datePicker.getDayOfMonth(), timePicker.getCurrentHour(),
                timePicker.getCurrentMinute());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        dateTime = sdf.format(calendar.getTime());
    }

    //采用接口回调的方式 获取点击dialog的'设置'之后的数据
    public interface DateCallBack {
        public void onClick(String date);
    }
}


以上就是全部,本人还只是个学了半年Android的小白,如果这个Demo有什么问题,请大家在下面留言,我定当及时改正,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值