Класс привязки данных не создан в последней версии 3.6

9

Сегодня я обновил свою андроид студию 3.5.3 до 3.6. Теперь я не могу создать какой-либо класс привязки данных. Студия Android это сам генерирующий файл data-binding-iml.

Кто-нибудь сталкивался с такой проблемой?

Gradle wrapper.properties:

distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

Файл Gradle уровня проекта:

dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
}

Файл Gradle уровня приложения:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'androidx.navigation.safeargs'
android {
 dataBinding {
        enabled = true
    }
    // Using Lambda Expressions
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

gradle.properties:

kotlin.code.style=official
android.databinding.enableV2=true
kotlin.incremental=true
kapt.incremental.apt=true

Ниже моя активность и файлы XML: Активность:

class ActivityMain : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        var binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
    }
}

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">

    <data>
        <import type="android.view.View" />
     <!--   <variable
            name="loading"
            type="Boolean" />-->
        <variable
            name="bottomMenu"
            type="Boolean" />
        <variable
            name="clickListener"
            type="com.ecom.side_menu.SideMenuClickHandler" />
    </data>
    <androidx.drawerlayout.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:fitsSystemWindows="false"
        android:layout_height="match_parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <include
                android:id="@+id/layToolbar"
                layout="@layout/layout_toolbar"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <androidx.fragment.app.FragmentContainerView
                android:id="@+id/splash_host"
                android:name="androidx.navigation.fragment.NavHostFragment"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:background="@android:color/white"
                app:defaultNavHost="true"
                app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/layToolbar"
                app:navGraph="@navigation/splash_graph" />

            <com.google.android.material.bottomnavigation.BottomNavigationView
                android:id="@+id/bottomNavigationView"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="0dp"
                android:layout_marginEnd="0dp"
                android:background="@color/colorPrimary"
                android:visibility="@{safeUnbox(bottomMenu) ? View.VISIBLE : View.GONE}"
                app:itemBackground="@color/colorPrimary"
                app:itemIconTint="@android:color/white"
                app:itemTextColor="@android:color/white"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:menu="@menu/menu_navigation_dashboard" />


         <!--   <include
                android:id="@+id/progressLayoutId"
                layout="@layout/layout_progress"
                android:visibility="@{safeUnbox(loading) ? View.VISIBLE : View.GONE}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent" />-->

        </androidx.constraintlayout.widget.ConstraintLayout>

        <com.google.android.material.navigation.NavigationView
            android:id="@+id/navigationView"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="@android:color/white"
            android:fitsSystemWindows="true"
            android:visibility="visible">
            <include
                android:id="@+id/customDrawerList"
                app:clickListener="@{clickListener}"
                layout="@layout/drawer_list" />
        </com.google.android.material.navigation.NavigationView>

    </androidx.drawerlayout.widget.DrawerLayout>

</layout>

Официальное решение:

Google решил эту проблему. После обновления с новым патчем Android Studio 3.6.2, я могу создать класс привязки данных с набором из нескольких источников

Мехта
источник
Я также сегодня обновляю студию && также использую классы привязки данных ... это хорошо работает, братан
Приятно Уманг
просто аннулируйте кэши и перезапустите вашу студию;)
Ницца Уманг
@Niceumang Я попытался сделать недействительными кэши и перезапустить их, а также попытался удалить папку сборки тоже. Но все равно та же ошибка
Mehta
покажете ли вы свой XML и класс, где вы создаете класс связывания?
Хороший Уманг
@Niceumang класс и XML добавлены в вопрос
Мехта

Ответы:

6

Это случилось и со мной. Связующие классы фактически генерируются. Проект строит нормально. Только Android Studio 3.6.1 (или базовая система сборки Gradle, мне все равно) глючит и не может видеть эти классы.

В качестве промежуточного решения я просто взломал исходные наборы (обратите внимание, что варианты сборки в приведенном ниже фрагменте относятся к моему проекту, вам нужно переписать его).

android {
    ...
    sourceSets {
        demoDebug {
            java.srcDirs += 'build/generated/data_binding_base_class_source_out/demoDebug/out'
        }
        fullDebug {
            java.srcDirs += 'build/generated/data_binding_base_class_source_out/fullDebug/out'
        }
        espressoDebug {
            java.srcDirs += 'build/generated/data_binding_base_class_source_out/espressoDebug/out'
        }
        demoRelease {
            java.srcDirs += 'build/generated/data_binding_base_class_source_out/demoRelease/out'
        }
        fullRelease {
            java.srcDirs += 'build/generated/data_binding_base_class_source_out/fullRelease/out'
        }
        espressoRelease {
            java.srcDirs += 'build/generated/data_binding_base_class_source_out/espressoRelease/out'
        }
    }
    ...
}

Как указал Стив выше: в то же время мы должны терпеливо ждать, пока Google исправит это ...

РЕДАКТИРОВАТЬ

Я только что понял, что это НАМНОГО больше глючит, чем я ожидал, макеты тоже сломаны:

Пожалуйста, уважаемый Google: не выпускайте нам нестабильные промежуточные версии "

Я надеюсь, что Google скоро исправит этот беспорядок ...

РЕДАКТИРОВАТЬ 2

Я снова понял, что Android Studio 3.6 еще более глючит, чем описано выше.

Выполнение существующих тестов эспрессо тоже нарушено.

Я настоятельно не рекомендую всем переходить на Android Studio 3.6.

В то же время мы, вероятно, вернемся к Android Studio 3.5.

Йиржи Кршиванек
источник
спасибо .. Этот хак работает нормально .. Теперь я могу создать класс Binding.
Мехта
Да, надеюсь, Google исправит эту ошибку в ближайшее время
Мехта
1
но переменная привязки не доступна должным образом в XML
Мехта
К сожалению, как уже упоминалось в моем EDIT выше :(
Jiří Křivánek
4

Просто обновите свою версию Gradle до последней версии. Перейти к:

Файл> Структура проекта> Версия Gradle

И выберите последнюю стабильную версию (в настоящее время 6.3). Проверьте также версию Android Gradle Plugin, если она также указывает на последнюю версию.

Руи
источник
Спасибо, это поможет в моем случае! +1
Тано
3

Для AndroidStudio 3.6.1 вы можете добавить приведенный ниже код на уровень приложения build.gradle (: app) . Моя проблема решена добавлением этой строки, надеюсь, что вы тоже.

sourceSets {
     main {
          java.srcDirs += 'build/generated/data_binding_base_class_source_out/debug/out'
        }
    }
Джек Франки
источник
как предложил Йиржи Кршиванек и вы, я добавил упомянутое решение, но теперь все переменные отображаются с красным подчеркиванием .. нет доступа
Mehta
3

Я использую Android Studio 3.6.1 проблема решена после добавления viewBinding.enabled = trueв android{в build.gradle:

android {

...
    dataBinding {
        enabled = true
    }
    viewBinding.enabled = true
mhKarami
источник
это сработало,
спасибо тебе
Оно работает!! мне не хватало dataBinding {enabled = true}
Биллиджокер
2

Похоже, что в последней библиотеке привязки данных Android есть ошибка. Очистка проекта не сработала. Восстановление проекта не сработало. Аннулирование кэшей и перезапуск не сработали.

ЕДИНСТВЕННОЕ решение, которое работало для меня, - откат версии привязки данных от версии 2 (которая является новой версией по умолчанию в Android Studio 3.6.1 и выше) до версии 1. Чтобы сделать это, вам не нужно откатывать ВСЕ Студия Android. Вместо этого вы можете добавить следующую строку gradle.properties:

android.databinding.enableV2=false

TLDR; Мне интересно, решил ли Google полностью обновить способ связывания данных с их последним компилятором привязки данных. Не было бы удивительно, если бы команда работала над предоставлением YAS (еще один синтаксис). В конце концов, DataBindingUtil.inflate<MyClassBindingImpl>это должен быть один из самых причудливых шаблонов использования во всем компьютерном программировании, требующий, чтобы компилятор автоматически генерировал конкретную реализацию универсального класса привязки данных ДО того, как вы сможете ссылаться на автоматически сгенерированный класс в своем коде. Кстати, именно поэтому такие инструменты Make Projectсуществуют. Я ожидаю, что в скором времени будет полностью пересмотрен синтаксис привязки данных.

rmirabelle
источник
0

Попробуйте пересобрать проект и посмотреть, доступна ли папка привязки данных в сгенерированных файлах

Пракаш Редди
источник
0

Также случилось со мной. Это связано с тем, что в AS 3.6.0 мы не можем получить доступ к привязке из другого модуля, если используем тег включения с android: id . Я думаю, что эта ошибка из IDE, потому что я могу успешно запустить проект. Единственное, что нужно сделать, это дождаться исправления или просто проигнорировать ошибку.

Стив
источник
0

Это случилось со мной тоже. Я только что обновил версию Graddle до версии 3.6.0 в файле build.graddle проекта, и теперь он снова работает.

oitantksi
источник
0

у меня была эта проблема, потому что у меня были отдельные макеты в несколько каталогов и определить их в Gradle, как показано ниже

sourceSets {
    main {
        res.srcDirs =
                [
                        'src/main/res', 'src/main/drawable/button_icons', 'src/main/res/drawable/button_icons',

                        'src/main/res', 'src/main/layouts/user', 'src/main/res/layouts/user',
                        'src/main/res/layouts', 'src/main/layouts/user', 'src/main/res/layouts/user/register',
                        'src/main/res/layouts', 'src/main/layouts/user', 'src/main/res/layouts/user/login',
                        'src/main/res/layouts', 'src/main/layouts/user', 'src/main/res/layouts/user/profile',
                        'src/main/res/layouts', 'src/main/layouts/user', 'src/main/res/layouts/user/wallet',

                        'src/main/res/layouts/splash_layouts', 'src/main/res/layouts', 'src/main/res',

                        'src/main/res/layouts/main_layouts', 'src/main/res/layouts', 'src/main/res',
                        'src/main/res/layouts/main_layouts/sellers', 'src/main/res/layouts/main_layouts', 'src/main/res/layouts',

                        'src/main/res/layouts/dashboard_layouts', 'src/main/res/layouts', 'src/main/res',

                        'src/main/res/layouts/basket_layouts', 'src/main/res/layouts', 'src/main/res',
                        'src/main/res/layouts/factor_layouts', 'src/main/res/layouts', 'src/main/res',

                        'src/main/res/layouts/setting_layouts', 'src/main/res/layouts', 'src/main/res',
                ]
    }

}

Поэтому я поместил все макеты в основной каталог макетов и удалил другие каталоги суб макетов.

Марьян Даводинежад
источник
0

Это, кажется, исправлено в Android studio 3.6.3. Хотя

viewBinding.enabled = true

работал на меня, а не

viewBinding {
    enabled = true
}
S.Javed
источник