日期+时间选择器中DialogFragment实现OnDateChangedListener和OnTimeChangedListener [英] Date + Time Picker in DialogFragment implements OnDateChangedListener and OnTimeChangedListener

查看:165
本文介绍了日期+时间选择器中DialogFragment实现OnDateChangedListener和OnTimeChangedListener的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我似乎无法设置我的DateTimeDialogFragment,因为它使在这里我把部分崩溃:

  =日期选择器(DatePicker的)getView()findViewById(R.id.DatePicker)。

错误日志:

  21 02-14:38:43.262:E / AndroidRuntime(2435):致命异常:主要
02-14 21:38:43.262:E / AndroidRuntime(2435):显示java.lang.NullPointerException
02-14 21:38:43.262:E / AndroidRuntime(2435):在com.test.DateTimeDialogFragment.onActivityCreated(DateTimeDialogFragment.java:98)
02-14 21:38:43.262:E / AndroidRuntime(2435):在android.app.FragmentManagerImpl.moveToState(FragmentManager.java:847)
02-14 21:38:43.262:E / AndroidRuntime(2435):在android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032)
02-14 21:38:43.262:E / AndroidRuntime(2435):在android.app.BackStackRecord.run(BackStackRecord.java:622)
02-14 21:38:43.262:E / AndroidRuntime(2435):在android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1382)
02-14 21:38:43.262:E / AndroidRuntime(2435):在android.app.FragmentManagerImpl $ 1.run(FragmentManager.java:426)
02-14 21:38:43.262:E / AndroidRuntime(2435):在android.os.Handler.handleCallback(Handler.java:605)
02-14 21:38:43.262:E / AndroidRuntime(2435):在android.os.Handler.dispatchMessage(Handler.java:92)
02-14 21:38:43.262:E / AndroidRuntime(2435):在android.os.Looper.loop(Looper.java:137)
02-14 21:38:43.262:E / AndroidRuntime(2435):在android.app.ActivityThread.main(ActivityThread.java:4424)
02-14 21:38:43.262:E / AndroidRuntime(2435):在java.lang.reflect.Method.invokeNative(本机方法)
02-14 21:38:43.262:E / AndroidRuntime(2435):在java.lang.reflect.Method.invoke(Method.java:511)
02-14 21:38:43.262:E / AndroidRuntime(2435):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
02-14 21:38:43.262:E / AndroidRuntime(2435):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-14 21:38:43.262:E / AndroidRuntime(2435):在dalvik.system.NativeStart.main(本机方法)

下面是完整的code:

 公共类DateTimeDialogFragment扩展DialogFragment工具
        OnDateChangedListener,OnTimeChangedListener {
    //定义日期时间选择器常数。
    公众最终诠释DATE_PICKER = 1;
    公众最终诠释TIME_PICKER = 2;
    公众最终诠释DATE_TIME_PICKER = 3;    // DatePicker的参考
    私人的DatePicker日期选择器;    // TimePicker参考
    私人TimePicker timePicker;    //日历参考
    私人日历mCalendar;    //定义活动
    私人活动活动;    //定义对话框类型
    私人诠释intDialogType;    //构造函数启动
    公共DateTimeDialogFragment(活动活动){
        this.activity =活动;
    }    @覆盖
    公共对话框onCreateDialog(捆绑savedInstanceState){
        //使用生成器类简单的对话框建设
        AlertDialog.Builder建设者=新AlertDialog.Builder(活动);        //获取吹气布局
        LayoutInflater吹气= activity.getLayoutInflater();        //充气并为对话设置布局
        作为父视图//传递空值,因为它在该对话框的布局会
        builder.setView(inflater.inflate(R.layout.date_time_dialog,NULL));        //对话框的标题设置
        builder.setMessage(设定日期)
                //设置OK按钮
                .setPositiveButton(设置,
                        新DialogInterface.OnClickListener(){
                            公共无效的onClick(DialogInterface对话,诠释的id){
                                //用户确定的对话框
                            }
                        })
                //设置取消按钮
                .setNegativeButton(取消,
                        新DialogInterface.OnClickListener(){
                            公共无效的onClick(DialogInterface对话,诠释的id){
                                //用户取消了对话框
                            }
                        })
                //设置中性按钮(复位时间/日期)
                .setNeutralButton(复位,
                        新DialogInterface.OnClickListener(){
                            @覆盖
                            公共无效的onClick(DialogInterface对话,诠释的id){
                                //用户重置的对话框
                                //复位();
                            }
                        });        //创建AlertDialog对象,并将其返回
        返回builder.create();
    }    @覆盖
    公共无效onActivityCreated(捆绑savedInstanceState){
        // TODO自动生成方法存根
        super.onActivityCreated(savedInstanceState);
        //取得日历实例
        mCalendar = Calendar.getInstance();        //初始化日期选择器
        日期选择器=(的DatePicker)getView()findViewById(R.id.DatePicker)。
        datePicker.init(mCalendar.get(Calendar.YEAR),mCalendar.get(的Calendar.MONTH),mCalendar.get(Calendar.DAY_OF_MONTH),这一点);        //初始化时间选择器
        timePicker =(TimePicker)getView()findViewById(R.id.TimePicker)。
        timePicker.setOnTimeChangedListener(本);
    }    公共无效setIntDialogType(INT intDialogType){
        this.intDialogType = intDialogType;
    }    //便利的包装内部的日历实例
    公众诠释的get(最终诠释场){
        返回mCalendar.get(场);
    }    //重置的DatePicker,TimePicker和内部的日历实例
    公共无效复位(){
        最后的日历C = Calendar.getInstance();
        updateDate(c.get(Calendar.YEAR),c.get(的Calendar.MONTH),c.get(Calendar.DAY_OF_MONTH));
        录入(c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE));
    }    //便利的包装内部的日历实例
    众长getDateTimeMillis(){
        返回mCalendar.getTimeInMillis();
    }    //便利的包装内部TimePicker实例
    公共无效setIs24HourView(布尔is24HourView){
        timePicker.setIs24HourView(is24HourView);
    }    //便利的包装内部TimePicker实例
    公共布尔is24HourView(){
        返回timePicker.is24HourView();
    }    //便利的包装内部的DatePicker实例
    公共无效setCalendarViewShown(布尔calendarView){
        datePicker.setCalendarViewShown(calendarView);
    }    //便利的包装内部的DatePicker实例
    公共布尔CalendarViewShown(){
        返回datePicker.getCalendarViewShown();
    }    //便利的包装内部的DatePicker实例
    公共无效updateDate(年整型,诠释monthOfYear,诠释请将dayOfMonth){
        datePicker.updateDate(年,monthOfYear,请将dayOfMonth);
    }    //便利的包装内部TimePicker实例
    公共无效录入(INT currentHour的,诠释currentMinute){
        timePicker.setCurrentHour(currentHour的);
        timePicker.setCurrentMinute(currentMinute);
    }    公共字符串getDateTime(){
        SimpleDateFormat的SDF =新的SimpleDateFormat(YYYY-MM-DD HH:MM:SS,Locale.US);
        返回sdf.format(mCalendar.getTime());
    }    //每一次被叫用户更改DatePicker的值
    @覆盖
    公共无效onDateChanged(查看的DatePicker,年整型,诠释monthOfYear,诠释请将dayOfMonth){
        //更新内部日历实例
        mCalendar.set(年,monthOfYear,请将dayOfMonth,mCalendar.get(Calendar.HOUR_OF_DAY),mCalendar.get(Calendar.MINUTE));
    }    //每一次被叫用户改变TimePicker值
    @覆盖
    公共无效onTimeChanged(TimePicker观点,诠释HOUROFDAY,分整型){
        //更新内部日历实例
        mCalendar.set(mCalendar.get(Calendar.YEAR),mCalendar.get(的Calendar.MONTH),mCalendar.get(Calendar.DAY_OF_MONTH),HOUROFDAY,分钟);
    }

这里的date_time_dialog.xml:

 <?XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@ + ID /的DateTimePicker
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =FILL_PARENT
    机器人:比重=中心
    机器人:方向=横向
    机器人:填充=5dip>    <的DatePicker
        机器人:ID =@ + ID / DatePicker的
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_gravity =中心
        机器人:layout_marginRight =40dp/>    < TimePicker
        机器人:ID =@ + ID / TimePicker
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_gravity =中心/>< / LinearLayout中>


解决方案

我想说感谢大家的帮助我,并带领我在正确的方向。我现在有一个更好的了解Android系统。下面是完整的工人阶级:

 进口java.text.SimpleDateFormat的;
进口的java.util.Calendar;
进口java.util.Locale中;进口android.app.Activity;
进口android.app.AlertDialog;
进口android.app.AlertDialog.Builder;
进口android.app.Dialog;
进口android.app.DialogFragment;
进口android.content.DialogInterface;
进口android.os.Bundle;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.widget.DatePicker;
进口android.widget.DatePicker.OnDateChangedListener;
进口android.widget.TimePicker;
进口android.widget.TimePicker.OnTimeChangedListener;公共类DateTimeDialogFragment扩展DialogFragment实现OnDateChangedListener,OnTimeChangedListener {
    //定义日期时间选择器常数。
    公众最终静态INT DATE_PICKER = 1;
    公众最终静态INT TIME_PICKER = 2;
    公众最终静态INT DATE_TIME_PICKER = 3;    // DatePicker的参考
    私人的DatePicker日期选择器;    // TimePicker参考
    私人TimePicker timePicker;    //日历参考
    私人日历mCalendar;    //定义活动
    私人活动活动;    //定义对话框类型
    私人诠释的DialogType;    //定义对话框视图
    私人查看MView的;    //构造函数启动
    公共DateTimeDialogFragment(活动活动){
        这个(活动,DATE_TIME_PICKER);
    }    公共DateTimeDialogFragment(活动活动,诠释的DialogType){
        this.activity =活动;
        this.DialogType =的DialogType;        //充气布局视图
        作为父视图//传递空值,因为它在该对话框的布局会
        LayoutInflater吹气= activity.getLayoutInflater();
        MVIEW = inflater.inflate(R.layout.date_time_dialog,NULL);        //取得日历实例
        mCalendar = Calendar.getInstance();        //初始化日期选择器
        日期选择器=(的DatePicker)mView.findViewById(R.id.DatePicker);
        datePicker.init(mCalendar.get(Calendar.YEAR),mCalendar.get(的Calendar.MONTH),mCalendar.get(Calendar.DAY_OF_MONTH),这一点);        //初始化时间选择器
        timePicker =(TimePicker)mView.findViewById(R.id.TimePicker);        //设置默认日历和时间样式
        setIs24HourView(真);
        setCalendarViewShown(假);        开关(的DialogType){
        案例DATE_PICKER:
            timePicker.setVisibility(View.GONE);
            打破;
        案例TIME_PICKER:
            datePicker.setVisibility(View.GONE);
            打破;
        }
    }    @覆盖
    公共对话框onCreateDialog(捆绑savedInstanceState){        //使用生成器类简单的对话框建设
        建设者建设者=新AlertDialog.Builder(活动);        //设置布局的对话框
        builder.setView(MVIEW);        //对话框的标题设置
        builder.setMessage(设定日期)
                //设置OK按钮
                .setPositiveButton(设置,
                        新DialogInterface.OnClickListener(){
                            公共无效的onClick(DialogInterface对话,诠释的id){
                                //用户确定的对话框
                            }
                        })
                //设置取消按钮
                .setNegativeButton(取消,
                        新DialogInterface.OnClickListener(){
                            公共无效的onClick(DialogInterface对话,诠释的id){
                                //用户取消了对话框
                                DateTimeDialogFragment.this.getDialog()取消()。
                            }
                        });        //创建AlertDialog对象,并将其返回
        返回builder.create();
    }    @覆盖
    公共无效onActivityCreated(捆绑savedInstanceState){
        super.onActivityCreated(savedInstanceState);
        timePicker.setOnTimeChangedListener(本);
    }    //便利的包装内部的日历实例
    公众诠释的get(最终诠释场){
        返回mCalendar.get(场);
    }    //便利的包装内部的日历实例
    众长getDateTimeMillis(){
        返回mCalendar.getTimeInMillis();
    }    //便利的包装内部TimePicker实例
    公共无效setIs24HourView(布尔is24HourView){
        timePicker.setIs24HourView(is24HourView);
    }    //便利的包装内部TimePicker实例
    公共布尔is24HourView(){
        返回timePicker.is24HourView();
    }    //便利的包装内部的DatePicker实例
    公共无效setCalendarViewShown(布尔calendarView){
        datePicker.setCalendarViewShown(calendarView);
    }    //便利的包装内部的DatePicker实例
    公共布尔CalendarViewShown(){
        返回datePicker.getCalendarViewShown();
    }    //便利的包装内部的DatePicker实例
    公共无效updateDate(年整型,诠释monthOfYear,诠释请将dayOfMonth){
        datePicker.updateDate(年,monthOfYear,请将dayOfMonth);
    }    //便利的包装内部TimePicker实例
    公共无效录入(INT currentHour的,诠释currentMinute){
        timePicker.setCurrentHour(currentHour的);
        timePicker.setCurrentMinute(currentMinute);
    }    公共字符串getDateTime(){
        SimpleDateFormat的SDF =新的SimpleDateFormat(YYYY-MM-DD HH:MM:SS,Locale.US);
        返回sdf.format(mCalendar.getTime());
    }    //每一次被叫用户更改DatePicker的值
    @覆盖
    公共无效onDateChanged(查看的DatePicker,年整型,诠释monthOfYear,诠释请将dayOfMonth){
        //更新内部日历实例
        mCalendar.set(年,monthOfYear,请将dayOfMonth,mCalendar.get(Calendar.HOUR_OF_DAY),mCalendar.get(Calendar.MINUTE));
    }    //每一次被叫用户改变TimePicker值
    @覆盖
    公共无效onTimeChanged(TimePicker观点,诠释HOUROFDAY,分整型){
        //更新内部日历实例
        mCalendar.set(mCalendar.get(Calendar.YEAR),mCalendar.get(的Calendar.MONTH),mCalendar.get(Calendar.DAY_OF_MONTH),HOUROFDAY,分钟);
    }
}

I can't seem to set up my DateTimeDialogFragment because it keeps crashing at the part where i put:

datePicker = (DatePicker) getView().findViewById(R.id.DatePicker);

Error Log:

02-14 21:38:43.262: E/AndroidRuntime(2435): FATAL EXCEPTION: main
02-14 21:38:43.262: E/AndroidRuntime(2435): java.lang.NullPointerException
02-14 21:38:43.262: E/AndroidRuntime(2435):     at com.test.DateTimeDialogFragment.onActivityCreated(DateTimeDialogFragment.java:98)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:847)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at android.app.BackStackRecord.run(BackStackRecord.java:622)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1382)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at android.os.Handler.handleCallback(Handler.java:605)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at android.os.Looper.loop(Looper.java:137)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at android.app.ActivityThread.main(ActivityThread.java:4424)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at java.lang.reflect.Method.invokeNative(Native Method)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at java.lang.reflect.Method.invoke(Method.java:511)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-14 21:38:43.262: E/AndroidRuntime(2435):     at dalvik.system.NativeStart.main(Native Method)

Here's the full code:

public class DateTimeDialogFragment extends DialogFragment implements
        OnDateChangedListener, OnTimeChangedListener {
    // Define constants for date-time picker.
    public final int DATE_PICKER = 1;
    public final int TIME_PICKER = 2;
    public final int DATE_TIME_PICKER = 3;

    // DatePicker reference
    private DatePicker datePicker;

    // TimePicker reference
    private TimePicker timePicker;

    // Calendar reference
    private Calendar mCalendar;

    // Define activity
    private Activity activity;

    // Define Dialog type
    private int intDialogType;

    // Constructor start
    public DateTimeDialogFragment(Activity activity) {
        this.activity = activity;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(activity);

        // Get the layout inflater
        LayoutInflater inflater = activity.getLayoutInflater();

        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout
        builder.setView(inflater.inflate(R.layout.date_time_dialog, null));

        // Set title of dialog
        builder.setMessage("Set Date")
                // Set Ok button
                .setPositiveButton("Set",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // User ok the dialog
                            }
                        })
                // Set Cancel button
                .setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // User cancelled the dialog
                            }
                        })
                // Set Neutral button (reset Time / Date)
                .setNeutralButton("Reset",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int id) {
                                // User reset the dialog
                                // reset();
                            }
                        });

        // Create the AlertDialog object and return it
        return builder.create();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
        // Grab a Calendar instance
        mCalendar = Calendar.getInstance();

        // Init date picker
        datePicker = (DatePicker) getView().findViewById(R.id.DatePicker);
        datePicker.init(mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH), this);

        // Init time picker
        timePicker = (TimePicker) getView().findViewById(R.id.TimePicker);
        timePicker.setOnTimeChangedListener(this);
    }

    public void setIntDialogType(int intDialogType) {
        this.intDialogType = intDialogType;
    }

    // Convenience wrapper for internal Calendar instance
    public int get(final int field) {
        return mCalendar.get(field);
    }

    // Reset DatePicker, TimePicker and internal Calendar instance
    public void reset() {
        final Calendar c = Calendar.getInstance();
        updateDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
        updateTime(c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE));
    }

    // Convenience wrapper for internal Calendar instance
    public long getDateTimeMillis() {
        return mCalendar.getTimeInMillis();
    }

    // Convenience wrapper for internal TimePicker instance
    public void setIs24HourView(boolean is24HourView) {
        timePicker.setIs24HourView(is24HourView);
    }

    // Convenience wrapper for internal TimePicker instance
    public boolean is24HourView() {
        return timePicker.is24HourView();
    }

    // Convenience wrapper for internal DatePicker instance
    public void setCalendarViewShown(boolean calendarView) {
        datePicker.setCalendarViewShown(calendarView);
    }

    // Convenience wrapper for internal DatePicker instance
    public boolean CalendarViewShown() {
        return datePicker.getCalendarViewShown();
    }

    // Convenience wrapper for internal DatePicker instance
    public void updateDate(int year, int monthOfYear, int dayOfMonth) {
        datePicker.updateDate(year, monthOfYear, dayOfMonth);
    }

    // Convenience wrapper for internal TimePicker instance
    public void updateTime(int currentHour, int currentMinute) {
        timePicker.setCurrentHour(currentHour);
        timePicker.setCurrentMinute(currentMinute);
    }

    public String getDateTime() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
        return sdf.format(mCalendar.getTime());
    }

    // Called every time the user changes DatePicker values
    @Override
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        // Update the internal Calendar instance
        mCalendar.set(year, monthOfYear, dayOfMonth, mCalendar.get(Calendar.HOUR_OF_DAY), mCalendar.get(Calendar.MINUTE));
    }

    // Called every time the user changes TimePicker values
    @Override
    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
        // Update the internal Calendar instance
        mCalendar.set(mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH), hourOfDay, minute);
    }

Here's the date_time_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/DateTimePicker"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="horizontal"
    android:padding="5dip" >

    <DatePicker
        android:id="@+id/DatePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginRight="40dp" />

    <TimePicker
        android:id="@+id/TimePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />

</LinearLayout>

解决方案

I want to say thanks to everyone for helping me out and leading me in the right direction. I now have a much better understanding of Android. Here's the full working class:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;

public class DateTimeDialogFragment extends DialogFragment implements OnDateChangedListener, OnTimeChangedListener {
    // Define constants for date-time picker.
    public final static int DATE_PICKER = 1;
    public final static int TIME_PICKER = 2;
    public final static int DATE_TIME_PICKER = 3;

    // DatePicker reference
    private DatePicker datePicker;

    // TimePicker reference
    private TimePicker timePicker;

    // Calendar reference
    private Calendar mCalendar;

    // Define activity
    private Activity activity;

    // Define Dialog type
    private int DialogType;

    // Define Dialog view
    private View mView;

    // Constructor start
    public DateTimeDialogFragment(Activity activity) {
        this(activity, DATE_TIME_PICKER);
    }

    public DateTimeDialogFragment(Activity activity, int DialogType) {
        this.activity = activity;
        this.DialogType = DialogType;

        // Inflate layout for the view
        // Pass null as the parent view because its going in the dialog layout
        LayoutInflater inflater = activity.getLayoutInflater();
        mView = inflater.inflate(R.layout.date_time_dialog, null);  

        // Grab a Calendar instance
        mCalendar = Calendar.getInstance();

        // Init date picker
        datePicker = (DatePicker) mView.findViewById(R.id.DatePicker);
        datePicker.init(mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH), this);

        // Init time picker
        timePicker = (TimePicker) mView.findViewById(R.id.TimePicker);

        // Set default Calendar and Time Style
        setIs24HourView(true);
        setCalendarViewShown(false);

        switch (DialogType) {
        case DATE_PICKER:
            timePicker.setVisibility(View.GONE);
            break;
        case TIME_PICKER:
            datePicker.setVisibility(View.GONE);
            break;
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        // Use the Builder class for convenient dialog construction
        Builder builder = new AlertDialog.Builder(activity);

        // Set the layout for the dialog
        builder.setView(mView);

        // Set title of dialog
        builder.setMessage("Set Date")
                // Set Ok button
                .setPositiveButton("Set",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // User ok the dialog
                            }
                        })
                // Set Cancel button
                .setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // User cancelled the dialog
                                DateTimeDialogFragment.this.getDialog().cancel();
                            }
                        }); 

        // Create the AlertDialog object and return it
        return builder.create();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        timePicker.setOnTimeChangedListener(this);
    }

    // Convenience wrapper for internal Calendar instance
    public int get(final int field) {
        return mCalendar.get(field);
    }

    // Convenience wrapper for internal Calendar instance
    public long getDateTimeMillis() {
        return mCalendar.getTimeInMillis();
    }

    // Convenience wrapper for internal TimePicker instance
    public void setIs24HourView(boolean is24HourView) {
        timePicker.setIs24HourView(is24HourView);
    }

    // Convenience wrapper for internal TimePicker instance
    public boolean is24HourView() {
        return timePicker.is24HourView();
    }

    // Convenience wrapper for internal DatePicker instance
    public void setCalendarViewShown(boolean calendarView) {
        datePicker.setCalendarViewShown(calendarView);
    }

    // Convenience wrapper for internal DatePicker instance
    public boolean CalendarViewShown() {
        return datePicker.getCalendarViewShown();
    }

    // Convenience wrapper for internal DatePicker instance
    public void updateDate(int year, int monthOfYear, int dayOfMonth) {
        datePicker.updateDate(year, monthOfYear, dayOfMonth);
    }

    // Convenience wrapper for internal TimePicker instance
    public void updateTime(int currentHour, int currentMinute) {
        timePicker.setCurrentHour(currentHour);
        timePicker.setCurrentMinute(currentMinute);
    }

    public String getDateTime() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
        return sdf.format(mCalendar.getTime());
    }

    // Called every time the user changes DatePicker values
    @Override
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        // Update the internal Calendar instance
        mCalendar.set(year, monthOfYear, dayOfMonth, mCalendar.get(Calendar.HOUR_OF_DAY), mCalendar.get(Calendar.MINUTE));
    }

    // Called every time the user changes TimePicker values
    @Override
    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
        // Update the internal Calendar instance
        mCalendar.set(mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH), hourOfDay, minute);
    }
}

这篇关于日期+时间选择器中DialogFragment实现OnDateChangedListener和OnTimeChangedListener的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆