如何禁用Android WebView中的链接、页面及引用加载行为?
解决WebView禁用链接/图片跳转的问题
嗨,作为Android新手,你遇到的这个问题其实很好解决!核心问题出在你自定义的MyWebViewClient里的shouldOverrideUrlLoading方法实现——你之前的代码是让WebView继续加载新URL,这和你想要禁用跳转的需求完全相反。
关键修改点
要阻止WebView加载新链接,你只需要:
- 在
shouldOverrideUrlLoading方法里不要调用view.loadUrl(url) - 直接返回
true,告诉WebView:这个URL我们自己处理(这里就是啥也不做,自然就不会跳转了) - 为了兼容Android 7.0及以上版本,还要实现重载的
shouldOverrideUrlLoading(WebView view, WebResourceRequest request)方法,因为新版本系统会优先调用这个方法
完整修改后的代码
public class MainActivity extends AppCompatActivity { ProgressBar progressBar; WebView webView; String url="http://example.com"; TextView textView; //to hide progressbar after loading part 1 LinearLayout liProgressContainer; private String currentUrl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progressBar = (ProgressBar) findViewById(R.id.progressBar); webView = (WebView) findViewById(R.id.webView); textView = (TextView) findViewById(R.id.tvLoadingPercentage); //to hide progressbar after loading part 2 liProgressContainer = (LinearLayout) findViewById(R.id.liProgressContainer); webView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { progressBar.setProgress(progress); textView.setText(progress + " %"); } }); webView.setWebViewClient(new MyWebViewClient()); WebSettings browserSetting = webView.getSettings(); browserSetting.setJavaScriptEnabled(true); webView.loadUrl(url); } //back button function @Override public void onBackPressed() { if (webView.canGoBack()) { webView.goBack(); } else { super.onBackPressed(); } } private class MyWebViewClient extends WebViewClient { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { liProgressContainer.setVisibility(View.VISIBLE); super.onPageStarted(view, url, favicon); } // 兼容旧版本Android的方法 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 直接返回true,不加载新URL,禁用跳转 return true; } // 兼容Android 7.0及以上版本的方法 @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { // 同样返回true,阻止跳转 return true; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); liProgressContainer.setVisibility(View.GONE); //hide header part } } }
为什么这样修改?
shouldOverrideUrlLoading方法的作用是决定WebView是否要加载新的URL:返回true表示我们自己处理这个请求(这里我们啥也不做,就不会跳转);返回false则让WebView正常加载新URL。- 加上Android 7.0+的重载方法,是因为从API 24开始,系统会优先调用带
WebResourceRequest参数的版本,只写旧版本的方法可能会失效。
这样修改后,不管是点击网页里的链接还是触发跳转的图片,WebView都不会加载新内容了,完美符合你的需求!
内容的提问来源于stack exchange,提问作者Mr.Mark
相关产品推荐
相关产品推荐

