【问题标题】:Android Kotlin Calling ViewModel function from View with ParametersAndroid Kotlin 从带参数的视图中调用 ViewModel 函数
【发布时间】:2020-02-13 17:57:03
【问题描述】:

我正在构建一个 Android 应用程序。

我有一个包含按钮“保存按钮”的布局。当用户单击按钮时,onClick 应该调用我的 ViewModel 中的一个函数 onSave()。此函数需要 2 个参数:同样存在于同一布局中的 2 个 EditText 视图的文本内容。

基本上,用户已经编辑了名称和/或概要,现在希望 ViewModel 更新数据库中对象的数据。

(部分)我的 UI(.xml 片段布局):

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".ui.CreateEditRelationFragment">

<data>
    <variable
        name="createEditRelationViewModel"
        type="be.pjvandamme.farfiled.viewmodels.CreateEditRelationViewModel" />
</data>

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

    <Button
        android:id="@+id/saveButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/saveText"
        android:onClick="@{() -> createEditRelationViewModel.onSave(relationNameEditText.getEditText().getText().toString(), relationSynopsisEditText.getEditText().getText().toString())}" />

    <Button
        android:id="@+id/cancelButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="32dp"
        android:text="@string/cancelText"
        android:onClick="@{() -> createEditRelationViewModel.onCancel()}" />

    <EditText
        android:id="@+id/relationSynopsisEditText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:gravity="start|top"
        android:inputType="textMultiLine" />

    <EditText
        android:id="@+id/relationNameEditText"
        android:layout_width="@dimen/relationNameEditWidth"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="16dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="Name" />
</androidx.constraintlayout.widget.ConstraintLayout>

(部分)ViewModel:

class CreateEditRelationViewModel (
    private val relationKey: Long?,
    val database: RelationDao,
    application: Application
): AndroidViewModel(application){
private var viewModelJob = Job()

private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
private var relation = MutableLiveData<Relation?>()

private var _navigateToRelationDetail = MutableLiveData<Boolean>()
val navigateToRelationDetail: LiveData<Boolean>
    get() = _navigateToRelationDetail

fun onSave(name: String, synopsis: String){
    Timber.i("Got name: " + name + " and synopsis: " + synopsis)
    if(relationKey == null){
        uiScope.launch{
            relation.value = Relation(0, name, synopsis, false)
            insert(relation.value!!)
        }
    }
    else{
        uiScope.launch{
            relation.value?.name = name
            relation.value?.synopsis = synopsis
            update(relation.value)
        }
    }
    _navigateToRelationDetail.value = true
}

private suspend fun insert(newRelation: Relation){
    withContext(Dispatchers.IO){
        database.insert(newRelation)
    }
}

private suspend fun update(relation: Relation?){
    if(relation != null) {
        withContext(Dispatchers.IO) {
            database.update(relation)
        }
    }
}
}

我希望编译这个东西,以便调用 onSave() 函数并将 EditTexts 的内容作为参数传递。

我无法传递这些 EditText 的文本内容。编译器抛出此错误:

[databinding] {"msg":"cannot find method getEditText() in class android.widget.EditText","file":"D:\\ etc.

当我尝试直接使用 .text 属性访问时,它会做同样的事情。 有谁知道我做错了什么?我把头发扯掉了。

【问题讨论】:

    标签: android kotlin mvvm data-binding


    【解决方案1】:

    getEditText() 方法不存在,您可以将其删除。

    代替;

    relationNameEditText.getEditText().getText().toString()
    

    你可以的

    relationNameEditText.getText().toString()` 
    

    即 https://github.com/dgngulcan/droid-feed/blob/e0d0d5f4af07c5375d42b74e42c55b793319a937/app/src/main/res/layout/fragment_newsletter.xml#L120

    【讨论】:

    • 啊,是的,这总是很愚蠢。我过度依赖这个 (stackoverflow.com/questions/40995071/…) 答案,其中包含 getEditText() 调用。它现在似乎可以工作,尽管在确定之前我还有其他编译错误需要处理。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多