32

我在 Android 中有一个 webView,并在其中打开了一个 html 网页。但它充满了链接和图像,当我单击其中一个时,它会加载到我的 webview 中。我想禁用这种行为,所以如果我点击一个链接,不要加载它。我已经尝试过这个解决方案并为自己进行了一些编辑,但没有奏效。我的 webviewclient 代码:

private boolean loaded = false;

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

    if(loaded == false){
        view.loadUrl(url);
        loaded = true;
        return true;
    }else{
        return false;
    }

}

我的 webview 实现和设置。

WebView wv = (WebView) findViewById(R.id.recipeWv);
    ourWebViewClient webViewClient = new ourWebViewClient();
    webViewClient.shouldOverrideUrlLoading(wv, URLsave);
    wv.setWebViewClient(webViewClient);
    wv.setFocusableInTouchMode(false);
    wv.setFocusable(false);
    wv.setClickable(false);
    WebSettings settings = wv.getSettings();
    settings.setDefaultTextEncodingName("utf-8");

    settings.setLoadWithOverviewMode(true);
    settings.setBuiltInZoomControls(true);

示例:如果用户在我的 Web 视图中打开 StackOverflow 主页并单击其中一个链接(如“问题”),则 Web 视图应保留在 StackOverflow 主页上。

4

8 回答 8

37

您应该将当前 url 保存在一个类变量中,并检查它是否与加载的相同。当用户单击链接时,shouldOverrideUrlLoading会调用并检查网站。像这样的东西:

private String currentUrl;

public ourWebViewClient(String currentUrl) {
    this.currentUrl = currentUrl;
}

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.equals(currentUrl)) {
        view.loadUrl(url);  
    }
    return true;
}

重要提示:不要忘记将 设置WebViewClient为您的WebView.

ourWebViewClient webViewClient = new ourWebViewClient(urlToLoad);
wv.setWebViewClient(webViewClient);
于 2013-10-23T21:24:03.600 回答
17

实现一个 WebViewClient 并从 WebView Client 的这个方法返回 true

webView.setWebViewClient(new WebViewClient(){
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return true;
    }
});
于 2016-03-01T06:24:13.613 回答
5

如果您想在不同的窗口中打开网页的内部链接,那么

不要使用

WebView webView;//Your WebView Object
webView.setWebViewClient(new HelpClient());// Comment this line

B'coz setWebViewClient()方法负责在同一个 web 视图中打开一个新页面。如此简单的评论这一行。

private class HelpClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().equals("www.example.com")) {
            // This is my web site, so do not override; let my WebView load the page
            return false;
        }
        // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }
}

希望这会奏效。

于 2013-10-17T12:50:05.110 回答
3

甚至我也面临同样的问题。我解决了这个问题,如下所示

webView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        return true;
                    }
                });

使用 lambda 表达式

webView.setOnTouchListener((v, event) -> true);
于 2018-03-19T07:33:21.480 回答
2

请注意,API 24 中的方法签名已更改。

对于早于 24 的 API,第二个参数是 String,现在不推荐使用该签名。

对于 API 24 及更高版本,第二个参数是 WebResourceRequest。

如果你的应用同时支持 pre 和 post API 24,并且你想禁用所有链接,你可以使用这个:

  webView.setWebViewClient(new WebViewClient(){
        @Override //for APIs 24 and later
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request){ 
           return true; 
        }
        @Override //for APIs earlier than 24
        public boolean shouldOverrideUrlLoading(WebView view, String url){
            return true;
        }
    });
于 2019-11-10T16:19:25.863 回答
1

您需要添加一行额外的代码,如下所示-

webview.loadUrl(url);
webview.setWebViewClient(new MyWebViewClient());

并像这样添加一个额外的类 MyWebViewClient -

/* Class for webview client */
class MyWebViewClient extends WebViewClient {

// show the web page in webview but not in web browser
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {

    view.loadUrl(url);

    return true;
}

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
}

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
}

@Override
public void onLoadResource(WebView view, String url) {
    super.onLoadResource(view, url);

}

}
于 2013-10-17T12:50:05.893 回答
0

与 Amit Gupta 的回答非常相似,但我找到了一种更短的方法。

private String currentUrl;

public CustomWebViewClient(String currentUrl) {
    this.currentUrl = currentUrl;
}

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    return ! url.equals(currentUrl);
}

定义此 CustomWebViewClient 后,将客户端设置为 webview。

CustomWebViewClient webViewClient = new CustomWebViewClient(urlToLoad);
wv.setWebViewClient(webViewClient);
于 2018-11-30T06:50:48.213 回答
0

在@Override onPageFinished上使用注入javascript

view.loadUrl(
    javascript: (function () {


        document.addEventListener('click', function (e) {
            e.stopPropagation();
        }
            , true);

    })()
);
于 2020-01-19T03:02:28.667 回答