2013-08-12 31 views
14

Tôi tạo một WebView hiển thị trang web. Trang web chứa các liên kết không có thuộc tính target="_blank" và một số có liên kết.Android - Mở liên kết _blank mục tiêu trong WebView với trình duyệt bên ngoài

Tôi cần mở các liên kết có target được xác định trong trình duyệt thiết bị tiêu chuẩn bên ngoài và các trình duyệt không có nó bên trong WebView.

Tôi đang sử dụng một WebViewClient và tôi đã cố gắng xung quanh với chức năng này nhưng vẫn tất cả các liên kết của tôi được mở trong WebView:

Alternative 1:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 

    return super.shouldOverrideUrlLoading(view, url);   
} 

Phương án 2:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 

    view.loadUrl(url); 
    return true;   
} 

Có ai biết cách tôi có thể mở liên kết trống bên ngoài không?

Cảm ơn!

PS: Để tránh bị lỗi lầm: Tôi không thể sử dụng this approach vì cách duy nhất tôi biết liên kết nên được mở ra bên ngoài là thuộc tính target.

Trả lời

30

Sau khi truy cập các liên kết ở trên, tôi tìm ra mã này và hy vọng điều này sẽ hữu ích.

wv.getSettings().setSupportMultipleWindows(true); 
wv.setWebChromeClient(new WebChromeClient() { 
    @Override 
    public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, android.os.Message resultMsg) 
    { 
     WebView.HitTestResult result = view.getHitTestResult(); 
     String data = result.getExtra(); 
     Context context = view.getContext(); 
     Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(data)); 
     context.startActivity(browserIntent); 
     return false; 
    } 
}); 
+2

Điều quan trọng là phải hiểu khi nào onCreateWindow kích hoạt. Vui lòng xem [link] (http://therockncoder.blogspot.in/2014/04/understanding-androids-webchromeclient.html) để hiểu rõ hơn –

+0

Có cách nào để thực hiện điều này với webviewclient thông thường không? –

+0

đôi khi 'dữ liệu' là null –

0

Tôi cũng có cùng một vấn đề và bây giờ tôi đã tìm ra giải pháp.

Bạn cũng cần sử dụng WebChromeClient.Bạn có thể xem thisthis. Và bạn có thể đặt WebViewClient thành WebView mới và ghi đè phương thức shouldOverrideUrlLoading, sau đó bạn có thể lấy url và làm bất cứ điều gì bạn muốn ở đây. Nếu bạn không thiết lập WebViewClient, tôi nghĩ nó cũng hoạt động. Trong trường hợp của tôi, tôi muốn lấy url, vì vậy tôi đã đặt một WebViewClient cho WebView mới.

Nhân tiện, nếu bạn xóa chế độ xem web cũ thì khi bạn quay lại biểu mẫu trình duyệt, chế độ xem web trống. Vì vậy, tôi giữ lại webview và thêm một cái mới nhưng thiết lập khả năng hiển thị để "biến mất".

3

Tôi gặp phải vấn đề tương tự. Tôi muốn mở các trang web của tôi bên trong ứng dụng và phần còn lại tất cả các trang nên được mở trong Trình duyệt Mặc định. Tôi đã sử dụng một kỹ thuật. Nếu URL chứa tên trang web của tôi thì tôi đã mở nó trong WebView và giữ lại tất cả các trang web đã mở trong trình duyệt Mặc định.

Tìm mã bên dưới, tôi hy vọng Nó sẽ hữu ích cho tất cả những ai gặp phải vấn đề như vậy.

private class MyBrowser extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.contains("/internetgeeks")) { 
      browser.loadUrl(url); 
      return false; 
     } else { 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      startActivity(intent); 
      return true; 
     } 
    } 
} 
+0

Câu trả lời của Carson-ip là tốt hơn: nó thực sự xử lý' target = "_ blank" 'như được yêu cầu. – Guillaume

+0

Chỉ để bổ sung cho câu trả lời, startActivity không có sẵn cho tôi, tôi gọi là 'intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);' và gọi hoạt động bằng 'view.Context.ApplicationContext.StartActivity (intent);' – Daniel

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