android-fragments 每次当Kotlin中的webview url改变时,需要用url更新textview

ux6nzvsh  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(136)

试着做一个简单的浏览器,但是不能设置一个显示当前webview的url的字段。试着覆盖函数,但是总是说“函数名”什么都不覆盖。也可以添加webview在fragment中。也许我可以从mainactivity调用这个,但是idk怎么做。webview_fragment.kt

package com.example.webviewapp

import android.content.ContentValues.TAG
import android.graphics.Bitmap
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 android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment

class webview_fragment : Fragment(){

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?

    ): View? {
        val view : View = inflater.inflate(R.layout.layout_webview_fragment, container, false)
        val  mWebView : WebView = view.findViewById(R.id.webViewMain)
        mWebView.loadUrl("https://google.com")
        val webSettings = mWebView.getSettings()
        webSettings.setJavaScriptEnabled(true)
        mWebView.setWebViewClient(WebViewClient())
        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()
                    }
                }
            }
            )
        mWebView.webViewClient = object : WebViewClient(){
            override fun onPageFinished(view: WebView?, url: String?) {
                super.onPageFinished(view, url)
                val urlText: TextView? = view?.findViewById(R.id.urlText)
                val  mWebView : WebView? = view?.findViewById(R.id.webViewMain)
                urlText?.setText(mWebView?.getUrl())
            }
        }
        return view
    }
}

mainactivity.kt

package com.example.webviewapp

import android.content.ContentValues.TAG
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        
        if (getSharedPreferences("app", Context.MODE_PRIVATE).getBoolean("Boolean", false) == false) {
            supportFragmentManager
                .beginTransaction()
                .replace(R.id.fullcreen_holder, start_fragment())
                .commit()
        } else {
            supportFragmentManager
                .beginTransaction()
                .replace(R.id.fullcreen_holder, webview_fragment())
                .commit()
        }
    }
}
1zmg4dgp

1zmg4dgp1#

您可以简单地从webView获取web url,如下所示

binding.webView.webViewClient = object : WebViewClient() {
            override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                super.onPageStarted(view, url, favicon)
                Log.d("onPageStarted ","${view?.url} ")
            }

            override fun onPageFinished(view: WebView?, url: String?) {
                super.onPageFinished(view, url)
                Log.d("onPageFinished ","${view?.url} ")
            }
        }

您的代码中几乎没有问题

val view : View = inflater.inflate(R.layout.layout_webview_fragment, container, false)

mWebView.webViewClient = object : WebViewClient(){
        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)
            val urlText: TextView? = view?.findViewById(R.id.urlText)
            val  mWebView : WebView? = view?.findViewById(R.id.webViewMain)
            urlText?.setText(mWebView?.getUrl())
        }
    }

在上面的代码中,textView您尝试从WebView的视图而不是从片段的视图访问它,这就是您遇到问题的原因,您应该在**override fun onPageFinished(view:WebView ™,网址:字符串?)**来解决冲突。

sulc1iza

sulc1iza2#

你可以这样做,

YOUR_WEBVIEW.apply {
        webChromeClient = object : WebChromeClient() {
            override fun onReceivedTitle(view: WebView?, title: String?) {
                super.onReceivedTitle(view, title)
                YOUR_TEXTVIEW.text = title.toString()
            }
        }
}

它会在你每次移动到其他网页时自动更新文本视图。

相关问题