Адаптер привязки Android не найден

Пожалуйста, помогите мне! Я схожу с ума, это должно сработать. У меня появляется следующее сообщение об ошибке, когда я пытаюсь создать свой проект Android:

Android resource linking failed
/Users/slehrbaum/StudioProjects/OneNightComps/Android/app/build/intermediates/incremental/mergeDebugResources/stripped.dir/layout/fragment_login.xml:17: error: attribute errorText (aka lehrbaum.de.onenightcomps:errorText) not found.
error: failed linking file resources.

в сообщении об ошибке упоминается атрибут errorText. Я использую атрибут errorText в xml следующим образом (полный xml здесь):

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/usernameField"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/username"
        app:hintEnabled="true"
        app:errorEnabled="true"
        app:errorText="Hi"
        >
        <!--app:errorText="Please provide a username."-->
        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:autofillHints="username"
            android:inputType="text"
            android:text="@={viewModel.username}"
            />
    </com.google.android.material.textfield.TextInputLayout>

Именно так я определил errorText в своем файле Kotlin (полный файл здесь):

object ViewDataBindingExtensions {
    @JvmStatic
    @BindingAdapter("errorText")
    fun bindErrorText(textInputLayout: TextInputLayout, errorText: String) {
        textInputLayout.error = errorText
    }
}

Я просто не понимаю, почему это происходит. Есть ли какой-то импорт, который я могу поместить в файл макета, говорящий, где находится BindingAdapter? У меня что-то не так с моими файлами Gradle? Я сравнил его с проектом GitHub в этом вопросе, который, по-видимому, был решен, и я не увидеть разницу с моим проектом. Согласно ответу, я должен добавить плагин Kotlin-kapt в свою сборку Gradle, что я и сделал. Я также просмотрел остальные части проекта и сравнил. Но безрезультатно. Вы можете найти весь мой файл build.gradle здесь Как и весь остальной проект.

Помогите мне, пожалуйста!


person findusl    schedule 25.02.2019    source источник
comment
Вы пытались добавить kapt "com.android.databinding:compiler:$gradleVersion"?   -  person Anton Holovin    schedule 26.02.2019
comment
@AntonHolovin Я попробовал сейчас, но это не помогло. Я предполагаю, что мне нужно добавить его в build.gradle проекта приложения? И версия должна быть такой же, как у «com.android.tools.build:gradle:», верно? Это не сработало для меня. Но, возможно, я сделал что-то не так. Я отправил его на GitHub, вы можете найти его по ссылке github.com/findusl/OneNightComps/blob/feature/register/Android/   -  person findusl    schedule 26.02.2019
comment
Я потратил полчаса, пытаясь понять это, только чтобы понять, что мне не хватает закрывающей скобки. android:text="@={viewModel.username" вместо android:text="@={viewModel.username}"   -  person Rachit    schedule 26.05.2021


Ответы (2)


Проблема связана с тем, как вы передаете значение String в app:errorText.

Используйте @{``} для передачи этого значения.

Исправлена ​​часть фрагмента_login.xml:

<com.google.android.material.textfield.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/username"
    app:hintEnabled="true"
    app:errorText="@{`Please provide a username.`}"
    app:errorEnabled="@{!viewModel.usernameValid}">

Наличие apply plugin: 'kotlin-kapt' в app/build.gradle обязательно.

person Anton Holovin    schedule 26.02.2019
comment
Вы сумасшедший. Большое спасибо за идею, что строковый литерал является проблемой. Я не понимаю, почему я не могу передать строковый литерал, но мне все равно, поскольку строковые литералы все равно не годятся. Я просто держал его там, потому что думал, что его будет легче протестировать. Когда я сослался на переменную модели представления, она, наконец, скомпилировалась и заработала. Я отмечу ваш ответ как правильный, вы можете обновить его для других, ваше точное решение дает ошибку data binding error ****msg:Syntax error: no viable alternative at input '<EOF>' - person findusl; 26.02.2019

Попробуйте использовать

fun bindErrorText(textInputEditText: TextInputEditText, errorText: String) {
 textInputEditText.error = errorText }
person Vahalaru    schedule 26.02.2019
comment
К сожалению, это не решает проблему. Сообщение об ошибке теперь находится в другой строке, потому что TextInputEditText находится в другой строке, но в остальном то же самое. - person findusl; 26.02.2019