【问题标题】:Two date pickers in same activity android同一活动android中的两个日期选择器
【发布时间】:2014-02-18 16:32:20
【问题描述】:

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

http://developer.android.com/guide/topics/ui/controls/pickers.html

我看到了有关两个日期选择器的问题,但没有一个使用 DialogFragment。他们正在使用已弃用的函数,我真的不想使用这些函数,因为我听说使用 DialogFragment 更好。

现在我该如何处理两个日期选择器?我如何知道在 onDateSet 函数中单击了哪个按钮(startButton 或 endButton)?有什么方法可以将视图 id 存储在我在单击按钮时创建的 DialogFragment 中,以便我可以在 onDateSet 中访问它?

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

【问题讨论】:

    标签: android android-dialogfragment android-datepicker


    【解决方案1】:

    可以这样做:

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

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

    【讨论】:

    • if else 上的 cmets 缺少 if ) open curly { 缺少一个右圆括号。 Else 缺少左大括号 {
    【解决方案2】:

    为了避免这种问题,你可以创建实现接口的内部类,考虑好的 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();
    

    一切都变得清晰

    【讨论】:

    • 我想过这个,是的,但我认为更有效的方法是只为两个选择器使用一个内部类,对吧?
    • 你也可以,但是在你有很多代码并检查是第一个还是第二个并使用标志之后,只使用一个内部类可能会令人困惑。记住保持简单但高效大声笑
    • 为此创建 2 个不同的内部类对性能来说并没有太大影响,所以这样做没有问题
    【解决方案3】:
    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();
    }
    

    完美运行

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      相关资源
      最近更新 更多