2012-08-27 39 views
47

Tôi đang cố ngăn chặn hộp AlertDialog đóng khi nhấn nút quay lại trong Android. Tôi đã theo cả hai phương thức phổ biến in this thread và với System.out.println tôi có thể thấy rằng trong cả hai trường hợp mã thực hiện. Tuy nhiên, nút quay lại vẫn còn đóng hộp thoại.Ngăn chặn nút quay lại từ đóng hộp thoại

Tôi có thể làm gì sai? Cuối cùng, tôi đang cố ngăn chặn nút quay lại đóng hộp thoại - đó là tuyên bố từ chối được hiển thị lần đầu tiên ứng dụng chạy và tôi không muốn người dùng có bất kỳ tùy chọn nào nhưng nhấn nút "Chấp nhận" trong để ứng dụng tiếp tục.

+1

Nếu bạn yêu cầu người dùng chấp nhận giấy phép hoặc tuyên bố từ chối trách nhiệm (hoặc bất kỳ điều gì) thì bạn ** PHẢI ** cho phép họ từ chối. Nếu họ nhấp vào nút 'BACK' thì đảm bảo hộp thoại cấp phép/từ chối của bạn xuất hiện lại vào lần tiếp theo khi họ khởi động ứng dụng và lặp lại cho đến khi họ chấp nhận hoặc xóa ứng dụng khỏi thiết bị của họ. Nếu bạn chọn sử dụng phương pháp được đề xuất bởi Sam thì bạn ** PHẢI ** cung cấp nút 'Từ chối' nhưng sau đó tạo lại giấy phép/từ chối trách nhiệm vào lần tiếp theo khi họ khởi động ứng dụng. – Squonk

+1

Tôi sẽ xóa một ứng dụng cho phép tôi "chấp nhận" làm tùy chọn duy nhất ... và thậm chí không nghĩ đến việc vô hiệu hóa nút trang chủ! – WarrenFaith

+0

Ứng dụng có thể được đóng lại bằng cách nhấn nút trang chủ, nhưng về cơ bản ứng dụng không thể tiến hành qua tuyên bố từ chối trách nhiệm nếu giấy phép không được chấp nhận. @ Squonk, bạn đề cập rằng tôi * phải * cho phép họ từ chối; đây có phải là vấn đề pháp lý không? tức là có một luật mà phần mềm phải có thể sử dụng được (nếu nó đã được trả tiền) mà không chấp nhận thỏa thuận cấp phép? n.b. Tôi đã có một nút 'từ chối', và nhấn nút này bật lên một Toast() nói rằng bạn phải chấp nhận thỏa thuận để sử dụng ứng dụng. Hộp thoại như vậy vẫn tồn tại cho đến khi chấp nhận được nhấn. – CaptainProg

Trả lời

110

Đơn giản chỉ cần sử dụng tính năng setCancelable():

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setCancelable(false); 

Điều này ngăn cản các nút quay lại từ đóng hộp thoại, nhưng lá vào nút "tiêu cực" còn nguyên vẹn nếu bạn chọn để sử dụng nó.


Trong khi bất kỳ người dùng không muốn chấp nhận các điều khoản dịch vụ của bạn có thể nhấn nút nhà, trong ánh sáng của bình luận Squonk của, ở đây hơn hai cách để ngăn cản họ "ủng hộ out" của thỏa thuận người sử dụng. Một là một đơn giản "Từ chối" nút và ghi đè khác vào nút quay lại trong hộp thoại:

builder.setNegativeButton("Refuse", new OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       finish(); 
      } 
     }) 
     .setOnKeyListener(new OnKeyListener() { 
      @Override 
      public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 
       if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) 
        finish(); 
       return false; 
      } 
     }); 
+0

hoạt động của nó, nhờ –

+18

Ngoài ra, nếu sử dụng một 'DialogFragment', bạn nên gọi' setCancelable' trên đó và không phải trên 'Dialog' chính nó – Kuffs

+0

cảm ơn rất nhiều @Kuffs. Tôi đã cài đặt nó trên Hộp thoại và tự hỏi tại sao nó không hoạt động! – sasikt

10

Để ngăn chặn các nút quay lại đóng một Dialog (không phụ thuộc vào hoạt động), chỉ cần đoạn mã sau:

alertDialog.setOnKeyListener(new DialogInterface.OnKeyListener() { 
    @Override 
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 
     // Prevent dialog close on back press button 
     return keyCode == KeyEvent.KEYCODE_BACK; 
    } 
}); 
+1

Làm việc đẹp trong trường hợp của tôi. Tôi đã phải tải 'WebView' trên ứng dụng của mình. Tôi phải kiểm tra 'canGoBack()' và đóng hộp thoại nếu nó sai. – pandalion98

1

Sử dụng setCancelable(false)

SampleDialog sampleDialog = SampleDialog.newInstance(); 
sampleDialog.setCancelable(false); 
sampleDialog.show(getSupportFragmentManager(), SampleDialog.class.getSimpleName()); 
0

Chỉ này làm việc cho tôi:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
builder.setTitle(title); 
builder.setMessage(content); 

/** 
* Make it when the Back button is pressed, the dialog isn't dismissed. 
*/ 
builder.setOnKeyListener(new DialogInterface.OnKeyListener() { 
    @Override 
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 
     if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { 
      Utilities.makeToast(getContext(), "There is no way back!"); 
      return true; // Consumed 
     } 
     else { 
      return false; // Not consumed 
     } 
    } 
}); 

Dialog dialog = builder.create(); 

/** 
* Make it so touching on the background activity doesn't close the dialog 
*/ 
dialog.setCanceledOnTouchOutside(false); 

return dialog; 

Như bạn có thể thấy, tôi cũng đã thêm một dòng dialog.setCanceledOnTouchOutside(false); để chạm vào bên ngoài hộp thoại không dẫn đến việc bị đóng.

0

Khi sử dụng DialogFragment bạn sẽ cần phải gọi setCancelable() trên mảnh, không phải là thoại:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    dialog = new ProgressDialog(getActivity()); 
    dialog.setIndeterminate(true); 
    dialog.setMessage(...); 
    setCancelable(false); 

    return dialog; 
} 

Calling dialog.setCancelable() dường như không có hiệu lực. Có vẻ như DialogFragment không thông báo cài đặt của hộp thoại về tính hủy.

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