Android Kotlin Вызов функции ViewModel из View с параметрами - PullRequest
0 голосов
/ 17 октября 2019

Я создаю приложение для Android.

У меня есть макет, содержащий кнопку «Сохранить». Когда пользователь нажимает кнопку, onClick должен вызвать функцию в моей ViewModel, onSave (). Эта функция требует 2 параметра: текстовое содержимое 2 представлений EditText, которые также присутствуют в том же макете.

По сути, пользователь отредактировал имя и / или краткий обзор и теперь хочет, чтобы ViewModel обновилДанные объекта в базе данных.

(Часть) моего пользовательского интерфейса (макет фрагмента .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 передавалось как параметры.

Мне не удается передать текстовое содержимое этих EditTexts. Компилятор выдает эту ошибку:

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

Он делает то же самое, когда я пытаюсь получить доступ, используя свойство .text напрямую. Кто-нибудь знает, что я делаю не так? Я вырываю волосы.

1 Ответ

1 голос
/ 17 октября 2019

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

...