Get date from datepicker using dialogfragment

前端 未结 9 826
庸人自扰
庸人自扰 2020-11-28 03:42

I\'m using the google example to insert a datepicker inside my app using a dialogfragment
http://developer.android.com/guide/topics/ui/controls/pickers.html

But

相关标签:
9条回答
  • 2020-11-28 04:04

    In case you have to return a result to a Fragment, but not an Activity, here is a complete solution:

    public class DatePickerDialogFragment extends DialogFragment  {
    
        private static final String ARGUMENT_YEAR = "ARGUMENT_YEAR";
        private static final String ARGUMENT_MONTH = "ARGUMENT_MONTH";
        private static final String ARGUMENT_DAY = "ARGUMENT_DAY";
        private DatePickerDialog.OnDateSetListener listener;
    
        private int year;
        private int month;
        private int dayOfMonth;
    
        public static DatePickerDialogFragment newInstance(final int year, final int month, final int dayOfMonth) {
            final DatePickerDialogFragment df = new DatePickerDialogFragment();
            final Bundle args = new Bundle();
            args.putInt(ARGUMENT_YEAR, year);
            args.putInt(ARGUMENT_MONTH, month);
            args.putInt(ARGUMENT_DAY, dayOfMonth);
            df.setArguments(args);
            return df;
        }
    
        @Override
        public void onCreate(@Nullable final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            retrieveArguments();
        }
    
        private void retrieveArguments() {
            final Bundle args = getArguments();
            if (args != null) {
                year = args.getInt(ARGUMENT_YEAR);
                month = args.getInt(ARGUMENT_MONTH);
                dayOfMonth = args.getInt(ARGUMENT_DAY);
            }
        }
    
        @Override
        public Dialog onCreateDialog(final Bundle savedInstanceState) {
            return new DatePickerDialog(getContext(), this.listener, this.year, this.month, this.dayOfMonth);
        }
    
        public void setListener(final DatePickerDialog.OnDateSetListener listener) {
            this.listener = listener;
        }
    }
    

    Then just use it in a Fragment or in an Activity:

    final Calendar c = Calendar.getInstance();
    DatePickerDialogFragment datePicker = DatePickerDialogFragment.newInstance(
            c.get(Calendar.YEAR),
            c.get(Calendar.MONTH),
            c.get(Calendar.DAY_OF_MONTH));
    datePicker.setListener(this);
    datePicker.show(getChildFragmentManager(), null);
    
    0 讨论(0)
  • 2020-11-28 04:05

    I simple override onDateSet in date picker creation in my class that shows a date picker. See code below:

      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");
        }
      };
     } 
    
    0 讨论(0)
  • 2020-11-28 04:06
    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");
    
            }
    
    0 讨论(0)
  • 2020-11-28 04:07

    The problem can also be solved without moving the onDateSet method to the parent activity. You just have to tell the DatePickerFragment where to search for the view:

    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);
        }
    }
    

    I also changed the target of the cast from EditText to TextView. This way, you can reuse your implementation for different kinds of views, not only for an EditText.

    0 讨论(0)
  • 2020-11-28 04:14

    i have one correction to the above answer. instead of return the DatePickerDialog like this

    return new DatePickerDialog(getActivity(), (EditSessionActivity)getActivity(), year, month, day);

    you should return it in a more generic way

    return new DatePickerDialog(getActivity(), (OnDateSetListener)getActivity(), year, month, day);

    just make sure your activity implements OnDateSetListener interface and override the function onDateSet

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) 
    
    0 讨论(0)
  • 2020-11-28 04:16

    Constructor fo DatePickerDialog takes DatePickerDialog.OnDateSetListener as second parameter, so maybe you should implement that interface in your parent activity EditSessionActivity (not in DatePickerFragment ) and change this line:

    return new DatePickerDialog(getActivity(), this, year, month, day);
    

    into this:

    return new DatePickerDialog(getActivity(), (EditSessionActivity)getActivity(), year, month, day);
    

    And then your activity should looks like this:

    public class EditSessionActivity extends FragmentActivity implements
            DatePickerDialog.OnDateSetListener{
    
        public void onDateSet(DatePicker view, int year, int month, int day) {
            //use date in your activity
        }
        ...
    }
    
    0 讨论(0)
提交回复
热议问题