【问题标题】:Getting values of date and time from DialogFragment inside a fragment Android从片段Android中的DialogFragment获取日期和时间值
【发布时间】:2017-03-07 19:14:57
【问题描述】:

您好,尝试从各自的类中获取日期和时间的值,并将它们设置在片段中的文本视图上。 我试过将它设置在一个变量中并从方法中调用它,但它似乎不起作用

这是我在片段类中的代码,我想设置文本视图 set_date 和 set_time

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_edit_timetable, container, false);

    selectDate = (Button) view.findViewById(R.id.selectDate);
    selectTime = (Button) view.findViewById(R.id.selectTime);
    set_date = (TextView) view.findViewById(R.id.set_date);
    set_time = (TextView) view.findViewById(R.id.set_time);
    selectDate.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            // Show Date dialog
            DialogFragment newFragment = new SelectDateFragment();
            newFragment.show(getActivity().getFragmentManager(), "Date Picker");

        }
    });
    selectTime.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            // Show time dialog
            DialogFragment newFragment  = new SelectTimeFragment();
            //newFragment.show(getActivity().getFragmentManager(), DIALOG_TIME);
            newFragment.show(getActivity().getFragmentManager(), "Time Picker");
        }
    });

    return view;
}

SelectDateFragment 类

public class SelectDateFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

private String date = "";
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Calendar calendar = Calendar.getInstance();
    int yy = calendar.get(Calendar.YEAR);
    int mm = calendar.get(Calendar.MONTH);
    int dd = calendar.get(Calendar.DAY_OF_MONTH);
    return new DatePickerDialog(getActivity(), this, yy, mm, dd);
}

@Override
public void onDateSet(DatePicker view, int yy, int mm, int dd) {
    populateSetDate(yy, mm+1, dd);
}
public void populateSetDate(int year, int month, int day) {
    date = month+"/"+day+"/"+year;
}

public String getDate() {
    return date;
}

SelectTimeFragment 类

public class SelectTimeFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener {

private String time = "";
public SelectTimeFragment() {
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the current time as the default values for the picker

    final Calendar calendar = Calendar.getInstance();
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int minute = calendar.get(Calendar.MINUTE);

    // Create a new instance of TimePickerDialog and return it
    return new TimePickerDialog(getActivity(), this, hour, minute,
            DateFormat.is24HourFormat(getActivity()));
}

@Override
public void onTimeSet(TimePicker view, int hour, int minute) {
    time = String.valueOf(hour) + ":" + String.valueOf(minute);

}

public String getTime() {
    return time;
}

【问题讨论】:

  • 为什么要使用片段对话框。 DatePickerDialog 就足够了,您应该在按钮的 onClick 处创建并显示它。
  • 只关注日期字段,您是否确认您在onDateSet() 中获得了您期望的值?

标签: android android-fragments datepicker fragment timepicker


【解决方案1】:

在您的 Select[Date/Time]Fragment 中添加此方法。

private void sendResult(int resultCode, Date mDate) {
    if (getTargetFragment() == null)
        return;
    Intent i = new Intent();
    i.putExtra("EXTRA_DATE", mDate);
    getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, i);
}

在您的 populateSetDate() 中添加这一行

public void populateSetDate(int year, int month, int day) {
    date = month+"/"+day+"/"+year;
    sendResult(Activity.RESULT_OK, date); //add this
}

在 dialogFragment 实例下添加这一行

selectDate.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
        DialogFragment newFragment = new SelectDateFragment();
        newFragment.setTargetFragment(TIMETABLE_FRAGMENT, REQUEST_DATE); // add this
        newFragment.show(getActivity().getFragmentManager(), "Date Picker");

    }
});

最后将此方法添加到您的 TIMETABLE_FRAGMENT 中

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != Activity.RESULT_OK)
        return;

    if (requestCode ==REQUEST_DATE) {
        date = (Date) data.getSerializableExtra("EXTRA_DATE"); // this your selected date
    }
}

【讨论】:

  • 我遇到 2 个错误,在片段时间表中找不到符号 REQUEST_DATE 和 CommonFunctoins
  • Request_date 只是一个唯一的代码。例如;请求日期=1234,请求时间=5678。你将需要那些在你的 onActivtyResult() 中。对不起 CommonFunctions :) 这是我的通用函数类。
  • 还是没有运气,这行是否应该设置为:newFragment.setTargetFragment(newFragment, 1234);还是我需要用 timetable_fragment 的实例替换“newFragment”
  • 不,你不应该。它应该是这样的。 newFragment.setTargetFragment(what_is your_called_fragment,1234)。实际上,它是您问题的第一个引用中 onCreateView() 的父片段
【解决方案2】:

假设您在onDateSet 中获得了预期的数据,请尝试以下操作:

SelectDateFragment 中删除implements 并删除onDateSet。更改您呼叫DatePickerDialog 的方式。

public class SelectDateFragment extends DialogFragment {

private String date = "";

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Calendar calendar = Calendar.getInstance();
    int yy = calendar.get(Calendar.YEAR);
    int mm = calendar.get(Calendar.MONTH);
    int dd = calendar.get(Calendar.DAY_OF_MONTH);

    return new DatePickerDialog(getActivity(), (DatePickerDialog.OnDateSetListener) getParentFragment(), yy, mm, dd);
}

public void populateSetDate(int year, int month, int day) {
    date = month+"/"+day+"/"+year;
}

public String getDate() {
    return date;
}

implements 添加到顶级片段。您将在此处设置日期和时间。另外,在此处添加onDateSet

Public class YourTopFragment extends Fragment implements DatePickerDialog.OnDateSetListener

...

@Override
public void onDateSet(DatePicker view, int yy, int mm, int dd) {
    set_date.setText(...the text you want to set goes here...);
}

这将指示DialogFragment 直接通知您的顶级片段所选日期。

类似的东西应该可以用来设置时间。

【讨论】:

猜你喜欢
  • 2021-09-26
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多