android - Fragment Android Kotlin 中的 DataBinding+ViewModel

标签 android kotlin data-binding fragment android-databinding

我是 DataBinding 的新手。我想在 Fragment 中使用 ViewModel 和 DataBinding。当我在 Activity 中使用时,它可以工作,但不能在 Fragment 中工作。请帮助使用数据绑定(bind)获取编辑文本内容。先感谢您。
MainActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {

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

        supportFragmentManager.beginTransaction().add(R.id.main,BlankFragment()).commit()

    }
}
Activity .main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/main"
    tools:context=".MainActivity">

</androidx.constraintlayout.widget.ConstraintLayout>
空白 fragment .kt
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import com.resocoder.databinding.databinding.FragmentBlankBinding

class BlankFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        val binding: FragmentBlankBinding = DataBindingUtil.inflate(inflater,
                R.layout.fragment_blank, container, false)

        return binding.root
    }

}
fragment 空白.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
            name="viewmodel"
            type="com.resocoder.databinding.MainViewModel"/>
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".BlankFragment">

        <EditText
            android:id="@+id/editText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginBottom="8dp"
            android:text="@={viewmodel.editTextContent}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginBottom="8dp"
            android:text="Display in Log"
            android:onClick="@{() -> viewmodel.onDisplayEditTextContentClick()}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/editText"
            app:layout_constraintVertical_bias="0.0" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
主视图模型.kt
import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MainViewModel : ViewModel() {

    val editTextContent = MutableLiveData<String>()

    fun onDisplayEditTextContentClick() {
        Log.d("Murad",""+editTextContent.value)
    }
}

最佳答案

您的 ViewModelFragment没有任何联系
像这样做:
空白 fragment :

  private lateinit var vm: MainViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)    
         vm = activity?.run {
                ViewModelProviders.of(this)[MainViewModel::class.java]
            } ?: throw Exception("Invalid Activity")       
        }

      override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        val binding: FragmentBlankBinding = DataBindingUtil.inflate(inflater,
                R.layout.fragment_blank, container, false)
           binding.viewmodel = vm//attach your viewModel to xml
        return binding.root
      }
    }

关于android - Fragment Android Kotlin 中的 DataBinding+ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63137897/

相关文章:

java - 如何在 IntelliJ IDEA 中禁用 'Convert Java to Kotlin upon paste'?

kotlin - Jetpack Compose 在 textField 上的 maxlines 不起作用

WPF 无法将数据绑定(bind)到接口(interface)?

java - 在 xml 文件上添加除 main 之外的按钮

java - 带 TextChangedListener 的 RetroLambda

android - APK 大于 50 MB

android - 以编程方式更改前景图像

C# 数据绑定(bind)不更新 WPF

.net - 如何在 Windows Workflow 中的事件之间传递数据?

Android:在 Volley 请求中生成 Oauth1 签名