You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:37:30