How to get OnClick in DatePickerDialog.OnDateSetListener?

后端 未结 2 842
旧时难觅i
旧时难觅i 2021-01-07 04:50

I am using the following method to pop up the dialog to pick the date.

private DatePickerDialog.OnDateSetListener mDateSetListener =
        new DatePickerDi         


        
相关标签:
2条回答
  • 2021-01-07 05:11

    If you don't want to use a custom implementation of such dialog, you have to subclass DatePickerDialog to achieve such behavior. You can't block the dialog from closing just with DatePickerDialog.OnDateSetListener.

    Unfortunatelly, implementations of the dialog vary with different API levels, so it's not that trivial to get the desired behavior with subclassing. You need to add some hacks to make it work reliably.

    I've created a sample implementation that blocks the dialog from closing unless an appropriate date is set (or a cancel or back button is hit). Adjust it to display your alert to the users, the best place is the else branch in onClick() method.

    class CheckingDatePickerDialog extends DatePickerDialog {
    
        private int year;
        private boolean cancel = false;
        private boolean isCancelable = true;
    
        CheckingDatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
            super(context, callBack, year, monthOfYear, dayOfMonth);
            this.year = year;
        }
    
        CheckingDatePickerDialog(Context context, int theme, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
            super(context, theme, callBack, year, monthOfYear, dayOfMonth);
            this.year = year;
        }
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // allow closing the dialog with cancel button
            Button btn = getButton(BUTTON_NEGATIVE);
            if (btn != null) {
                btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        cancel = true;
                        dismiss();
                    }
                });
            }
        }
    
        @Override
        public void setCancelable(boolean flag) {
            isCancelable = false;
            super.setCancelable(flag);
        }
    
        @Override
        public void onBackPressed() {
            // allow closing the dialog with back button if the dialog is cancelable
            cancel = isCancelable;
            super.onBackPressed();
        }
    
        private boolean isOldEnough() {
            // test if the date is allowed
            return year <= 1994;
        }
    
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                // necessary for some Honeycomb devices
                DatePicker dp = getDatePicker();
                this.year = dp.getYear();
            }
    
            if (isOldEnough()) {
                // OnDateSetListener is called in super.onClick()
                super.onClick(dialog, which);  
            } else {
                // place your alert here
            }
        }
    
        @Override
        public void onDateChanged(DatePicker view, int year, int month, int day) {
            // on some Honeycomb devices called only with the first change
            // necessary for devices running Android 2.x
            this.year = year;
            super.onDateChanged(view, year, month, day);
        }
    
        @Override
        public void dismiss() {
            if (cancel || isOldEnough()) {
                // do not allow the dialog to be dismissed unless a cancel or back button was clicked
                super.dismiss();
            }
        }
    };
    
    0 讨论(0)
  • 2021-01-07 05:14

    Date Picker Dialog you are using is deprecated so I recommend you to don't use that.

    You can implement the Date picker in two ways(that I know of)

    1. Using DialogFragment
    2. Using AlertDialog

    Using DialogFragment:

    public class MainActivity extends FragmentActivity {
        EditText text;
        Button b;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            b=(Button)findViewById(R.id.button1);
            text=(EditText)findViewById(R.id.editText1);
            b.setOnClickListener(new View.OnClickListener() {
                public void onClick(View arg0) {
                    DateDialogFragment datepicker=new DateDialogFragment();
                    datepicker.show(getSupportFragmentManager(), "showDate");
                }
            });
        }
    
        public class DateDialogFragment extends DialogFragment  implements DatePickerDialog.OnDateSetListener{
    
            public DateDialogFragment()
            {
            }
            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                Calendar cal=Calendar.getInstance();
                int year=cal.get(Calendar.YEAR);
                int month=cal.get(Calendar.MONTH);
                int day=cal.get(Calendar.DAY_OF_MONTH);
                return new DatePickerDialog(getActivity(), this, year, month, day);
            }
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                showSetDate(year,monthOfYear,dayOfMonth);
            }
    
            }
    
        public void showSetDate(int year,int month,int day) {
        text.setText(year+"/+"+month+"/"+day);
        }
    }
    

    Check this sample and implement the same in your Activity.

    Using Alert Dialog:

    Using the second one is pretty simple

    Create layout in your res/layout folder and place DatePicker in the layout

     LayoutInflater  inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View view = (View) inflater.inflate(R.layout.yourlayout, null);
    DatePicker picker=(DatePicker)view.findViewById(R.id.datepicker);
    
      AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
     builder.setView(view).
            builder.setMessage(R.string.dialog_fire_missiles)
                   .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int id) {
                           // FIRE ZE MISSILES!
                       }
                   })
                   .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int id) {
                           // User cancelled the dialog
                       }
                   });
            // Create the AlertDialog object and return it
            return builder.create();
    
    0 讨论(0)
提交回复
热议问题