web-dev-qa-db-ja.com

editText値をviewModelとLivedataに渡す方法(Kotlin)

私はAndroid + Kotlinを研究しており、LiveData + ViewModelを理解するための簡単な例を作成しています。非常に簡単です。1つのルートアクティビティと2つのフラグメントがあります。FragmentOneには2つのEditTextがあります。その値は合計され、結果をViewModelに渡す必要があります。次に、ルートアクティビティとFragmentTwoの両方でobserveを使用して、変更されたデータを確認します。

FragmentOne

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

viewModel

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

オブザーバーFragmentTwo

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

私はチェックした var resultSum(ログ)および合計からのInt値を保持します。オブザーバーも機能しています(インスタンス化した場合result.value ViewModel内では、値はアクティビティとフラグメントで観察可能です)

私はどんな助けにも感謝します。

5
iperion300

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)
})
3
karthik prasad