如何实现WebView内内部链接App打开、外部链接用默认浏览器打开?
解决WebView仅内部链接打开、外部链接跳转系统浏览器的问题
嗨,这个需求其实挺常见的,你只需要自定义WebViewClient并重写shouldOverrideUrlLoading方法,就能轻松区分内部和外部链接的打开方式啦。
原理说明
你之前用的默认WebViewClient会把所有链接都塞进当前WebView加载,我们要做的就是在跳转前判断目标URL是否属于你的域名(moviestreet.club):
- 如果是内部域名,就让WebView自己继续加载(返回
false) - 如果是外部域名,就调用系统默认浏览器打开该链接(返回
true表示我们接手了这个跳转逻辑)
修改后的完整代码
package club.moviestreet.www.webviewapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Intent; import android.net.Uri; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { private WebView mywebView; private static final String MY_DOMAIN = "moviestreet.club"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mywebView = (WebView) findViewById(R.id.webview); WebSettings webSettings= mywebView.getSettings(); webSettings.setJavaScriptEnabled(true); mywebView.loadUrl("http://moviestreet.club/"); // 替换默认WebViewClient为自定义实现 mywebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 更严谨的域名判断方式:解析URL后对比主机地址 Uri targetUri = Uri.parse(url); if (MY_DOMAIN.equals(targetUri.getHost())) { // 内部链接,交给WebView处理 return false; } else { // 外部链接,启动系统浏览器打开 Intent browserIntent = new Intent(Intent.ACTION_VIEW, targetUri); startActivity(browserIntent); return true; } } }); } // 返回按钮逻辑保持不变 @Override public void onBackPressed() { if(mywebView.canGoBack()) { mywebView.goBack(); } else { super.onBackPressed(); } } }
关键细节提醒
- 记得导入
Intent和Uri类,不然会出现编译错误 - 用
targetUri.getHost()对比域名比简单的contains更严谨,能避免像http://example.com/moviestreet.club这种带域名关键词的外部链接被误判成内部链接的情况
内容的提问来源于stack exchange,提问作者subhasish bose
相关产品推荐
相关产品推荐

