2012-11-25 68 views
1

我有兩個日期選擇器相互連接,因爲當我更改第一個選擇器的日期第二個日期也自動更改, 兩個拾取器有一個稱爲上日期改變聽衆收聽,如下兩個日期選擇器相互連接調用兩個聽衆

public class birthDate extends Activity{ 

    Calendar c = Calendar.getInstance(); 
    int currentYear = c.get(Calendar.YEAR); 
    int currentMonth = c.get(Calendar.MONTH); 
    int currentDay = c.get(Calendar.DAY_OF_MONTH); 

    TextView birthDatetv; 
    DatePicker birthDayDatePicker,periodDatePicker; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.birthdate); 

     birthDatetv = (TextView)findViewById(R.id.textViewDateBirth); 

     birthDayDatePicker = (DatePicker)findViewById(R.id.DatePickerBirthDay); 
     periodDatePicker = (DatePicker)findViewById(R.id.DatePickerPeriod); 


     periodDatePicker.init(currentYear, currentMonth, currentDay, new OnDateChangedListener() 
     { 

      @Override 
      public void onDateChanged(DatePicker periodDatePicker, int currentYear, int currentMonth,int currentDay) { 
       // TODO Auto-generated method stub 
       birthDateCalculations(); 
      } 
     }); 

     birthDayDatePicker.init(currentYear, currentMonth, currentDay, new OnDateChangedListener() { 

      @Override 
      public void onDateChanged(DatePicker birthDayDatePicker, int currentYear, int currentMonth, int currentDay) { 
       // TODO Auto-generated method stub 

       periodDateCalculations(); 

       } 
     }); 

} 

正如前面提到的,拾取器被連接,所以當我改變一個拾取器日期另一個也被改變,從而所述兩個偵聽兩個日期選擇器將被調用,我只想要與選擇器有關的監聽器,用戶更改其日期以調用,任何想法如何做到這一點?

下面是聽衆做,如果它可以幫助方法

public void birthDateCalculations() 
{ 

    Calendar start = Calendar.getInstance(); 

    int periodYear = periodDatePicker.getYear(); 
    int periodMonth = periodDatePicker.getMonth(); 
    int periodDay = periodDatePicker.getDayOfMonth(); 

    start.set(periodYear, periodMonth, periodDay); 
    birthDayDatePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS); 
    periodDatePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS); 

    Date periodDate = start.getTime(); 
    int daysToAdd = 280; 
    Calendar cal = Calendar.getInstance(); 

    cal.setTime(periodDate); 
    cal.add(Calendar.DAY_OF_MONTH,daysToAdd); 
    System.err.println("-----" +cal.getTime()); 
    int birthYearAfterCalc = cal.getTime().getYear()+1900; 
    System.err.println("birthYearAfterCalc-----" + birthYearAfterCalc); 
    int birthMonthAfterCalc = cal.getTime().getMonth(); 
    System.err.println("birthMonthAfterCalc----" + birthMonthAfterCalc); 
    int birthDayAfterCalc = cal.getTime().getDate(); 
    System.err.println("birthDayAfterCalc"+birthDayAfterCalc); 

    //user edit period to get birth 
    if(periodDay <= currentDay && periodMonth <= currentMonth && periodYear <= currentYear){ 
    //the program runs normally 
    birthDayDatePicker.updateDate(birthYearAfterCalc, birthMonthAfterCalc, birthDayAfterCalc); 

     } 
     else { 


     new AlertDialog.Builder(birthDate.this) 

         .setTitle("Wrong Data Input!") 

         .setMessage("Error in period date input") 

         .setNeutralButton("Ok", 

         new DialogInterface.OnClickListener() { 

         public void onClick(DialogInterface dialog, 

         int which) { 

         } 

         }).show(); 

      periodDatePicker.updateDate(currentYear,currentMonth, currentDay); 
      birthDayDatePicker.updateDate(currentYear, currentMonth, currentDay); 


        } 


} 

public void periodDateCalculations() 
{ 
    Calendar start2 = Calendar.getInstance(); 

    // get the chosen date from birth date picker 
    int birthYear = birthDayDatePicker.getYear(); 
    int birthMonth = birthDayDatePicker.getMonth(); 
    int birthDay = birthDayDatePicker.getDayOfMonth(); 

    //set the chosen date to calendar instance 

    start2.set(birthYear, birthMonth, birthDay); 

    birthDayDatePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS); 
    periodDatePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS); 

    //get the date 
    Date birthDate = start2.getTime(); 
    //int constrain = currentMonth + 9; 

    int daysToAdd = -280; 

    //another instance from calendar 
    Calendar cal2 = Calendar.getInstance(); 

    //set birth date chosen to calendar 
    cal2.setTime(birthDate); 

    //add -280 day to birth day to get period date 
    cal2.add(Calendar.DAY_OF_MONTH,daysToAdd); 
    System.err.println("-----" +cal2.getTime()); 
    int periodYearAfterCalc = cal2.getTime().getYear()+1900; 
    System.err.println("periodYearAfterCalc-----" + periodYearAfterCalc); 
    int periodMonthAfterCalc = cal2.getTime().getMonth(); 
    System.err.println("periodMonthAfterCalc----" + periodMonthAfterCalc); 
    int periodDayAfterCalc = cal2.getTime().getDate(); 
    System.err.println("periodDayAfterCalc"+periodDayAfterCalc); 

    //edit birth date picker from user 
     if(birthDay >= currentDay && birthMonth >= currentMonth && birthYear >= currentYear){ 
      //the program runs normally 
      periodDatePicker.updateDate(periodYearAfterCalc, periodMonthAfterCalc, periodDayAfterCalc);  

      } 
      else{ 


          new AlertDialog.Builder(birthDate.this) 

          .setTitle("Wrong Data Input!") 

          .setMessage("birth day input error") 

          .setNeutralButton("Ok", 

          new DialogInterface.OnClickListener() { 

          public void onClick(DialogInterface dialog, 

          int which) { 


          } 

          }).show(); 

          birthDayDatePicker.updateDate(currentYear,currentMonth, currentDay); 
          periodDatePicker.updateDate(currentYear, currentMonth, currentDay); 


         } 

    } 

} 

回答

1

你可以做的是設置相應的偵聽器時,另一個採取行動,然後在任務之後,你可以轉向空它回來了。

例如:

periodDatePicker.init(currentYear, currentMonth, currentDay, new OnDateChangedListener() 
{ 

    @Override 
    public void onDateChanged(DatePicker periodDatePicker, int currentYear, int currentMonth,int currentDay) { 
     // TODO Auto-generated method stub 
     birthDayDatePicker.init(currentYear, currentMonth, currentYear, null); 
     birthDateCalculations(); 
     restartBirthDayDatePickerListener(); 
     // ^here you turn back on that init command that we have just set to null. 
    } 
}); 

不是一個富有魅力的解決方案,但也許你可以做頭或它的尾巴。

+0

完美,非常感謝! –