Вы можете использовать слушателей связать ваш fragments
друг с другом. Я взял то, что у вас было, и немного изменил его, добавив слушателя для каждого fragment
. Затем я создал делегата , который управляет двумя fragments
и объединяет результаты аккуратно в один объект Calendar
. Вы можете получить результат, как хотите. Возможно, с другим слушателем.
УКАЗАНИЕ что это не лучшее решение, архитектурно говорящее, поскольку я выбросил его в течение нескольких минут. Вы можете перемещать вещи вокруг, чтобы получить шаблон, который наилучшим образом соответствует сценарию.
Вот пример кода.
Вы можете вызвать диалог с вашей Activity
как этот
private void showDateTimeDialog() {
final FragmentManager fm = getSupportFragmentManager();
DateTimeDialog dateTimeDialog = new DateTimeDialog(this, fm);
dateTimeDialog.show();
}
DateTimeDialog.Java
import android.app.Activity;
import android.support.v4.app.FragmentManager;
import android.widget.Toast;
import java.util.Calendar;
public class DateTimeDialog {
private Activity activity;
private DatePickerFragment datePickerFragment;
private TimePickerFragment timePickerFragment;
private FragmentManager fragmentManager;
private Calendar calendar;
public DateTimeDialog(Activity activity, FragmentManager fragmentManager) {
this.activity = activity;
this.fragmentManager = fragmentManager;
this.calendar = Calendar.getInstance();
this.datePickerFragment = new DatePickerFragment();
this.timePickerFragment = new TimePickerFragment();
this.datePickerFragment.setOnDateSelectedListener(getOnDateSelectedListener());
this.timePickerFragment.setOnTimeSelectedListener(getOnTimeSelectedListener());
}
public void show() {
datePickerFragment.show(fragmentManager, "datePickerFragment");
}
private TimePickerFragment.OnTimeSelectedListener getOnTimeSelectedListener() {
return new TimePickerFragment.OnTimeSelectedListener() {
@Override
public void onTimeSelected(int hourOfDay, int minute) {
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
// Here you have your finished result.
Toast.makeText(activity, calendar.getTime().toString(), Toast.LENGTH_LONG).show();
}
};
}
private DatePickerFragment.OnDateSelectedListener getOnDateSelectedListener() {
return new DatePickerFragment.OnDateSelectedListener() {
@Override
public void onDateSelected(int year, int monthOfYear, int dayOfMonth) {
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, monthOfYear);
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
timePickerFragment.show(fragmentManager, "timePickerFragment");
}
};
}
}
DatePickerFragment.java
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.widget.DatePicker;
import java.util.Calendar;
public class DatePickerFragment
extends DialogFragment implements DatePickerDialog.OnDateSetListener {
private OnDateSelectedListener onDateSelectedListener;
public void setOnDateSelectedListener(OnDateSelectedListener onDateSelectedListener) {
this.onDateSelectedListener = onDateSelectedListener;
}
@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);
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
onDateSelectedListener.onDateSelected(year, monthOfYear, dayOfMonth);
}
public interface OnDateSelectedListener {
void onDateSelected(int year, int monthOfYear, int dayOfMonth);
}
}
TimePickerFragment.java
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.text.format.DateFormat;
import android.widget.TimePicker;
import java.util.Calendar;
public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener {
private OnTimeSelectedListener onTimeSelectedListener;
public void setOnTimeSelectedListener(OnTimeSelectedListener onTimeSelectedListener) {
this.onTimeSelectedListener = onTimeSelectedListener;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Calendar c=Calendar.getInstance();
int hour=c.get(Calendar.HOUR_OF_DAY);
int minute=c.get(Calendar.MINUTE);
return new TimePickerDialog(getActivity(),this,hour,minute, DateFormat.is24HourFormat(getActivity()));
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
onTimeSelectedListener.onTimeSelected(hourOfDay, minute);
}
public interface OnTimeSelectedListener {
void onTimeSelected(int hourOfDay, int minute);
}
}