ダイアログフレグメントのTimePickerから呼び出しフラグメントへの戻り値
-
20-12-2019 - |
質問
フラグメントからダイアログフレグメントを開こうとしています。ダイアログフラグメントには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;
}
}
}
.
ダイアログを表示している場所からMyDialogFragment.ettargetFragment(この、my_request_code)を使用してから、ダイアログが終了したら、GetTargetFragment()を呼び出すことができます。OnActivityResult(getTargetRequestCode()、... )、および含有フラグメント内のOnActivityResult()を実装します。 特に活動を伴わないように、OnActivityResult()の乱用のようなようです。しかし、私はそれが公式のGoogleの人々によって推薦され、そして多分APIのデモでさえも見ました。 g / settargetFragment()が追加されたものだと思います。
解決
これは助けるべきです。ダイアログを表示している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();
}
. 所属していません StackOverflow