2013-04-09 24 views
8

Tôi có ghi đè onJsAlert hành vi WebChromeClient tôi như:Android webview sau onJsAlert vòi không đáp ứng

WebChromeClient wvcc = new WebChromeClient() { 
      @Override 
      public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { 
    //... 
    return true; 
    } 
} 

ứng dụng của tôi xử lý thành công các cảnh báo Js và đàn áp cảnh báo ban đầu. Tuy nhiên, sau sự kiện cảnh báo, tôi không thể bấm vào các nút của tôi (trong danh sách các mục listview) trên trang web trong webview của tôi. Tôi hiện đang sử dụng điện thoại di động jquery để xây dựng trang web của mình.

Có điều gì khác mà tôi nên biết không?

+0

Chỉ cần đối mặt với cùng một khả năng, xem giải pháp dưới đây – RMalke

Trả lời

16

Tôi chỉ gặp vấn đề tương tự. Tôi muốn tạo ra một hộp thoại tùy chỉnh Android thay vì cảnh báo, đến đây là giải pháp cuối cùng:

myWebView.setWebChromeClient(new WebChromeClient() { 
    @Override 
    public boolean onJsAlert(WebView view, final String url, String message, 
      JsResult result) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(
       MainActivity.this); 
     builder.setMessage(message) 
       .setNeutralButton("OK", new OnClickListener() { 
        @Override 
        public void onClick(DialogInterface arg0, int arg1) { 
         arg0.dismiss(); 
        } 
       }).show(); 
     result.cancel(); 
     return true; 
    } 
}); 

Điều quan trọng là result.cancel();return true;, tôi thử nghiệm ở một số kết hợp, và là người duy nhất mà không bị sa thải cảnh báo JS mặc định và không gây ra vấn đề cảm ứng là sự kết hợp này

+0

cảm ơn, tôi sẽ thử sau –

+1

Cảm ơn bạn rất nhiều vì đã đăng bài này! –

+0

Gọi hàm result.comfirm() cũng hoạt động. Và tôi nghĩ bạn nên gọi result.confirm() trong khối phương thức onClick. Và tất nhiên bạn nên tạo kết quả tham số phương thức là kết quả cuối cùng. – androidyue

1

bạn nên gọi result.confirm() phương pháp, giải pháp của tôi là:

 public boolean onJsAlert(WebView view, String url, String message, 
       final JsResult result) { 
      Log.i("MainActivity", "onJsAlert url=" + url + ";message=" + message); 
      Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); 
      result.confirm(); 
      return true; 
     } 
2

tôi cũng phải đối mặt với vấn đề tương tự (nhưng với onJsPrompt trong cas của tôi e) và giải pháp được đề xuất không hiệu quả đối với tôi. Tôi đã có các cuộc gọi tới số result.cancel()/result.confirm()return true từ trình xử lý. Chìa khóa để sửa chữa được tìm thấy trong mã nguồn của JsDialogHelper.

Đây là dòng mà tôi phát hiện để giải quyết vấn đề của tôi:

builder.setOnCancelListener(new CancelListener()); 

Mã xử lý hoàn tất:

@Override 
    public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) 
    { 
    final EditText data = new EditText(view.getContext()); 
    AlertDialog.Builder b = new AlertDialog.Builder(view.getContext()) 
    .setTitle(view.getTitle()) 
    .setView(data) 
    .setMessage(message) 
    .setOnCancelListener(new CancelListener(result)) // if this line is missing, WebView remains unresponsive after the dialog is shown and closed once 
    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() 
    { 
     @Override 
     public void onClick(DialogInterface dialog, int which) 
     { 
     result.confirm(data.getText().toString()); 
     } 
    }) 
    .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() 
    { 
     @Override 
     public void onClick(DialogInterface dialog, int which) 
     { 
     result.cancel(); 
     } 
    }); 

    b.show(); 

    return true; 
    } 

nơi CancelListener thể được định nghĩa như là một lớp còn sơ khai đơn giản:

private class CancelListener implements DialogInterface.OnCancelListener, 
DialogInterface.OnClickListener 
{ 
    CancelListener(JsResult result) 
    { 
    mResult = result; 
    } 

    private final JsResult mResult; 

    @Override 
    public void onCancel(DialogInterface dialog) 
    { 
    mResult.cancel(); 
    } 

    @Override 
    public void onClick(DialogInterface dialog, int which) 
    { 
    mResult.cancel(); 
    } 
}  

Tôi không chắc đây có phải là lỗi trong WebView hay không yêu cầu để luôn có trình xử lý hủy được xác định để giữ cho hộp thoại của chế độ xem web hoạt động bình thường.

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