如何在android中使用来自同一个diolog片段的多个日期选择器?

1 android android-datepicker android-dialogfragment datepickerdialog

在我的应用程序中,我必须显示 4-5 个日期选择器并设置日期如何使用 datepicker Dialog fragment 执行此操作?

目前我必须为所有日期选择器对话框制作单独的日期选择器...

 public static class RegistrationDatePicker 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);

        DatePickerDialog dialog = new DatePickerDialog(getActivity(), this, year, month, day);
        dialog.getDatePicker().setMaxDate(new Date().getTime());
        return dialog;
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        mTextView.setText(String.valueOf(month + "/" + day + "/" + year));
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

由于我最近不得不在同一个活动中使用多个 DatePicker DialogFragment,我想分享我的答案。

首先这里是我的 DatePicker DialogFragment,用一个接口实现:

public class DatePickerFragment extends DialogFragment
                                implements DatePickerDialog.OnDateSetListener{
// This is the listener for the activity
    private DatePickerFragmentListener listener;

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
// Get the current date to start the DatePicker with
        final Calendar c = Calendar.getInstance();
        int day = c.get(Calendar.DAY_OF_MONTH);
        int month = c.get(Calendar.MONTH);
        int year = c.get(Calendar.YEAR);
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        listener.onDateSet(year, month, dayOfMonth);
    }
// This is the method from the DatePicker fragment to implement in the Main Activity
    public interface DatePickerFragmentListener{
        public void onDateSet(int year, int month, int day);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        listener = (DatePickerFragmentListener) context;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在实现 DatePickerFragmentListener 的 MainActivity:

public class MainActivity extends AppCompatActivity
        implements  DatePickerFragment.DatePickerFragmentListener{
    Button myButton1, myButton2;
    FragmentManager fm = getSupportFragmentManager();
    int DATE_DIALOG = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myButton1 = (Button) findViewById(R.id.myButton2);
        myButton2 = (Button) findViewById(R.id.myButton3);

//        SELECT A START DATE
        myButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DATE_DIALOG = 1;
                openDialog();
            }
        });
//        SELECT A STOP DATE
        myButton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DATE_DIALOG = 2;
                openDialog();
            }
        });
    }
// I always show the same DatePicker fragment
    public void openDialog(){
        DatePickerFragment datepickDialog = new DatePickerFragment();
        datepickDialog.show(fm, "Start Date");
    }

    @Override
    public void onDateSet(int year, int month, int day) {
//Depending on the DATE_DIALOG key, I update the text of the corresponding button
            if(DATE_DIALOG ==1){
                myButton2.setText(  Integer.toString(day) + "/" +
                                    Integer.toString(month+1)+ "/" +
                                    Integer.toString(year));
            }
            else if(DATE_DIALOG ==2){
                myButton2.setText(  Integer.toString(day) + "/" +
                        Integer.toString(month+1)+ "/" +
                        Integer.toString(year));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)