Looked at similar issues' answers but coudn't figure out how to apply them to my code. There's information on this feature on the internet, but maybe because Android code is so cumbersome in comparison to other code (in my experience), it's hard for me to find where the problem is.
The CalendarFragment:
public class CalendarFragment extends DialogFragment{
@RequiresApi(api = Build.VERSION_CODES.N)
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), (DatePickerDialog.OnDateSetListener)getTargetFragment(),
year, month, day);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_calendar, container, false);
}
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}
The DatesFragment:
public class DatesFragment extends Fragment implements DatePickerDialog.OnDateSetListener {
String selectedDate;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_dates, container, false);
showCalendar = view.findViewById(R.id.calendar_button);
showCalendar.setOnClickListener(v -> {
DialogFragment calendarFragment = new CalendarFragment();
calendarFragment.show(getChildFragmentManager(), "calendar");
// ...
return view;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
selectedDate = DateFormat.getDateInstance(DateFormat.FULL).format(calendar.getTime());
}
Thanks!
@laalto raised the possibily that I didn't write a setTargetFragment() method before calling getTargetFragment(). It was the case and after adding setTargetFragment() onDateSet() was called.