【问题标题】:DataBinding+ViewModel in Fragment Android KotlinFragment Android Kotlin 中的 DataBinding+ViewModel
【发布时间】:2020-11-18 02:48:03
【问题描述】:

我是 DataBinding 的新手。我想在 Fragment 中使用 ViewModel 和 DataBinding。当我在 Activity 中使用时,它可以工作,但不能在 Fragment 中工作。请帮助使用数据绑定获取编辑文本内容。先感谢您。 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>

BlankFragment.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_blank.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>

MainViewModel.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)
    }
}

【问题讨论】:

    标签: android kotlin data-binding fragment android-databinding


    【解决方案1】:

    您的ViewModelFragment 没有任何连接

    这样做:

    空白片段:

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

    【讨论】:

      猜你喜欢
      • 2018-07-29
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      相关资源
      最近更新 更多