Получить дату с datepicker с помощью dialogfragment
Я использую пример google для вставки datepicker внутри моего приложения, используя dialogfragment
http://developer.android.com/guide/topics/ui/controls/pickers.html
Но я не уверен, как получить дату после его установки (не эксперт java). Dialog и datepicker работают нормально, и я могу зарегистрировать эту дату, но я могу сделать, чтобы выполнить обратный вызов в родительской активности?
Это мой фрагмент диалога
public class DatePickerFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
@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);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
**Log.w("DatePicker","Date = " + year);**
}
}
... и я вызываю диалог из моей активности с помощью...
public void showDatePickerDialog(View v) {
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getSupportFragmentManager(), "datePicker");
}
Каков правильный способ вызова метода в моей родительской деятельности вместо Log.w? Я полагаю, что это связано с передачей обратного вызова в качестве параметра или чего-то другого, но большинство ссылок, которые я нашел в Интернете, касаются предыдущих версий без диалоговых фрагментов
EDIT: не уверен, что важная, но родительская активность объявлена как:
public class EditSessionActivity extends FragmentActivity {
РЕШЕНИЕ: благодаря пользователю Lecho это способ сделать это
DatePickerFragmennt.class
public class DatePickerFragment extends DialogFragment{
@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(), (EditSessionActivity)getActivity(), year, month, day);
}
}
... и родительская активность EditSessionActivity.class...
public class EditSessionActivity extends FragmentActivity implements OnDateSetListener {
...
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
//do some stuff for example write on log and update TextField on activity
Log.w("DatePicker","Date = " + year);
((EditText) findViewById(R.id.tf_date)).setText("Date = " + year);
}
Ответы
Ответ 1
Конструктор fo DatePickerDialog
принимает DatePickerDialog.OnDateSetListener
как второй параметр, поэтому, возможно, вы должны реализовать этот интерфейс в своей родительской активности EditSessionActivity
(не в DatePickerFragment
) и изменить эту строку:
return new DatePickerDialog(getActivity(), this, year, month, day);
в это:
return new DatePickerDialog(getActivity(), (EditSessionActivity)getActivity(), year, month, day);
И тогда ваша активность должна выглядеть так:
public class EditSessionActivity extends FragmentActivity implements
DatePickerDialog.OnDateSetListener{
public void onDateSet(DatePicker view, int year, int month, int day) {
//use date in your activity
}
...
}
Ответ 2
Я просто переопределяю onDateSet в создании даты в моем классе, который показывает выбор даты.
См. Следующий код:
private OnClickListener onDateClicked() {
return new OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment newFragment = new DatePickerFragment() {
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
salePaymentCustomView.setBtDateText("" + day + "/" + month+1 + "/" + year);
}
};
newFragment.show(getActivity().getSupportFragmentManager(), "datePicker");
}
};
}
Ответ 3
Проблема также может быть решена без перемещения метода onDateSet
к родительской активности. Просто скажите DatePickerFragment
, где искать поиск:
public class DatePickerFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
@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);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
// do some stuff for example write on log and update TextField on activity
Log.w("DatePicker","Date = " + year);
((TextView) getActivity().findViewById(R.id.tf_date)).setText("Date = " + year);
}
}
Я также изменил цель приведения с EditText
на TextView
. Таким образом, вы можете повторно использовать свою реализацию для разных видов просмотров, а не только для EditText
.
Ответ 4
У меня есть одна поправка к вышеуказанному ответу.
вместо возвращения DatePickerDialog, как это
возвращает новый DatePickerDialog (getActivity(), (EditSessionActivity) getActivity(), год, месяц, день);
вы должны вернуть его более общим образом
возвращает новый DatePickerDialog (getActivity(), (OnDateSetListener) getActivity(), год, месяц, день);
просто убедитесь, что ваша активность реализует интерфейс OnDateSetListener и переопределяет функцию onDateSet
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth)
Ответ 5
public void onDate(View view) {
DialogFragment fragment = new SelectDateFragment();
fragment.show(getFragmentManager(), "Date Picker");
}
// @SuppressLint("NewApi")
class SelectDateFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
public Dialog onCreateDialog(Bundle savedInstanceState) {
System.out.println("entrering on create dialog");;
return new DatePickerDialog(getActivity(), this, mYear, mMonth,
mDay);//it will return dialog setting date with mYera,MMonth and MDay
}
@Override
public void onDateSet(android.widget.DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
System.out.println("year=" + year + "day=" + dayOfMonth + "month="
+ monthOfYear);
mYear=year;
mMonth=monthOfYear;
mDay=dayOfMonth;
onPopulateSet(year, monthOfYear + 1, dayOfMonth);
}
// set the selected date in the edit text
private void onPopulateSet(int year, int i, int dayOfMonth) {
EditText et_setDate;
et_setDate = (EditText) findViewById(R.id.register_et_dob);//register_et_dob:-id name of the edit text
et_setDate.setText(dayOfMonth + "/" + i + "/" + year);
System.out.println("enetring on populate Set");
}
Ответ 6
Ответ Leszek работает, но не если Диалог запущен из другого фрагмента. В этом случае вам нужно использовать setTargetFragment()
в коде, который создает диалог и getTargetFragment()
в коде диалога.
В коде, который создает диалог:
DialogFragment dialogFragment = new YourDialogFragment();
dialogFragment.setTargetFragment(YourParentFragment.this, 0);
dialogFragment.show(getFragmentManager(), "mydialog");
В коде DialogFragment:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener()
{
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
{
YourParentFragment parentFragment = (YourParentFragment) getTargetFragment();
// Manipulate the parent fragment
// ...
}
};
// Get the initial date
// ...
return new DatePickerDialog(getActivity(), listener, year, month, day);
}
Ответ 7
У меня была схожая проблема, но мой выбор даты запускался из фрагмента диалога внутри другого фрагмента. Это затрудняло работу с обратными вызовами, потому что они хотят вернуться к основной операции, и я хотел, чтобы данные возвращались к предыдущему фрагменту диалога.
Сначала я передал новые значения даты в главную активность (используя OnDateSetListener) и собирался получить их, используя диалоговое окно, которое запустило средство выбора даты, но в этом диалоговом окне нет событий жизненного цикла, когда закрывается datepicker.
В результате я пришел в onDismiss в сборщике даты, создаю новый фрагмент диалога, вызываю метод набора результатов на нем, а затем запускаю его. Конечно, для этого вам нужно убедиться, что предыдущий фрагмент отклонен, когда он запускает сборщик дат.
Это диалоговое окно, которое вызвало выбор даты
public class NewTrialDialogFragment extends DialogFragment {
public final String LOG_TAG = "NewTrialDialog Fragment";
Button startDateButton;
Integer newYear, newMonth, newDay;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.dialog_new_trial, container, false);
getDialog().setTitle("Dialog New Trial");
startDateButton = (Button) rootView.findViewById(R.id.button_start_date);
startDateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog(v);
}
});
//If you exit the datepicker without choosing anything, it returns zeros
if (newYear != null && newMonth != null && newDay != null && newYear != 0) {
startDateButton.setText(newYear + " " + newMonth + " " + newDay);
}else{
startDateButton.setText("Select Start Date");
}
return rootView;
}
public void showDatePickerDialog(View v) {
TrialDatePickerDialog newDialog = new TrialDatePickerDialog();
newDialog.show(getActivity().getSupportFragmentManager(), "datePicker");
this.dismiss();
}
public void setDates(int year, int month, int day){
newYear = year;
newMonth = month;
newDay = day;
}}
И выбор даты
public class TrialDatePickerDialog extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
private final String LOG_TAG = "TrialDatePickerDialog";
int newYear, newMonth, newDay;
@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 TrialDatePickerDialog and return it
return new DatePickerDialog(getActivity(), this , year, month, day);
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
FragmentManager fm = getActivity().getSupportFragmentManager();
NewTrialDialogFragment newTrialDialogFragment = new NewTrialDialogFragment();
newTrialDialogFragment.setDates(newYear, newMonth, newDay);
newTrialDialogFragment.show(fm, "new_trial_dialog");
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
newYear = year;
newMonth = monthOfYear;
newDay = dayOfMonth;
}
}