Android 同一活动中的两个日期选择器

Android 同一活动中的两个日期选择器,android,android-dialogfragment,android-datepicker,Android,Android Dialogfragment,Android Datepicker,我有一个活动,我需要接受两个日期,一个开始日期和一个结束日期。我有两个按钮,点击后会显示日期选择器。输入日期后,我需要使用SharedReferences存储此日期。我正在使用本教程: 我见过两个日期选择器的问题,但没有一个使用DialogFragment。他们使用的是不推荐使用的函数,我真的不想使用这些函数,因为我听说最好使用DialogFragment 现在我该怎么处理两个约会挑肥拣瘦的人?如何知道在onDateSet函数中单击了哪个按钮(开始按钮或结束按钮)?是否有方法将视图id存储在我

我有一个活动,我需要接受两个日期,一个开始日期和一个结束日期。我有两个按钮,点击后会显示日期选择器。输入日期后,我需要使用SharedReferences存储此日期。我正在使用本教程:

我见过两个日期选择器的问题,但没有一个使用DialogFragment。他们使用的是不推荐使用的函数,我真的不想使用这些函数,因为我听说最好使用DialogFragment

现在我该怎么处理两个约会挑肥拣瘦的人?如何知道在onDateSet函数中单击了哪个按钮(开始按钮或结束按钮)?是否有方法将视图id存储在我单击按钮时创建的对话框片段中,以便我可以在onDateSet中访问它


任何帮助都会很好,谢谢。

可以这样做:

View.OnClickListener showDatePicker = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        final View vv = v;

        DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                if (vv.getId() == R.id.StartDate //id of your StartDate button) {
                        //do the stuff
                } else //EndDate button was clicked {
                        //do the stuff
                }
            }
        }, year, month, day);
        datePickerDialog.show();
    }
};
startDate.setOnClickListener(showDatePicker);
endDate.setOnClickListener(showDatePicker);

这里的主要思想是存储
视图
激发的
OnClickEvent
(在您的例子中是按钮)并将该视图的ID与按钮的ID进行比较

为了避免此类问题,您可以创建实现接口的内部类,好好想想OOP,因此,您可以做任何您想做的事情,而无需检查它是第一个还是第二个,例如:

class innerFirstDate implements DatePickerDialog.OnDateSetListener{
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            //Doing thing with first Date pick Dialog
        }

 }

class innerSecondDate implements DatePickerDialog.OnDateSetListener{
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            //Doing thing with second Date Picker Dialog
        }

 }
稍后,您可以为第一个执行以下操作:

DatePickerDialog firstD = new DatePickerDialog(getActivity(), new innerFirstDate(), year, month, day).show();
第二个:

DatePickerDialog secondD = new DatePickerDialog(getActivity(), new innerSecondDate(), year, month, day).show();
一切都变得很清楚

public void onClick(View v) {
    d1= 1;
    d2=2;
    DatePickerDialog dialog = new DatePickerDialog(this, this, 2013, 2, 18);
    dialog.show();
}

public void onDateSet(DatePicker view, int year, int month, int day) {
    if(d1==1) {
        e2.setText(Integer.toString(day)+"/"+Integer.toString(month+1)+"/"+Integer.toString(year));
    }
    if(d2==1) {
        e3.setText(Integer.toString(day)+"/"+Integer.toString(month+1)+"/"+Integer.toString(year));
    }
}

public void onClick1(View v) {
    d2=1;
    d1=2;
    DatePickerDialog dialog = new DatePickerDialog(this, this,2013,2, 18);
    dialog.show();
}

它工作得很好

我想到了这一点,是的,但我认为更有效的方法是只为两个选择器使用一个内部类,对吗?你也可以,但是在你有很多代码并且检查是第一个还是第二个以及使用flag之后,只使用一个内部类可能会让人困惑。记住,保持简单但高效,同时创建两个不同的内部类,因为这对性能来说不是很大的影响,所以这样做没有问题if-else上的注释缺少了一个封闭的圆括号,if)open curly{missing.else缺少open curly大括号{