【问题标题】:Return value from Timepicker in Dialogfragment to the calling fragment从 Dialogfragment 中的 Timepicker 返回值到调用片段
【发布时间】:2014-07-30 01:44:14
【问题描述】:

我正在尝试从片段中打开 Dialogfragment。 dialogFragment 有一个 Timepicker,我想将选定的小时和分钟从 timepicker 返回到调用片段。我怎样才能做到这一点?我从问题中尝试了以下内容,但无法使其工作。有人可以为以下解决方案提供伪代码(显示在最后)

我的代码显示片段中的对话框:

TimePickerFragment timepicker = TimePickerFragment.newInstance(1);
timepicker.show(getFragmentManager(), "timepickerfrag");

Dialogfragment的代码:

public class TimePickerFragment extends DisplayDialogFragment implements     View.OnClickListener {
private static final String ARG_PARAM1 = "param1";
private int mParam1;
private TimePicker time;
private Button bt1, bt2;
private TimePicker tm;

public static TimePickerFragment newInstance(int param1) {
TimePickerFragment fragment = new TimePickerFragment();
fragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
Bundle args = new Bundle();
args.putInt(ARG_PARAM1, param1);
fragment.setArguments(args);
return fragment;
}

public TimePickerFragment() {
// Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getInt(ARG_PARAM1);
}
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
 Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_time_picker_scheduler, container, false);
bt1 = (Button) view.findViewById(R.id.sched_time_pck_btn_ok);
bt2 = (Button) view.findViewById(R.id.sched_time_pck_btn_cancel);
tm = (TimePicker) view.findViewById(R.id.sched_dialog_time_picker);
bt1.setOnClickListener(this);
bt2.setOnClickListener(this);
return view;
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.sched_time_pck_btn_cancel:
dismiss();
break;
case R.id.sched_time_pck_btn_ok:
dismiss();
break;
}
}

}

Receive result from DialogFragment

在显示对话框的地方使用 myDialogFragment.setTargetFragment(this, MY_REQUEST_CODE),然后在对话框完成后,您可以从中调用 getTargetFragment().onActivityResult(getTargetRequestCode(), ... ),并在包含的片段中实现 onActivityResult()。 这似乎是对 onActivityResult() 的滥用,尤其是因为它根本不涉及活动。但是我已经看到了官方 google 人推荐的,甚至可能在 api 演示中。我认为这是添加 g/setTargetFragment() 的目的。

【问题讨论】:

    标签: android android-fragments android-dialogfragment timepicker


    【解决方案1】:

    这应该会有所帮助。将其添加到您正在显示对话框的Fragment 中。

    // {@link CustomFragment} - current fragment which invokes dialog.
    // {@link CustomDialogFragment} - DialogFragment implementation to show.
    // REQUEST_GET_DATE - Request code for call.
    CustomDialogFragment dialog = new CustomDialogFragment(getActivity());
    dialog.setTargetFragment(CustomFragment.this, REQUEST_GET_DATE);
    dialog.show(getActivity().getSupportFragmentManager(), "Dialog");
    
    // Result handling
    // REQUEST_GET_DATE - Constant int for request
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
      if (resultCode == Activity.RESULT_OK) {
        switch (requestCode) {
          case REQUEST_GET_DATE:
            String extra = data.getStringExtra(DateTimeDialogFragment.EXTRA_DATE);
            // Handle response here..
            break;
        }
      }
    }
    
    
    // Inside CustomDialogFragment::onCreateDialog(Bundle savedInstanceState)
    public Dialog onCreateDialog(Bundle savedInstanceState) {
      // Use the Builder class for convenient dialog construction
      Builder builder = new AlertDialog.Builder(mActivity);
    
      // Set the layout for the dialog
      builder.setView(mView);
      builder
        .setMessage("Title")
        .setPositiveButton("Set",
          new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
              // User ok the dialog
              // Important part!
              // -----
              Intent intent = getActivity().getIntent();
              intent.putExtra(EXTRA_DATE, getDateTime());
              getTargetFragment().onActivityResult(CustomFragment.REQUEST_GET_DATE, Activity.RESULT_OK, intent);
              // -----
              getDialog().hide();
            }
          })
          .setNegativeButton("Cancel",
            new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int id) {
                getDialog().cancel();
            }
          });
      // Create the AlertDialog object and return it
      return builder.create();
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多