2013-03-12 34 views
5

là có thể kiểm tra xem người dùng đã nhấp vào liên kết html với target = "_ blank" chưa.Android WebView: Xác định <a> target = "_ blank"

Điều tôi muốn làm là hiển thị htlm trong ứng dụng của tôi trong WebView, nhưng bắt đầu liên kết "bên ngoài" trong trình duyệt mặc định của Android. Liên kết "bên ngoài" dành cho tôi liên kết với target = "_ blank". Tất cả các liên kết khác phải được xử lý trong chế độ xem web.

Vì vậy, ví dụ: người dùng nhấp vào một liên kết như thế này trong WebView tôi:

<a href="http://www.google.com" target="_blank">new window</a> 

và sau đó tôi muốn mở url đưa ra trong trình duyệt Android.

Tôi đã thử nó với shouldOverrideUrlLoading(), nhưng tại thời điểm này tôi không thể xác định, nếu mục tiêu là "_blank" hoặc liên kết bình thường (không có mục tiêu).

Tôi đã thử cũng đặtSupportMultipleWindows (true); kết hợp với onCreateWindow(), nhưng trong cuộc gọi lại này, tôi không thể nhận được url.

tôi không thể thay đổi mã HTML được hiển thị, vì vậy tôi không thể sử dụng một cầu JavaScript với addJavascriptInterface()

tôi có thể làm gì khác? Bạn có ý tưởng nào khác không?

+0

Làm cách nào để sửa lỗi cuối cùng? – Sagar

Trả lời

1

Bạn có thể làm như sau: (xấu xí nhưng sẽ làm việc)

bên onPageFinished(), tiêm một đoạn mã javascript vào trang đó làm điều gì đó như:

  1. lặp trên tất cả các yếu tố với thuộc tính target = _blank
  2. thay đổi href cho các phần tử đó thành bên ngoài: // [original href]

Nếu trang web sử dụng jquery nó phải dễ dàng. Nếu không, bạn vẫn có thể làm điều đó bằng cách sử dụng Javascript DOM chuẩn.

trên shouldOverrideUrlLoading() của bạn, tìm những liên kết bên ngoài: // * đó và mở chúng ra bên ngoài.

Để tiêm javascript, làm như sau:

webView.loadUrl("javascript:(function() { PLACE YOUR JS CODE HERE })()"); 
3

Tôi chỉ giải quyết vấn đề này bản thân mình. Đây là cách tôi sửa nó.

mWebView.setWebChromeClient(new WebChromeListener() { 
    @Override 
    public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) { 
     WebView newWebView = new WebView(view.getContext()); 
     newWebView.setWebViewClient(new WebViewClient() { 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
       startActivity(browserIntent); 
       return true; 
      } 
     }); 
     WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; 
     transport.setWebView(newWebView); 
     resultMsg.sendToTarget(); 
     return true; 
    } 
}); 
+0

Điều này có một vấn đề mặc dù, nó sẽ mở ra lần đầu tiên bạn mở một liên kết, nhưng các nhấp chuột tiếp theo không làm bất cứ điều gì (nhất thời gian). Thử nghiệm điều này trên hai thiết bị. Nó làm việc khi tôi hủy 'newWebView' mặc dù, trong phương thức' shouldOverrideUrlLoading', gọi 'Handler.postDelayed (xxx, 200);' where 'xxx' là một runnable mà bạn gọi phương thức' destroy() 'trên 'newWebView'. – jadkik94

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