gpt4 book ai didi

android - 在 Kotlin 中使用 MVVM 实现两种方式的数据绑定(bind) WebView

转载 作者:行者123 更新时间:2023-12-02 13:12:05 26 4
gpt4 key购买 nike

我正在尝试在我的所有应用程序中实现 MVVM,我对此很陌生,所以我想通过我的 ViewModel 加载一个 webview,但我不知道如何做到这一点的最佳方法,如果还有一个进度条加载我的 WebView 时显示。

这是代码:

    class NewWebViewFragment : Fragment() {

private lateinit var viewModel: NewWebViewViewModel

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

val binding: FragmentWebViewBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_web_view, container, false)

val webViewModelo = ViewModelProviders.of(this).get(NewWebViewViewModel::class.java)

binding.webViewModel = webViewModelo
binding.lifecycleOwner = this


return binding.root
}

}

现在我的 View 模型:
class NewWebViewViewModel : ViewModel() {

//Implement in MVVM

private fun showWebView(webView: WebView, progressBar: ProgressBar) {

webView.webViewClient = WebViewClient()
webView.webChromeClient = WebChromeClient()

val webSettings = webView.settings
webSettings.javaScriptEnabled = true

webView.loadUrl("https://brand.randombrand.com/en/")

webView.webViewClient = object : WebViewClient() {
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
progressBar.visibility = View.VISIBLE
super.onPageStarted(view, url, favicon)
}

override fun onPageFinished(view: WebView?, url: String?) {
progressBar.visibility = View.GONE
super.onPageFinished(view, url)
}
}
}
}

和我的 XML:
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">


<data>
<variable
name="webViewModel"
type="com.example.navigations.viewmodel.webview.NewWebViewViewModel" />
</data>

<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".fragments.WebViewFragment">


<!-- TODO: Update blank fragment layout -->
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/webView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">


</WebView>

<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/progressBar"
android:layout_gravity="center"/>


</FrameLayout>
</layout>

我得到的错误是 nullpointerexception导致我传递的 webview 为空。
对实现这一点的最佳方法有什么想法吗?

最佳答案

我认为对您来说最好的选择是创建一个如下所示的绑定(bind)适配器:

@BindingAdapter("loadUrl")
fun WebView.setUrl(url: String) {
this.loadUrl(url)
}

在您的 ViewModel 中,您可以通过 Fragment 参数接收数据(也许它们来自另一个 Fragment),或者只是从 ViewModel 修改它们。

在 VM 中,数据将是要加载的 url,可能像 val webViewUrl = MutableLiveData<String>().apply{ value = "initial url to be loaded .com" } .

在你的 xml 中:
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/webView"
app:loadUrl="@{viewModel.webViewUrl}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">

是的,你永远不应该在 ViewModel 中做 UI 的事情,比如实例化一个 WebView,或者类似的东西。

关于android - 在 Kotlin 中使用 MVVM 实现两种方式的数据绑定(bind) WebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59858720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com