尝试从DatePicker DialogFragment设置EditText的文本
我只是试图从我在网上找到的许多android datepicker教程中创建的一个datepicker对话框中获取日期。 一旦选中,我在实际检索文本日期的某个地方似乎出错了。 我有一个DatePickerFragment类,它从一个嵌入我的MainActivity活动类中的CreateEvent片段调用。 这是DatePicker:
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { private EditText txtDate; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current date as the default date in the picker 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); // Create a new instance of DatePickerDialog and return it return new DatePickerDialog(getActivity(), this, year, month, day); } public void onDateSet(DatePicker view, int year, int month, int day) { txtDate = (EditText)view.findViewById(R.id.txtDate); txtDate.setText(day + " " + (month + 1) + " " + year); } }
当我实际尝试设置日期时,我尝试Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence) on a null object reference
,我理解这意味着它无法实际找到edittext元素在我的create事件片段xml文件中。
我应该如何从onDateSet
设置此edittext元素的文本,还是必须更改我的方法?
我试过这种方式,但无济于事。
您需要使用接口将数据从datepicker
到调用者fragment
:
public interface DateListener { void passDate(String date); }
创建一个名为mListener
的成员变量 :
private DateListener mListener;
重写onAttach
和onDetach
fragment
方法:
@Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (DateListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement DateListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; }
接下来,在调用者fragment
实现此interface
并覆盖passDate
方法:
@Override public void passDate(String date) { // Do something with 'date', yourEditText.setText(date) for the example }
你应该好好去。
我通过下面的代码行完成了这个:
public class DatePickerDialogMy extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { DateSetting dateSetting=new DateSetting(getActivity()); Calendar calendar= Calendar.getInstance(); int year= calendar.get(calendar.YEAR); int month=calendar.get(calendar.MONTH); int day=calendar.get(calendar.DAY_OF_MONTH); DatePickerDialog dialog; dialog=new DatePickerDialog(getActivity(),dateSetting,year,month,day); return dialog; } }
第二类:
public class DateSetting implements android.app.DatePickerDialog.OnDateSetListener { Context context; public DateSetting(Context context){ this.context=context; } @Override public void onDateSet(DatePicker view, int year, int dateSetting, int dayOfMonth) { Toast.makeText(context, "selected date:" + dateSetting + "/" + dayOfMonth + "/" + year, Toast.LENGTH_LONG).show(); // MainActivity.test.setText(String.valueOf(dateSetting)); MyActivity.dobEditText.setText(dateSetting+"/"+dayOfMonth+ "/" + year); } }
怎么称呼:
DatePickerDialogMy datePickerDialog = new DatePickerDialogMy(); datePickerDialog.show(getSupportFragmentManager(), "date_picker");