【问题标题】:Trying to set text of EditText from DatePicker DialogFragment尝试从 DatePicker DialogFragment 设置 EditText 的文本
【发布时间】:2023-04-03 07:05:01
【问题描述】:

我只是想从我在网上找到的许多 android datepicker 教程之一创建的 datepicker 对话框中获取日期。一旦选择了文本日期,我似乎在实际检索文本日期的某个地方出错了。我有一个 DatePickerFragment 类,它是从嵌套在我的 MainActivity 活动类中的 CreateEvent 片段中调用的。这是日期选择器:

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,我理解这意味着它实际上无法在我的创建事件片段 xml 文件中找到 edittext 元素。

我应该如何从onDateSet 设置这个edittext 元素的文本,还是我必须改变我的方法?

我试过this way但没有用。

【问题讨论】:

  • txtDate = (EditText)view.findViewById(R.id.txtDate);错了,datepicker中没有编辑文本,检查我的答案
  • 对不起,我不明白。您是否尝试从 DatePicker 检索实际日期并将其显示在 EditText 中,还是要将其设置在 DatePicker 上?
  • 在 EditText 中显示它

标签: java android android-fragments datepicker android-dialogfragment


【解决方案1】:

您需要使用接口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
}

你应该很高兴。

【讨论】:

  • 但是DialogFragment中没有onCreateView?
  • 好的,但我也没有此对话框片段的自定义 xml 文件。所以 R.layout.customdialog 不适用
  • 使用一个。否则您将无法访问 EditText。 (需要布局?)
  • EditText 位于我的创建事件片段布局文件中的表单上,而不是 dateepicker 上
【解决方案2】:

我通过下面的代码行完成了这个:

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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    相关资源
    最近更新 更多