2012-07-31 4 views
5

Tôi đã tạo một hộp thoại tùy chỉnh có tên MyCustomDialog mở rộng Dialog. Tôi tạo và hiển thị hộp thoại tùy chỉnh của mình như sau:Làm cách nào để hủy hoặc loại bỏ một hộp thoại tùy chỉnh trong phương thức onCreate?

new MyCustomDialog(myContext).show(); 

Tôi ghi đè phương pháp Dialog.onCreate(Bundle savedInstanceState) để khởi tạo. Tôi cũng kiểm tra trong phương pháp này cho dù một điều kiện nhất định giữ và, nếu không, tôi muốn loại bỏ/hủy bỏ hộp thoại của tôi. Tôi đã thử gọi các phương thức cancel()dismiss() trong các phương thức onCreate(Bundle savedInstanceState)onStart() của hộp thoại của tôi nhưng không có tác dụng.

Bất kỳ ai biết cách hủy hoặc loại bỏ một hộp thoại (từ trong hộp thoại) trước khi nó hiển thị?

+0

Bạn có đang gọi super.onCreate() trong phương thức onCreate() của mình không ?? – RaphMclee

+0

Bạn đang viết cấp độ API nào? –

Trả lời

2

bạn nên đặt logic để xác định xem hộp thoại có được hiển thị bên ngoài phương thức onCreate() hay không. nó không thuộc về đó.

cách khác, đổi tên phương thức show()showIfRequired() (hoặc thứ gì đó) và thêm logic hiển thị có điều kiện tại đó.

tôi biết điều này không trả lời kỹ thuật câu hỏi của bạn, nhưng những gì bạn đang cố gắng làm không phải là thiết kế chính xác. đó là một điều tốt, như làm đúng cách là thực sự đơn giản hơn.

cũng là một lưu ý phụ, bạn nên sử dụng DialogFragment để ủng hộ Dialog. nó có sẵn trong thư viện hỗ trợ v4.

+0

Có, và bạn * có thể * ghi đè lên chính phương thức show() trong lớp con của hộp thoại, gọi super.show() có điều kiện. – CSmith

+1

@CSmith có, nhưng điều đó sẽ vi phạm hợp đồng cho phương thức 'DialogInterface.show()'. –

1

này là dành cho các cấp API 10 và dưới đây:

Trước tiên, bạn nên ghi đè onCreateDialog (int id, args Bundle) trong lớp Hoạt động, đó là những gì bạn đang làm? Các hộp thoại luôn được tạo và hiển thị như một phần của Hoạt động. Thứ hai, tôi không nghĩ rằng bạn có thể hủy bỏ/bỏ qua một hộp thoại trong onCreateDialog vì nó chưa thực sự được tạo khi onCreateDialog được gọi. Đó là, bạn không thể hủy bỏ/loại bỏ một cái gì đó mà chưa được tạo ra. Những gì bạn có thể thử là để ghi đè lên onPrepareDialog() thay vào đó và làm kiểm tra của bạn để hủy bỏ/bỏ qua hộp thoại ở đó. Tại thời điểm đó hộp thoại thực sự đã được tạo ra (chỉ cần không được hiển thị), vì vậy bạn sẽ có thể ngăn chặn nó được hiển thị nếu bạn gọi hủy bỏ/bỏ qua ở đó.

onPrepareDialog() là nơi thích hợp để thực hiện bất kỳ loại séc và quyết định nào trên hộp thoại sắp được hiển thị. Đây là các API trước Honeycomb.

Điều này dành cho API 11 trở lên:

Nếu bạn đang sử dụng API sau này, bạn nên mở rộng DialogFragment để thay thế. Trong trường hợp này, tôi nghĩ bạn có thể xử lý việc ra quyết định trong phương thức onCreateView() của DialogFragment tương tự như onPrepareDialog().

Tôi hy vọng bạn đã đọc qua này: http://developer.android.com/guide/topics/ui/dialogs.html

hoặc này, tùy thuộc vào API của bạn:

http://developer.android.com/reference/android/app/DialogFragment.html

Nhìn chung, có lẽ là một giải pháp sạch hơn là để vô hiệu hóa các nút hoặc cơ chế khiến hộp thoại hiển thị ở vị trí đầu tiên? Tức là, bạn viết mã như vậy mà Dialog.show() được gọi chỉ khi nó thực sự cần phải được gọi. Tôi phải biết thêm chi tiết về chính xác những gì bạn đang cố gắng làm. Ví dụ, giả sử bạn gọi Dialog.show() từ nút onClickListener của một nút. bạn không thực sự muốn người dùng nhấn một nút, mong đợi một hộp thoại, nhưng có nó không hiển thị do một số lý do người dùng không hiểu. Một giải pháp tốt hơn là để vô hiệu hóa tất cả các nút với nhau để nó rõ ràng cho người dùng rằng chức năng này không có sẵn do một cái gì đó khác trong ứng dụng.

+0

'onCreateDialog()' là một phương thức trong 'DialogFragment'. anh ta không sử dụng 'DialogFragment', anh ta đang mở rộng' Dialog'. –

+0

Các onCreateDialog mà tôi đang nói về là một phương pháp hoạt động thực sự. Vì vậy, là onPrepareDialog() tôi đang nói về. Nó không giống như OP đang sử dụng DialogFragment. Nếu ứng dụng này là pre-honeycomb thì đây là những gì OP nên làm (Dialogfragment không tồn tại trước Honeycomb). nếu nó cho tổ ong và sau này, hơn OP nên sử dụng DialogFragment. Tôi đã thêm nhận xét đó vào câu hỏi gốc. –