Android Studio:点击WebView内超链接跳转至新Activity的实现
没问题,这个需求实现起来超简单!核心思路就是拦截WebView里的跳转请求,把目标新闻的URL传递给一个通用的WebView Activity来加载就搞定了。下面是具体的实现步骤和代码修改:
1. 创建通用新闻详情Activity
首先我们需要新建一个专门用来展示单篇新闻的Activity(比如命名为NewsDetailActivity),它的职责就是接收外部传递的URL并加载展示。
步骤1-1:编写Activity布局文件(activity_news_detail.xml)
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:id="@+id/detail_webview" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>
步骤1-2:编写Activity的Java逻辑
import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; import android.view.MotionEvent; import android.webkit.WebSettings; import android.webkit.WebView; import androidx.appcompat.app.AppCompatActivity; public class NewsDetailActivity extends AppCompatActivity { private WebView detailWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_news_detail); detailWebView = findViewById(R.id.detail_webview); WebSettings webSettings = detailWebView.getSettings(); // 配置WebView基础设置,和你原Fragment里的配置保持一致即可 webSettings.setJavaScriptEnabled(true); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); webSettings.setAppCacheEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); // 获取从Fragment传递过来的新闻URL String newsUrl = getIntent().getStringExtra("NEWS_URL"); if (newsUrl != null) { detailWebView.loadUrl(newsUrl); } // 处理返回键逻辑,支持WebView页面回退 detailWebView.setOnKeyListener((v, keyCode, event) -> { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == MotionEvent.ACTION_UP && detailWebView.canGoBack()) { detailWebView.goBack(); return true; } return false; }); } }
步骤1-3:在Manifest中注册Activity
别忘了在AndroidManifest.xml里添加这个Activity的注册:
<activity android:name=".NewsDetailActivity" />
2. 修改原Fragment的WebView拦截逻辑
接下来我们需要修改你原Fragment中的WebViewClient,重写跳转拦截方法,把点击“阅读更多”后的URL传递给刚才创建的通用Activity。
在你原Fragment的loadWeb方法里,找到webview.setWebViewClient(new WebViewClient() { ... }),添加以下两个方法:
@Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { // 拦截Android 6.0及以上的跳转请求 String targetUrl = request.getUrl().toString(); // 启动通用新闻详情页 Intent intent = new Intent(getActivity(), NewsDetailActivity.class); intent.putExtra("NEWS_URL", targetUrl); startActivity(intent); // 返回true表示我们自己处理了跳转,WebView不再加载该URL return true; } // 兼容Android 6.0以下版本的跳转拦截 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Intent intent = new Intent(getActivity(), NewsDetailActivity.class); intent.putExtra("NEWS_URL", url); startActivity(intent); return true; }
原理说明
这样修改之后,当用户点击WebView里的“阅读更多”按钮时,WebView会触发跳转请求,我们通过shouldOverrideUrlLoading拦截这个请求,把目标URL通过Intent传递给NewsDetailActivity,由这个通用Activity来加载并展示新闻详情。完全不需要为每篇新闻单独创建Activity,完美解决你的需求!
内容的提问来源于stack exchange,提问作者tomjrgns
相关产品推荐
相关产品推荐

