Android Don';t导航到WebView中的其他页面,禁用链接和引用

Android Don';t导航到WebView中的其他页面,禁用链接和引用,android,html,webview,Android,Html,Webview,我有一个Android的webView,我在里面打开了一个html网页。但是它充满了链接和图片,当我点击其中一个时,它就会加载到我的webview中。我想禁用此行为,因此如果我单击链接,请不要加载它。我试过这个,为自己编辑了一些,但没有成功。 我的webviewclient代码: private boolean loaded = false; @Override public boolean shouldOverrideUrlLoading(WebView view, String url)

我有一个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);

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

如果要在不同窗口中打开网页的内部链接,则

不要使用

WebView webView;//Your WebView Object
webView.setWebViewClient(new HelpClient());// Comment this line
B'cozsetWebViewClient()方法负责在同一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;
    }
}

希望这能起作用。

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

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

}

}

您应该将当前url保存在类变量中,并检查它是否与加载的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);

实现一个WebViewClient,并从WebView客户端的这个方法返回true

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

就连我也面临着同样的问题。我解决了这个问题如下

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

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

与阿米特·古普塔的答案非常相似,但我找到了一个较短的方法

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

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

对于早于24的API,第二个参数是字符串,该签名现在已被弃用

对于API24及更高版本,第二个参数是WebResourceRequest

如果您的应用程序同时支持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;
        }
    });

@Override onPageFinished上使用注入javascript


我不想导航到其他页面,保持不变。就像禁用引用和链接一样。@Dandelion您正在从资产加载静态html页面,还是它是一个URL?它是一个URL。我在ListView中有很多引用,当用户单击其中一个时,它将在webview中打开。是的,我使用它,我将用实现更新我的问题。我已经更新了我的答案。这似乎对我很有效。希望有帮助。阻止webview打开内容中包含的任何url的最正确方法。****--它只是为了停止--****这会阻止用户滚动,因此它只在您不需要在WebView中滚动的情况下才起作用。请确保您的答案比此问题中已有的其他答案有所改进。我们是否可以以某种方式禁用单击?菜单仍然可以在webview中展开,其中显示了要导航的链接,但在此解决方案之后当然无法导航。
view.loadUrl(
    javascript: (function () {


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

    })()
);