簡體   English   中英

Android:使用數據綁定調用 ViewModel 函數

[英]Android: Call ViewModel function with Data Binding

我正在嘗試使用數據綁定為片段中的按鈕設置 onClick 偵聽器。

每次按下“下一步”按鈕時我需要調用的函數在視圖模型中。

我設法將數據從視圖模型綁定到我的布局 XML,但我仍然無法從視圖模型調用函數:/

嘗試調用 ViewModel 函數時出現此錯誤:

C:\Users\Michal\git\fitness-fatality\app\build\generated\source\kapt\debug\com\example\fitnessfatality\DataBinderMapperImpl.java:10: error: cannot find symbol
import com.example.fitnessfatality.databinding.FragmentWorkoutLoggingBindingImpl;
                                              ^
  symbol:   class FragmentWorkoutLoggingBindingImpl
  location: package com.example.fitnessfatality.databinding

我也試過像這樣調用視圖模型函數:

android:onClick="@{viewModel.incrementIndex()}"

但是,如果我綁定整個片段,我就可以調用它的函數。

這就是我嘗試使用視圖模型實現點擊綁定的方式:

<?xml version="1.0" encoding="utf-8"?>
<layout
        android:id="@+id/main_linear_container"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <import type="com.example.fitnessfatality.ui.workoutTracking.viewModels.TrackingViewModel"/>
        <import type="java.util.List"/>
        <import type="com.example.fitnessfatality.ui.workoutTracking.TrackingFragment" />
        <variable name="viewModel" type="TrackingViewModel" />
        <variable name="fragment" type="TrackingFragment" />
    </data>

    <LinearLayout
            android:orientation="vertical" android:layout_height="match_parent" android:layout_width="match_parent">

//More layouts


                <Button
                        android:text="Next"
                        android:onClick="@{viewModel.incrementIndex}"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" android:id="@+id/btn_next" android:layout_weight="1"/>
        </LinearLayout>
</layout>

在我的片段中,我有

 private lateinit var trackingViewModel: TrackingViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        trackingViewModel = ViewModelProviders.of(this).get(TrackingViewModel::class.java)
    }

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

        binding.lifecycleOwner = this
        binding.viewModel = trackingViewModel
        binding.fragment = this

        return binding.root
    }

還有我的視圖模型:

class TrackingViewModel(application: Application): BaseViewModel(application) {
    val workoutExercises: LiveData<List<WorkoutExercisePojo>>
    private val workoutExerciseRepository: WorkoutExerciseRepository

    val currentIndex: MutableLiveData<Int> = MutableLiveData()

    val index: LiveData<Int> = currentIndex

    init {
        val db = AppDatabase.getDatabase(application, scope)
        workoutExerciseRepository = WorkoutExerciseRepository(db.workoutExerciseDao())
        workoutExercises = workoutExerciseRepository.allWorkoutExercises
        currentIndex.value = 0
    }

    fun incrementIndex() {
        currentIndex.value = currentIndex.value!!.plus(1)
    }
}

使用自定義 BindingAdapter:

@BindingAdapter("onClick")
fun onClick(view: View, onClick: () -> Unit) {
    view.setOnClickListener {
        onClick()
    }
}

您應該能夠直接綁定一個視圖模型函數,例如

app:onClick="@{viewModel::forgotPasswordClicked}"

在你的 XML 中。 這將導致像這樣的視圖模型函數:

fun forgotPasswordClicked() {
    TODO("ForgotPasswordClicked")
}

這樣,您也不必將不必要的 Android 依賴項導入到您的視圖模型中。

設法解決了。 問題是 ViewModel 中的incremenetIndex函數不接受 View 作為參數。

所以現在,ViewModel 中的函數如下所示:

fun incrementIndex(view: View) {
    currentIndex.value = currentIndex.value!!.plus(1)
}

暫無
暫無

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

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