Не удается разрешить эталонный BR при привязке данных во время выполнения android - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь использовать привязку данных с MVVM в моем приложении android, но выдает ошибку: «Невозможно разрешить эталонный BR» во время выполнения, когда я вижу, что класс уже существует в проекте.

build.gradle :

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'


android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.abc.xxx"
        minSdkVersion 15
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}

dependencies {
    def lifecycle_version = "2.2.0"
    def arch_version = "2.1.0"

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.core:core-ktx:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}

ViewModel класс:

class SearchViewModel : BaseObservable() {

    private  var searchModel = SearchModel("")

    fun setSearchText(text: String){
        searchModel.text = text
//        notifyPropertyChanged(B)
        notifyPropertyChanged(BR._all)
    }

    @Bindable
    fun getSearchText(): String{
        return searchModel.text
    }

    fun onSearchClicked(){
        if(searchModel.text.isNullOrEmpty())
           setSearchText("Error!!!")
    }

}

Активность класс:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val bind : ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        bind.viewModel = SearchViewModel()
        bind.executePendingBindings()
    }


}

xml:

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

    <data>

        <variable
            name="viewModel"
            type="com.abc.xxx.viewmodels.SearchViewModel" />
    </data>

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

        <EditText
            android:id="@+id/inImageSearch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="@string/search_hint"
            android:maxLines="1"
            android:text="@={viewModel.userText}" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{()-> viewModel.onSearchClicked()}"
            android:text="@string/search"
            />

    </LinearLayout>
</layout>

Так, какие изменения я должен сделать, чтобы это заработало? Я уже пробовал много SO потоков, но ни один из них не работает. Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 19 марта 2020

Похоже, вы привязываетесь к свойству, которое не выходит. В вашем xml есть текст пользователя, которого не существует. Также вы привязываетесь к модели viewModel, поэтому вам нужно убедиться, что ваш SearchModel также реализует BaseObservable.

Затем убедитесь, что он не является частным в вашей viewModel или что вы пишете соответствующие методы получения для его извлечения. Имена get и set ДОЛЖНЫ соответствовать имени свойства, помеченному как bindable.

Также просто комментарий архитектуры. Я не уверен, почему вы бы создали searchViewModel и searchModel. Кажется, что это излишне, но, возможно, у вас есть причины.

Пример МОДЕЛИ ПОИСКА ниже

class SearchModel : BaseObservable() {

   @Bindable
   private var searchText = ""

   fun setSearchText(text: String){
       searchModel.text = text
       notifyPropertyChanged(BR.searchText)
   }

   fun getSearchText(): String{
       return searchModel.text
   }

}

Тогда ваш XML должен быть правильно привязан к свойству моделей

 <EditText
        android:id="@+id/inImageSearch"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="@string/search_hint"
        android:maxLines="1"
        android:text="@={viewModel.searchModel.searchText}" />
...