2010-03-23 35 views
41

Trong một hoạt động dài, tôi đang hiển thị hộp thoại bật lên (được tạo từ ProgressDialog để ngăn các hoạt động khác xảy ra).Ngăn không cho ProgressDialog bị xóa khi tôi nhấp vào nút tìm kiếm (Android)

Tôi đã làm cho nó không thể hủy với setCancelable(false), vì vậy tôi không thể đóng nó bằng cách sử dụng nút quay lại, nhưng đáng ngạc nhiên, nút phần cứng Tìm kiếm loại bỏ hộp thoại!

Chính xác hơn, ứng dụng tìm kiếm toàn cầu được hiển thị và khi tôi quay lại ứng dụng của mình, hộp thoại đã bị loại bỏ.

Bất kỳ ý tưởng nào về cách ngăn không cho hộp thoại bị loại bỏ?

+0

Còn về việc ghi đè chức năng nút tìm kiếm thì sao? @Override public boolean onSearchRequested() {return true; } –

+0

Đáng ngạc nhiên, điều này không hoạt động (ít nhất là thử nghiệm nó trên 2.3). Không hoạt động nếu bạn trả về false. – cottonBallPaws

Trả lời

45

này hoạt động (thông báo tôi đặt nó trên builder thoại):

.setOnKeyListener(new DialogInterface.OnKeyListener() { 

    @Override 
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_SEARCH && event.getRepeatCount() == 0) { 
      return true; // Pretend we processed it 
     } 
     return false; // Any other keys are still processed as normal 
    } 
}) 

Có lẽ nó thậm chí có thể lấy các nút bấm tích cực và tiêu cực, và chỉ xử lý những điều này, trả về true cho bất kỳ phím nào khác. Hãy tò mò nếu bạn có thể tìm ra điều đó ...

PS: Tôi đọc ở đâu đó có nhiều "lỗ hổng" trong hộp thoại, tức là bạn có thể loại bỏ nó mà không cần nhấn bất kỳ nút nào trên đó. Đây rõ ràng là một. Có ai biết về bất kỳ người nào khác không?

+0

Tôi gặp lỗi trình biên dịch khi chạy, tuy nhiên xóa '@ Ghi đè' và thay đổi khai báo của onKey thành' public boolean onKey (DialogInterface arg0, int arg1, KeyEvent arg2) 'đã làm việc cho tôi - –

+0

@MohamedHafez có thể thay đổi trình biên dịch/IDE của bạn để kiểm tra Java 1.6 thay vì 1.5? – parkerfath

+0

@QQCâu hỏi bất kỳ ý tưởng nào tại sao getRepeatCount() == 0 phải ở đó? – parkerfath

1

Bạn phải tạo hộp thoại của mình thông qua sự kiện onCreateDialog của Hoạt động, vì đó là điểm chúng được quản lý bởi Hoạt động và chúng sẽ được khôi phục khi hoạt động tiếp tục.

Gọi lại để tạo hộp thoại được quản lý (lưu và khôi phục) cho bạn theo hoạt động. Nếu bạn sử dụng showDialog(int), hoạt động này sẽ gọi đến phương thức này lần đầu tiên và treo vào nó sau đó. Bất kỳ hộp thoại nào được tạo bằng phương pháp này sẽ tự động được lưu và khôi phục cho bạn, bao gồm cả hộp thoại đang hiển thị hay không. Nếu bạn muốn hoạt động quản lý hộp thoại lưu và khôi phục cho bạn, bạn nên ghi đè phương thức này và xử lý bất kỳ id nào được chuyển tới showDialog (int). Nếu bạn muốn có cơ hội chuẩn bị hộp thoại của mình trước khi được hiển thị, hãy ghi đè onPrepareDialog(int, Dialog).

Ví dụ sử dụng:

public class MyClass extends Activity { 
// ........ // 
static final int DATE_DIALOG_ID = 1; 
@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 

    case DATE_DIALOG_ID: 
    return new DatePickerDialog(this, mDateSetListener, mYear, mMonth, 
    mDay); 
    } 
    return null; 
} 

    public void launchSetDate() { 
    showDialog(DATE_DIALOG_ID); 
} 
} 
+0

Tôi đã thử điều đó và hộp thoại vẫn bị loại bỏ khi tôi nhấn nút tìm kiếm. – yuku

+0

Và khi bạn quay trở lại ứng dụng? – Pentium10

+0

hộp thoại tiến trình không còn ở đó nữa :( – yuku

35
setCanceledOnTouchOutside(false); 
3

mProgressDialog.setCancelable(false); làm việc cho tôi.

Các vấn đề liên quan