Подтвердить что ты не робот

Получить дату с 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);
    }
4b9b3361

Ответ 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;
         }
     }