Nhấp vào URL sẽ mở trình duyệt mặc định


209

Tôi đã tải một URL bên ngoài trong của tôi WebView. Bây giờ điều tôi cần là khi người dùng nhấp vào các liên kết trên trang được tải, nó phải hoạt động như một trình duyệt bình thường và mở liên kết tương tự WebView. Nhưng nó đang mở trình duyệt mặc định và tải trang ở đó?

Tôi đã kích hoạt JavaScript. Nhưng nó vẫn không hoạt động. Tôi đã quên một cái gì đó?

Câu trả lời:


353

Nếu bạn đang sử dụng, WebViewbạn sẽ phải tự chặn các nhấp chuột nếu bạn không muốn hành vi mặc định của Android.

Bạn có thể theo dõi các sự kiện trong một WebViewbằng cách sử dụng WebViewClient. Phương pháp bạn muốn là shouldOverrideUrlLoading(). Điều này cho phép bạn thực hiện hành động của riêng mình khi một URL cụ thể được chọn.

Bạn đặt phương thứcWebViewClient của bạn WebViewbằng setWebViewClient()phương pháp .

Nếu bạn nhìn vào WebViewmẫu trong SDK, có một ví dụ thực hiện đúng những gì bạn muốn. Nó đơn giản như:

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

97
Có vẻ như đây là hành vi mặc định cho WebViewClientvà không cần phân lớp nếu đây là tất cả những gì bạn đang làm. Tôi đã làm việc này chỉ bằng cách thực hiệnmyWebView.setWebViewClient(new WebViewClient());
Adam

7
@ dave-webb vui lòng cập nhật mẫu để không gọi loadUrl. Mọi người đọc điều này - vui lòng không sao chép mã (trả về false từ cuộc gọi lại thay vì gọi view.loadUrl). Gọi loadUrl giới thiệu một lỗi tinh vi trong đó nếu bạn có bất kỳ iframe nào trong trang có URL lược đồ tùy chỉnh (giả sử <iframe src = "tel: 123" />) thì nó sẽ điều hướng khung chính của ứng dụng của bạn đến URL đó rất có thể phá vỡ ứng dụng như Một tác dụng phụ.
marcin.kosiba

1
@Adam ++ - vâng tôi cũng nhận thấy điều này - Tôi không thể hiểu tại sao một trong số các lượt xem web của tôi KHÔNG sử dụng trình duyệt hệ thống và đó là vì tôi đã thêm một webclient mới vào nó chỉ ghi đè phương thức KHÁC. Điều đó làm tôi mất một lúc để gỡ lỗi.
Peter Ajtai

Chúng tôi có thể triển khai một cái gì đó như: onLongClick, mở các liên kết trong trình duyệt bên ngoài không?
TheOnlyAnil

54

trong một số trường hợp, bạn có thể cần ghi đè onLoadResource nếu bạn nhận được chuyển hướng không kích hoạt phương thức tải url. trong trường hợp này tôi đã thử như sau:

@Override
public void onLoadResource(WebView view, String url)
{
    if (url.equals("http://redirectexample.com"))
    {
        //do your own thing here
    }
    else
    {
        super.onLoadResource(view, url);
    }           
}

Điều đó thật tuyệt! Tiết kiệm cho tôi nhiều giờ cố gắng tìm ra cách phát tệp MP3 từ một liên kết trong một lần xem web. Cảm ơn rất nhiều realgt!
Brigante

25

Tài liệu chính thức cho biết, nhấp vào liên kết trong WebView sẽ khởi chạy ứng dụng xử lý URL. Bạn cần ghi đè hành vi mặc định này

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

hoặc nếu không có logic điều kiện trong phương thức, chỉ cần làm điều này

myWebView.setWebViewClient(new WebViewClient());

15

Thêm 2 dòng này vào mã của bạn -

mWebView.setWebChromeClient(new WebChromeClient()); 
mWebView.setWebViewClient(new WebViewClient());

9

Phương pháp boolean shouldOverrideUrlLoading(WebView view, String url)không được dùng trong API 24. Nếu bạn đang hỗ trợ các thiết bị mới, bạn nên sử dụng boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request).

Bạn có thể sử dụng cả hai bằng cách làm một cái gì đó như thế này:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            view.loadUrl(request.getUrl().toString());
            return true;
        }
    });
} else {
    newsItem.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });
}

6

Câu trả lời của Arulx Z chính xác là những gì tôi đang tìm kiếm.

Tôi đang viết một ứng dụng với Ngăn kéo Điều hướng với recyclerview và webview, để giữ cho trình duyệt web bên trong ứng dụng bất kể các siêu liên kết được nhấp (do đó không khởi chạy trình duyệt web bên ngoài). Cho rằng nó sẽ đủ để đặt 2 dòng mã sau đây:

mWebView.setWebChromeClient(new WebChromeClient()); mWebView.setWebViewClient(new WebViewClient());

chính xác theo tuyên bố WebView của bạn.

Đây là một ví dụ về mã WebView được triển khai của tôi:

public class WebView1 extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView wv = (WebView) findViewById(R.id.wv1); //webview statement
    wv.setWebViewClient(new WebViewClient());    //the lines of code added
    wv.setWebChromeClient(new WebChromeClient()); //same as above

    wv.loadUrl("http://www.google.com");
}}

bằng cách này, mọi liên kết được nhấp vào trang web sẽ tải bên trong WebView của bạn. (Sử dụng Android Studio 1.2.2 với tất cả các SDK được cập nhật)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.