Android 日期+;DialogFragment中的时间选择器实现OnDateChangedListener和OnTimeChangedListener
我似乎无法设置DateTimeDialogFragment,因为它在我放置的部分不断崩溃:Android 日期+;DialogFragment中的时间选择器实现OnDateChangedListener和OnTimeChangedListener,android,Android,我似乎无法设置DateTimeDialogFragment,因为它在我放置的部分不断崩溃: datePicker = (DatePicker) getView().findViewById(R.id.DatePicker); 错误日志: 02-14 21:38:43.262: E/AndroidRuntime(2435): FATAL EXCEPTION: main 02-14 21:38:43.262: E/AndroidRuntime(2435): java.lang.NullPointe
datePicker = (DatePicker) getView().findViewById(R.id.DatePicker);
错误日志:
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)
以下是完整的代码:
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);
}
以下是date\u time\u 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>
您可以尝试不使用AlertDialog.Builder的实现,并且可以参考视图。这样您就可以调用view.findviewbyd(R.id.yourViewItem)
编辑:普拉格纳尼的解决方案和建议也帮助了我。非常感谢。我想感谢所有帮助我走出困境并带领我走向正确方向的人。我现在对Android有了更好的理解。以下是全体工人阶级:
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);
}
}
编辑:
您好,我已经与您的代码相同,我能够打开日期和时间选择器对话框。。。
你错过的地方是你没有膨胀布局以获得视图
尝试更改您的OnActivity创建如下
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
// Grab a Calendar instance
mCalendar = Calendar.getInstance();
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
View v=inflater.inflate(R.layout.date_time_dialog, null);
// Init date picker
datePicker = (DatePicker)v.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) v.findViewById(R.id.TimePicker);
timePicker.setOnTimeChangedListener(this);
}
这将解决您的问题…我很自信,因为使用相同的代码,我成功地打开了对话框
您好,请参阅本文档中关于
根据文档这是在onCreateView(LayoutInflater、ViewGroup、Bundle)之后和onViewStateRestored(Bundle)之前调用的。您需要使用onCreateView获取datePicker=(datePicker)getView().findViewById(R.id.datePicker);这我不确定,但我已经用这样的对话框实现了DatePicker,这可能会有所帮助
public class DateDialogFragment extends DialogFragment implements
OnDateSetListener {
boolean fired = false;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
if (fired == true) {
return;
} else {
// first time fired
fired = true;
}
String date = checkDigit(monthOfYear + 1) + "/"
+ checkDigit(dayOfMonth) + "/" + year;
strDate = date;
getAppointments(date);
}
}
设置结果日期的格式
public String checkDigit(int number) {
return number <= 9 ? "0" + number : String.valueOf(number);
}
我有点困惑的是,如何从我在“builder.setView”中使用的布局中访问R.id.DatePicker,这样我就可以访问timePicker和DatePicker。我试着清理这个项目,但仍然出现同样的错误。由于某种原因,datePicker对象在执行您上面提到的行后仍然为null。请尝试使用getDialog()
而不是getView()
。同样,null指针引用,它找不到R.id.datePicker。我想知道我是否不应该在onActivityCreated方法中执行此操作。我不明白如何使用getActivity()
而不是getView()
并进行尝试。这允许我运行它,但如果我运行setter:setCalendarViewShowed,它会崩溃。很明显,我在这里遗漏了一些东西,我已经读了几个小时了,还没有找到为什么找不到R.id.DatePicker的线索,我试图清理项目,甚至重置了模拟器,你对R.id.DatePicker也有同样的问题吗?我的错误,我已经按照你的建议做了,在使用你的方法时,我没有得到空指针引用。虽然我无法更改日期选择器,因为那样会使它崩溃。在使用您的方法时,我也无法使用setNegativeButton/setNeutralButton。我必须继续努力找出为什么在使用AlertDialog.BuilderAbout负按钮和正按钮时无法访问R.id.DatePicker,您可以在布局文件中定义两个按钮,并在其上设置onClickListener
)我想我不能对它进行更改,因为视图是在构造函数运行之后创建的(显然)。因此,基本上视图方法不允许我使用setter方法来更改小时格式和日历显示。伙计,我快发疯了,我已经做了14个小时了。我的问题是,onCreateDialog在onActivityCreated之后会启动吗?我使用AlertDialog.Builder的原因是创建正/中性/负按钮。我从这里得到了这个想法:哈哈,我是个笨蛋。哦,我的天,非常感谢你!我现在可以睡觉了,我想一天15个小时就足够了。感谢所有帮助过我的人。谢谢大家!!我想知道一件事,你为什么要这么做?我真的不明白那部分。我认为资源已经膨胀了,所以我认为你不能膨胀两次!虽然我无法更改is24HourView和SetCalendarView,但它仍能正常工作,但我将在明天睡觉并尝试一下,谢谢you@user1848850欢迎朋友…我也和你一样是新手…我之前没有用过这个…谢谢你,因为我今天学到了一些东西…睡个好觉…非常感谢!这是一个完美的实现。我一直在寻找这样的东西,因为2-3天!片段不应该使用构造函数。如何从@user1848850获取所选日期和时间
DateDialogFragment datepicker = new DateDialogFragment();
datepicker.show(getSupportFragmentManager(), "DatePicker");