2014-02-18 105 views
4

我有一個活動,我需要接受兩個日期,開始日期和結束日期。我有兩個按鈕,點擊時會顯示日期選擇器。輸入日期後,我需要使用SharedPreferences存儲此日期。我使用本教程:兩個日期選取器在同一活動中的兩個日期選擇器android

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

我已經看到了問題,但他們沒有使用DialogFragment。他們使用不推薦使用的函數,我不想使用這些函數,因爲我聽說使用DialogFragment會更好。

現在我該如何去關於兩個日期選擇器?如何知道onDateSet函數中哪個按鈕被點擊(startButton或endButton)?有沒有辦法將視圖ID存儲在我點擊按鈕時創建的DialogFragment中,以便我可以在onDateSet中訪問它?

任何幫助將是偉大的,謝謝。

回答

10

可以這樣做:

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

+0

這非常努力好,非常感謝你! –

+0

也爲我工作。好的一段代碼。 –

1

爲了避免這種問題,您可以創建實現界面的內部類,認爲良好的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(); 

一切都變得相當清楚

+0

我想到了這一點,是的,但我認爲更有效的方法是使用一個內部類只用於兩個選擇器,對不對? –

+0

你也可以,但只有一個內部類可以讓你感到困惑,因爲你有很多代碼並檢查是否是第一或第二個,並且使用標誌使它更多。記住保持簡單但高效lol –

+0

同時爲此創建2個不同的內部類對於性能來說並不是一個巨大的打擊,所以這樣做沒有問題 –

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

其完美的工作

相關問題