2010-06-26 27 views
8

Tôi đang sử dụng một trình ghi ngày tháng trong Android để cho phép người dùng chọn ngày. Tôi muốn nó làm một điều nếu người dùng chọn một ngày và đặt nó (tôi có làm việc tốt) và sau đó để xóa một trường văn bản nhất định nếu người dùng nhấn nút hủy bỏ trên datepicker (mở datepicker nhưng sau đó hủy bỏ ra của nó).Làm cách nào để làm người nghe cho nút hủy ngày tháng trong Android?

Con đường tôi đã cố gắng là bằng cách làm một

private DatePickerDialog.OnCancelListener mDateCancelListener = 
    new DatePickerDialog.OnCancelListener() { 
     public void onCancel(DialogInterface dialog) { 
      timeClear(); //method that clears text field 
     } 

    }; 

sau đó tôi làm

TimePickerDialog timeDialog = new TimePickerDialog(this, 
    mTimeSetListener, 
    c.get(Calendar.HOUR), 
    c.get(Calendar.MINUTE), 
    false); 
timeDialog.setOnCancelListener(mTimeCancelListener); 

để đính kèm người nghe.

Vấn đề của tôi là người nghe hoạt động nếu người dùng nhấn nút quay lại, nhưng không phải nếu họ nhấn nút hủy. Tôi đã thử sử dụng một người nghe sa thải, và điều đó có hiệu quả, ngoại trừ việc nó bị tắt ngay cả khi tôi đặt hoặc hủy bỏ datepicker!

Tôi cần làm gì để có điều gì đó xảy ra nếu và chỉ khi tôi nhấn nút hủy trên máy hẹn hò?

+0

Tôi đang cố gắng làm điều tương tự nhưng với công cụ chọn ngày. Trong giải pháp được đề xuất bên dưới, ứng dụng gặp sự cố vì .getButton (TimePickerDialog.BUTTON_NEGATIVE) đang trả về giá trị rỗng. Có ai ngoài kia có giải pháp cho việc này không? –

+1

Kiểm tra điều này [1]: http://stackoverflow.com/questions/2928902/can-we-get-cancel-click-listerner-of-datepicker-dialog – W00di

Trả lời

0

Hãy thử điều này:

timeDialog.getButton(TimePickerDialog.BUTTON_NEGATIVE).setOnClickListener(mTimeCancelListener); 

(Bạn sẽ phải thay đổi mTimeCancelListener để thực hiện DialogInterface.OnClickListener thay vì OnCancelListener)

+0

Cảm ơn bạn đã trả lời! Tôi vẫn gặp một chút rắc rối. Nếu tôi thực hiện một DialogInterface.OnClickListener và cố gắng sử dụng nó cho TimePicker, nó nói với tôi rằng tôi cần phải cast nó trước. Nếu tôi làm vậy, thì chương trình chỉ bị treo khi bạn nhấp vào nút để mở TimePicker. Nếu không thì nó nói setOnClickListener (android.view.View.OnClickListener) trong android.view.View không thể được áp dụng cho (android.content.DialogInterface.OnClickListener) timeDialog.getButton (TimePickerDialog.BUTTON_NEGATIVE) .setOnClickListener (dateTimeClickCancelListener); – Adam

+0

Và tôi đã thử tạo View.OnClickListner() thay vì DialogInterfaceListener và chương trình chỉ gặp sự cố khi tôi cố gắng mở hộp thoại TimePicker – Adam

1

rồi sau vài thử nghiệm tôi đã tìm thấy rằng những gì cần thiết là một OnDismissListener như hình dưới đây . Lưu ý rằng tôi đã phát triển giải pháp của mình cho một TimePickerDialog, nhưng setOnDismissListener được thừa kế từ Hộp thoại để nó hoạt động tương tự cho một DatePickerDialog.

timeDialog.setOnDismissListener(mOnDismissListener); 


private DialogInterface.OnDismissListener mOnDismissListener = 
    new DialogInterface.OnDismissListener() { 
     public void onDismiss(DialogInterface dialog) { 
      _logger.v("mOnDismissListener called"); 
      timeClear(); 
     } 
    }; 

Tôi đã thử nghiệm tính năng này và hoạt động. Trong thực tế, tôi đã thấy rằng OnDismissListener được gọi trong cả hai kịch bản mà bạn đề cập, khi người dùng nhấp vào nút Hủy và khi họ nhấn nút quay lại phần cứng. Vì vậy, bạn chỉ cần một trình xử lý này.

Cuối cùng, bây giờ mà tôi biết những gì để google cho, tôi thấy this article mô tả sự khác biệt giữa một OnDismissListener và một OnCancelListener, trong phần về "Sử dụng Dismiss Listeners":

+0

Đây không phải là những gì được yêu cầu - onDismiss được kích hoạt bất kể nút nào được nhấn, nhưng tấm áp phích muốn biết khi nhấn nút hủy. Họ cũng nói rằng họ đã thử một người nghe onDismiss. – barry

+0

@barry điểm tốt .. Những gì tôi thấy thú vị là "onCancelListener" không có gì để làm với nút Cancel trên hộp thoại datePicker. Nhận xét của W00di là câu trả lời đúng ... vì vậy có thể trùng lặp. – giulio

4

Giải pháp duy nhất, phản trực quan, là bạn cần "ghi đè" nút hủy:

timeDialog.setButton(DialogInterface.BUTTON_NEGATIVE, 
      getString(R.string.cancel), 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        // do stuff 
       } 
      }); 
+0

Điều này cũng gọi phương thức OnTimeSet. Vì vậy, tuần tự nó gọi người nghe tiêu cực sau đó là người nghe tích cực. –

2

Bạn có thể tạo một biến boolean làDataSet và trong dateSetListener thực hiện làDataSet = true; và sau đó đính kèm trênDismissListener với mã như vậy:

if(isDataSet) 
    //Data was set and neither back nor cancel button was clicked 
else 
    //back or cancel button was clicked 

Nhưng đừng quên đặt isDataSet = false mỗi lần bạn tạo hộp thoại.

0

Giải pháp đầy đủ (thử nghiệm và làm việc) là kết hợp OnDismissListener (xem câu trả lời của Kenneth Baltrinic 3 ở trên) cùng với boolean onDateSet được mô tả bằng pha loãng (1 câu trả lời ở trên). Bạn cần cả bởi vì onDismiss được sử dụng trong mọi trường hợp: (1) người dùng đã chọn dữ liệu thực tế (2) người dùng đã hủy (3) người dùng đã nhấn nút quay lại phần cứng.

Sử dụng kết hợp cho phép bạn phân biệt giữa chúng.

0

đây là giải pháp. nó có thể giúp bất kỳ ai

datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      if (which == DialogInterface.BUTTON_NEGATIVE) { 
       // do something 
      } 
     } 
    }); 
Các vấn đề liên quan