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

Kotlin中Fragment内WebView URL变化时更新TextView的实现问题

问题原因

你遇到的编译报错和URL不更新问题来自三个核心代码错误:

  • 函数名 overrides nothing 报错:Kotlin会严格校验重写方法的签名(包括参数可空性),你写的onPageFinished方法将两个参数声明为可空类型(带?),但父类WebViewClient的同名方法参数是非空类型,签名不匹配导致编译器认为你没有重写任何父类方法
  • URL文本无法更新:onPageFinished回调传入的第一个参数view是当前加载页面的WebView实例,不是Fragment的根布局,你在这个WebView上调用findViewById查找urlText,自然找不到和WebView平级的文本控件,赋值逻辑根本不会执行
  • 冗余代码:你先后两次调用setWebViewClient,第一次设置的空WebViewClient实例会被第二次的自定义实例覆盖,属于无效代码
修复方案

不需要绕到MainActivity实现更新逻辑,直接在Fragment内修正代码即可,步骤如下:

  1. 在onCreateView加载布局后,提前从Fragment根视图获取WebView和URL文本框的引用,不要在WebView回调里查找控件
  2. 修正onPageFinished的方法签名,将参数改为非空类型,匹配父类方法定义
  3. 删除多余的默认WebViewClient设置逻辑

修正后的webview_fragment.kt完整代码:

package com.example.webviewapp

import android.content.ContentValues.TAG
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment


class webview_fragment : Fragment(){

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val rootView : View = inflater.inflate(R.layout.layout_webview_fragment, container, false)
        // 提前从根布局获取控件引用
        val mWebView : WebView = rootView.findViewById(R.id.webViewMain)
        val urlText: TextView = rootView.findViewById(R.id.urlText)
        
        mWebView.loadUrl("https://google.com")
        mWebView.settings.javaScriptEnabled = true

        // 仅设置一次自定义WebViewClient
        mWebView.webViewClient = object : WebViewClient(){
            // 参数改为非空类型,匹配父类签名
            override fun onPageFinished(view: WebView, url: String) {
                super.onPageFinished(view, url)
                // 直接更新文本
                urlText.text = mWebView.url
            }
        }

        // 返回键逻辑保持不变
        requireActivity()
            .onBackPressedDispatcher
            .addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
                override fun handleOnBackPressed() {
                    Log.d(TAG, "Fragment back pressed invoked")
                    if (mWebView.canGoBack()){
                        mWebView.goBack()
                    } else {
                        requireActivity().finishAndRemoveTask()
                    }
                }
            })
        return rootView
    }
}

mainactivity.kt的现有逻辑没有问题,不需要修改。

补充说明

如果后续需要把当前URL同步给MainActivity做其他操作,不要直接持有Activity引用更新,优先使用Fragment Result API或者共享ViewModel实现通信,避免内存泄漏。当前URL展示的场景完全在Fragment内即可实现,不需要增加跨组件通信逻辑。

修改完成后重新编译运行,即可解决编译报错,且页面跳转、前进后退时URL文本框会自动同步当前访问地址。


内容的提问来源于stack exchange,提问作者s4mkoff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:18:14