我有一个活动,我想要的只是
活动 - > OnClick一些布局(有textview) - >打开 日期选择器 - >在txtvalue中设置选定的值
我希望使用带有代码的DialogFragment来使用Datepicker。
package com.app.ourforms.date;
import java.util.Calendar;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.util.Log;
import android.widget.DatePicker;
import android.widget.TextView;
public class DatePickerFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
TextView txt;
public DatePickerFragment() {
}
public DatePickerFragment(TextView txt) {
this.txt = txt;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceSateate) {
Log.i("TAG", "Inside onCreateDialog");
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
Log.i("TAG", "Inside onDateSet");
txt.setText(day + "/" + (month + 1) + "/" + year);
// Do something with the date chosen
}
}
以上代码当设备未更改其方向时,工作正常。但是当显示Datepicker并且方向更改时,我将强制关闭,如下面
01-04 07:34:14.580: E/AndroidRuntime(2375): FATAL EXCEPTION: main
01-04 07:34:14.580: E/AndroidRuntime(2375): java.lang.NullPointerException
01-04 07:34:14.580: E/AndroidRuntime(2375): at com.app.ourforms.date.DatePickerFragment.onDateSet(DatePickerFragment.java:39)
01-04 07:34:14.580: E/AndroidRuntime(2375): at android.app.DatePickerDialog.tryNotifyDateSet(DatePickerDialog.java:148)
01-04 07:34:14.580: E/AndroidRuntime(2375): at android.app.DatePickerDialog.onClick(DatePickerDialog.java:116)
01-04 07:34:14.580: E/AndroidRuntime(2375): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
01-04 07:34:14.580: E/AndroidRuntime(2375): at android.os.Handler.dispatchMessage(Handler.java:99)
01-04 07:34:14.580: E/AndroidRuntime(2375): at android.os.Looper.loop(Looper.java:137)
01-04 07:34:14.580: E/AndroidRuntime(2375): at android.app.ActivityThread.main(ActivityThread.java:5039)
01-04 07:34:14.580: E/AndroidRuntime(2375): at java.lang.reflect.Method.invokeNative(Native Method)
01-04 07:34:14.580: E/AndroidRuntime(2375): at java.lang.reflect.Method.invoke(Method.java:511)
01-04 07:34:14.580: E/AndroidRuntime(2375): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-04 07:34:14.580: E/AndroidRuntime(2375): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-04 07:34:14.580: E/AndroidRuntime(2375): at dalvik.system.NativeStart.main(Native Method)
这是我调用DatePickerFragment
的方法public void showDatePickerDialog(View v) {
Log.i("TAG", "Inside showDatePickerDialog");
DialogFragment newFragment = new DatePickerFragment((TextView)v);
newFragment.show(getFragmentManager(), "datePicker");
}
请帮我摆脱这个。 在此先感谢。
答案 0 :(得分:3)
我不确定此解决方案适合您,但您可以尝试一下。
您遇到的问题因为每次定向更改时您的活动都会重新加载。您可以调用OnConfigurationchanged()
方法,在Menifest文件中,您可以将Configuchanges设置为orientation|screensize
通过执行此操作,您的活动将不会在方向更改时加载,并且您将不会更长时间面对您当前面临的问题。
可以帮助你。
答案 1 :(得分:1)
您的TextView引用为null。 NPE位于DatePickerFragment的第39行。它为null的原因是因为当方向更改时,将重新创建整个视图层次结构,并且对传递给DatePickerFragment的TextView的引用不再存在。
尝试传入TextView的ID,而不是传入TextView实例。
new DatePickerFragment(v.getId());
然后实施
public Bundle onSaveInstanceState ()
和
public void onRestoreInstanceState (Bundle savedInstanceState)
在销毁和重新创建DatePickerDialog时保存和恢复TextView的ID。
然后您需要使用
getActivity().findViewById(your_text_view_ID)
在视图层次结构中查找TextView实例,以便您可以设置文本。