不要导航到WebView中的其他页面,禁用链接和引用

时间:2013-10-17 12:27:02

标签: android html webview

我在Android中有一个webView,我在其中打开一个html网页。但它充满了链接和图像,当我点击其中一个时,它会加载到我的webview中。我想禁用此行为,因此如果我单击链接,请不要加载它。我试过这个solution并为myselft编辑了一下,但没有奏效。 我的webview客户代码:

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 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);

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

8 个答案:

答案 0 :(得分:22)

您应该在类变量中保存当前网址,并检查它是否与加载的网址相同。当用户点击链接时,会调用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);

答案 1 :(得分:13)

实现WebViewClient并从WebView Client的此方法返回true

webView.setWebViewClient(new WebViewClient(){
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return true;
    }
});

答案 2 :(得分:4)

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

不要使用

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

B' coz setWebViewClient()方法正在处理在同一webview中打开新页面。如此简单的评论这一行。

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;
    }
}

希望这会奏效。

答案 3 :(得分:2)

即使我一直面临同样的问题。我解决了这个问题如下

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

使用lambda表达式

webView.setOnTouchListener((v, event) -> true);

答案 4 :(得分: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);

}

}

答案 5 :(得分: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);

答案 6 :(得分:0)

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

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

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

如果您的应用同时支持API前24和后API,并且您想要禁用所有链接,则可以使用以下方法:

  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;
        }
    });

答案 7 :(得分:0)

@Override onPageFinished

上使用注入javascript
view.loadUrl(
    javascript: (function () {


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

    })()
);