簡體   English   中英

如何將 editText 值傳遞給 viewModel 和 Livedata (Kotlin)

[英]How to pass editText value to viewModel and Livedata (Kotlin)

我正在學習 Android + Kotlin 並通過一個簡單的例子來理解 LiveData + ViewModel。 這很簡單:我有一個根活動和兩個片段。 FragmentOne 有兩個 EditText。 這些值被求和,我需要將結果傳遞給 ViewModel。 然后我在根活動和 FragmentTwo 中使用觀察來查看更改的數據。

片段一

class FragmentOne: Fragment() {
   private val model by lazy { ViewModelProviders.of(activity).get(MyViewModel::class.java) }
   var resultSum:Int = 0

   override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
     val view = inflater?.inflate(R.layout.fragment_one,container,false)
     val btn = view?.findViewById<Button>(R.id.sendToModel)
     btn?.setOnClickListener({
         val field1 = n1.text.toString().toInt()
         val field2 = n2.text.toString().toInt()
         resultSum = field1 + field2
         model.update()
     })
     return view
  }
}

視圖模型

class MyViewModel: ViewModel() {
   private val fragment by lazy {FragmentOne()}
   private var _result = MutableLiveData<Int>().apply { value = 0 }
   val result: LiveData<Int>
      get() = _result

   fun update(){
       _result.value = fragment.resultSum
   }
}

觀察根活動

private val resultModel by lazy {ViewModelProviders.of(this).get(MyViewModel::class.java)}
resultModel.result.observe(this, Observer { result -> resultTxt.text = result.toString()})

觀察者片段二

private val resultModel by lazy {ViewModelProviders.of(activity).get(MyViewModel::class.java)}
resultModel.result.observe(this, Observer { result -> resultTxt.text = result.toString()})

我檢查了var resultSum (Log) 並保存了總和中的 Int 值。 觀察者也在工作(如果我在 ViewModel 中實例化result.value ,則活動和片段可以觀察到該值)

我很感激任何幫助。

ViewModel 不應引用 Android.* 庫。 所以你引用 FragmentOne 是一種不好的做法。

更簡潔的方法是更改update()函數以接受字符串 -

 fun update(result: String){
        _result.value = result
    }

並更改您的 FragmentOne 代碼說-

btn?.setOnClickListener({
    val field1 = n1.text.toString().toInt()
    val field2 = n2.text.toString().toInt()
    resultSum = field1 + field2
    model.update(resultSum)
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM