2011-02-05 24 views
5

Tôi có WebView mà tôi muốn mở liên kết thuộc về tên miền www.example.org trong chế độ xem web trong khi tất cả các liên kết khác (nếu được nhấp) mở bởi trình duyệt mặc định bên ngoài ứng dụng của tôi.Làm cách nào để tạo liên kết mở trong chế độ xem web hoặc mở theo trình duyệt mặc định tùy thuộc vào tên miền?

Tôi đã cố gắng sử dụng boolean shouldOverrideUrlLoading (chế độ xem WebView, URL chuỗi) nhưng nó không hoạt động chính xác.

Dưới đây là đoạn code mà không hoạt động:

public class MyWebViewClient extends WebViewClient { 
    @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        try { 
        URL urlObj = new URL(url); 
        if (urlObj.getHost().equals("192.168.1.34")) { 
         view.loadUrl(url); 
         return true; 
        } else { 
         view.loadUrl(url); 
         return false; 
        } 
        } catch (Exception e) { 

        } 
       } 
} 

Trong cả hai trường hợp (trở thành sự thật và trả lại false) URL được xử lý bởi ứng dụng của tôi.

+1

Mã này thực sự mang đến cho bạn không có đầu mối những gì các hành vi khác nhau là khi trả lại một giá trị boolean khác nhau bởi vì bạn đang gọi view.loadUrl() trong cả hai trường hợp, do đó sản xuất cùng một kết quả. Nếu bạn đã loại bỏ dòng đó khỏi cả hai câu lệnh, bạn sẽ thấy rằng return false vẫn tải url trong WebView ... và trả về true thì không có gì (bạn phải tự làm điều gì đó). – Devunwired

Trả lời

22

Khi bạn tạo và gắn một WebViewClient để bạn WebView, bạn đã ghi đè hành vi mặc định mà Android sẽ cho phép ActivityManager để vượt qua URL vào trình duyệt (điều này chỉ xảy ra khi không có khách hàng được thiết lập trên quan điểm), xem the docs on the method for more .

Một khi bạn đã gắn một WebViewClient, trở về hình thức sai shouldOverrideUrlLoading() vượt qua url cho WebView, khi trở về đúng kể WebView để làm gì ... bởi vì ứng dụng của bạn sẽ chăm sóc nó. Thật không may, cả hai đường dẫn này đều không cho phép Android chuyển URL tới trình duyệt. Một cái gì đó như thế này nên giải quyết vấn đề của bạn:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    try { 
     URL urlObj = new URL(url); 
     if(TextUtils.equals(urlObj.getHost(),"192.168.1.34")) { 
     //Allow the WebView in your application to do its thing 
     return false; 
     } else { 
     //Pass it to the system, doesn't match your domain 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setData(Uri.parse(url)); 
     startActivity(intent); 
     //Tell the WebView you took care of it. 
     return true; 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Tôi biết rằng dường như một chút phản trực giác như bạn mong chờ return false; để hoàn toàn phá vỡ WebView, nhưng đây không phải là trường hợp khi bạn đang sử dụng một tùy chỉnh WebViewClient.

Hy vọng điều đó sẽ hữu ích!

+0

Cảm ơn mã nhưng tiếc là điều này không hoạt động. Tôi đã thử mã của bạn, trình duyệt bên ngoài tải url (www.example.org) ngay khi tôi khởi động ứng dụng. – ace

+0

Điều đó nghe có vẻ giống như một vấn đề với câu lệnh if chọn đường dẫn. Tôi đã cập nhật ví dụ bây giờ mà bạn đã đăng mã bằng cách sử dụng kiểm tra if-else nếu bạn đã làm (chúng tôi đều giả định rằng tuyên bố đánh giá các URL của bạn một cách chính xác). – Devunwired

+0

Xin chào, nó vẫn không hoạt động. Một lần nữa, trình duyệt bên ngoài xử lý url cho dù mã của tôi có ngược lại không. Có vẻ như tài liệu của google trên trang này là – ace

5

Nếu bạn không thể bị làm phiền để giải thích những gì "không hoạt động đúng" có nghĩa là, chúng tôi không thể bị làm phiền để cung cấp cho bạn nhiều trợ giúp cụ thể.

Sử dụng shouldOverrideUrlLoading(). Kiểm tra URL được cung cấp. Nếu đó là số bạn muốn giữ trong số WebView, hãy gọi số loadUrl() trên số WebView bằng URL và trả lại true. Nếu không, hãy trả lại false và để Android xử lý thông thường.

1

Thêm dòng sau vào hoạt động của bạn

@Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       if(Uri.parse(url).getHost().endsWith("192.168.1.34")) { 
        view.loadUrl(url); 
        Log.d("URL => ", url); // load URL in webview 
        return false; 
       } 

       Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
       view.getContext().startActivity(intent); // Pass it to the system, doesn't match your domain 
       return true; 
      } 
Các vấn đề liên quan