简体   繁体   English

每次当 kotlin 中的 webview url 更改时,都需要使用 url 更新 textview

[英]Need to update textview with url everytime when webview url changes in kotlin

Trying make a simple browser, and can't set a fild that will showing current webview's url.尝试制作一个简单的浏览器,但无法设置显示当前 webview url 的字段。 Tried override functions, but always says that "name of function" overrides nothing.尝试过覆盖函数,但总是说“函数名称”没有覆盖任何内容。 Also can add that webview is within fragment.也可以添加 webview 在片段内。 Maybe i can call this from mainactivity, but idk how.也许我可以从 mainactivity 调用它,但我知道如何。 webview_fragment.kt 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主要活动.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() } } }

You can simply get the web url from the webView like this您可以像这样简单地从 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} ")
            }
        }

There are few issues in your code您的代码中几乎没有问题

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())
        }
    }

In the above code the textView you are trying to access it from the WebView's view instead from your fragment's view that's why you are facing the issue, you should rename the reference to the webView in override fun onPageFinished(view: WebView?, url: String?) to resolve the conflict.在上面的代码中,您尝试从 WebView 的视图而不是从片段的视图访问它的 textView,这就是您面临问题的原因,您应该重命名对 webView 的引用,以覆盖 fun onPageFinished(view: WebView?, url: String ?)来解决冲突。

You can simply do it like this,你可以简单地这样做,

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

it will update the text view automatically every time you move to another web page.每次您移动到另一个网页时,它都会自动更新文本视图。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM