Używam powiązania danych w moim projekcie, gdy używam <layout>
iw <data>
mojej klasie powiązań XML nie jest generowana.
Na przykład mam activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data> </data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
</RelativeLayout>
</layout>
Teraz, jeśli piszę ActivityMainBinding
w mojej aktywności / fragmencie, pokazuje błąd, że klasa nie jest dostępna. Ale po <variable>
dołączeniu do mojego pliku xml jest w stanie wygenerować ActivityMainBinding
klasę.
Android Studio: 2.1.3
Classpath: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0
dataBinding.enabled
w twoim build.gradle?ActivityMainBinding
, lub musi to zrobić z tym błędem.<variable>
w xml<variable>
, generuje wiążącą klasę bez budowania projektu.Odpowiedzi:
Nie otrzymałem zadowalających odpowiedzi. Oto wskazówki, które są podsumowaniem mojej wiedzy na temat wiązania danych.
Wskazówki dotyczące rozwiązywania problemów z wiązaniem danych
Aktualizacja
Aby uzyskać dokładniejsze błędy i sugestie , zdecydowanie zalecamy aktualizację wersji wtyczki Android Studio i Gradle do najnowszej. Ponieważ po wersji AS 3.2 nie mam wielu problemów.
Zobacz najnowsze Android Studio i najnowszą wtyczkę Gradle .
Oryginalne rozwiązanie
Sprawdź te punkty jeden po drugim. Każdy z nich może sprawić, że Twoja praca będzie wykonana. Ostatni punkt jest naprawdę ważny, więc nie przegap ich.
1. Sprawdź, czy włączono wiązanie danych
Powinieneś mieć włączone powiązanie danych w programie
build.gradle
. Jeśli nie, dodaj to i Synchronizuj .android { ... dataBinding { enabled = true } ... }
2. Układ sprawdzenia jest konwertowany na układ oprawy
Teraz, jeśli chcesz, aby klasa powiązania danych została wygenerowana, powinieneś opakować
xml layout
wiązaniem danych (<layout
tag). Coś takiego.<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.constraint.ConstraintLayout> </layout>
Wraz z tym sprawdź, czy nazwy zmiennych wiążących są poprawne, jak w klasie modelu widoku
3. Automatycznie wygenerowana nazwa klasy powiązania?
Klasa powiązania danych powinna zostać wygenerowana po utworzeniu układu powiązania.
4. Nie widzisz sugestii importu?
Czasami podczas pisania
ActivityMai...
, to nie pokazuje sugestię , w tym przypadku importu ręcznie .import <yourpackage>databinding.ActivityMainBinding;
5. Przeczytaj dziennik błędów kompilacji
Twoja klasa wiążąca i nowe zmienne w układzie nie zostaną wygenerowane, jeśli kompilacja się nie powiedzie. Więc najpierw Stwórz projekt przez Ctrl + F9 (Kompiluj> Utwórz projekt) .
6. Zamknij i otwórz projekt z ostatnich
Zawsze to robię, ponieważ zajmuje to znacznie mniej czasu niż
Rebuild
/Make
project.Zauważ, że wolę Zamknij i Otwórz od ostatniego, ponieważ zajmuje to znacznie mniej czasu niż Rebuild / Restart IDE .
7. Przebuduj projekt
Jeśli nadal Twoja klasa nie jest generowana. (Jakiś czas, kiedy wklejamy plik układu, to się dzieje). Następnie Przebuduj projekt z
Build> Rebuild
( nie buduj ani nie twórz projektu ). Wygeneruje klasę powiązania danych. ( Rebuild robi dla mnie Magic. )8. Miej najnowszą wersję Android Studio
Po aktualizacji AS do Android Studio 3.2 zauważyłem , że naprawiono wiele błędów w automatycznym generowaniu powiązań danych. Więc powinieneś mieć również najnowszy AS.
Rozwiązanie dla
<variables
<data> <variable name="item" type="com.package.Model"/> </data>
Zwykle, gdy umieszczamy zmienną w układzie, tworzy ona metodę pobierającą i ustawiającą. Możemy użyć
binding.setItem(item);
ibinding.getItem();
, ale jeśli nie widzisz tych metod, przeczytaj poniższe informacje.1. Zamknij i otwórz projekt z ostatnich
Jeśli utworzyłeś zmienną danych -
<variable
w swoim układzie i nie pokazuje ona jej ustawiającego i pobierającego w klasie powiązania danych, wtedy Zamknij i Otwórz z ostatniego projektu.2. Wyczyść projekt po zmianie typu
Jeśli zmieniłeś typ jakiegoś
<variable
w swoim układzie i typ ustawiacza metody pobierania się nie zmienia, to Wyczyść projekt (Build> Clean Project
)Ostatnie słowa
Wreszcie, jeśli nadal nie jest generowana klasa wiążąca, mamy naszą najpotężniejszą broń. - Uruchom ponownie Android Studio: D.
To wszystko, co robię, aby rozwiązać błędy związane z wiązaniem danych. Jeśli pojawią się dalsze problemy, możesz skomentować tutaj.
źródło
Klasa DataBinding wygenerowana automatycznie.
jeśli nazwa xml to activity_test, wówczas klasą Binding będzie ActivityTestBinding.
ale,
dataBinding { enabled = true }
układ powinien mieć układ główny
<layout xmlns:android="http://schemas.android.com/apk/res/android"> </layout>
źródło
ConstraintLayout
jako korzenia. Dziękuję Ci!Miałem ten sam problem. Po przeczytaniu dokumentacji SDK systemu Android można utworzyć tylko oczekiwaną nazwę pliku, ale nie ma nic o tym, co zrobić, jeśli tak się nie stanie. Po kilku dalszych badaniach zauważyłem, że po usunięciu przestrzeni nazw do elementu układu, jak poniżej (na twoim przykładzie), zadziałało.
<?xml version="1.0" encoding="utf-8"?> <layout> <data> </data> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> </RelativeLayout> </layout>
źródło
W moim przypadku klasa Binding została wygenerowana i zainstalowana (ale myślałem, że tak nie jest) ... ale nie dodaje automatycznie importu tej klasy do sekcji importu aktywności / fragmentów ... więc ... OPCJA + WCHODZIĆ :)
źródło
Po prawidłowym skonfigurowaniu go (w tym przestrzeni nazw xml i zawinięciu wszystkiego w
<layout>
), tym, który działał dla mnie, było budowanie -> Utwórz projekt. Ani Clean Project ani Rebuild Project nie. Pracuję w Android Studio 2.3.1 i używam narzędzi do kompilacji 26.0.2. Nie ma potrzeby stosowania<data>
tagów.źródło
jeśli wykonujesz zadanie podstawowe, aby włączyć databainding w swoim projekcie, np. użyj opcji enable w gradle i użyj znacznika układu w xml , kiedy zmienisz kod xml i nie wygenerujesz nowej klasy wiązania danych dla tych xml, możesz użyć szybkiego sposobu generowania samych danych bindowanie klasy w gradle-> inne-> databindinggenbaseclassesDebuguj go szybciej niż buduj cały projekt. generuje tylko klasę wiązania danych.
źródło
dataBinding { enabled = true }
Aby włączyć nowy kompilator powiązań danych, dodaj następującą opcję do pliku gradle.properties:
android.databinding.enableV2=true
źródło
Klasy powiązań danych są generowane podczas kompilacji, więc po włączeniu powiązania danych w kompilacji Gradle aplikacji i otoczeniu pliku XML tagiem układu należy ponownie skompilować aplikację. Jeśli to nie pomoże, usuń folder kompilacji i zrób to ponownie.
źródło
Nie wiem, czy to zadziała, czy nie. Po prostu zmień nazwę pliku XML układu. Przypuśćmy, że nazwa układu to activity_main.xml, po prostu zmień nazwę na dowolną, taką jak main.xml i ponownie zmień nazwę na activity_main.xml . Następnie możesz zobaczyć opcję importu w ActivityMainBinding .
Mam nadzieję, że to działa dla Ciebie.
źródło
Dzięki tej odpowiedzi tutaj - wygląda na to, że „przestrzeń nazw układu” musi zostać wyczyszczona lub potrzebujesz nowej unikalnej nazwy.
Oto opcje, które zadziałały dla mnie:
Utwórz nową nazwę układu, aby upewnić się, że można go wygenerować. To rozwiązało mój problem, w którym miałem układ, który został utworzony jako pierwszy, bez wiązania danych - nazwijmy to
fragment_abc.xml
. Kiedy próbowałem dodać do niego powiązanie danych, nie zostało ono rozpoznane - nawet po wielu czyszczeniach pamięci podręcznej i ponownym uruchomieniu. Jednak gdy tylko wykonałem kopię układufragment_abc2.xml
, natychmiast otrzymałem wygenerowany obiekt wiążący dane .java / .class.Po obejrzeniu powyższej pracy próbowałem po prostu usunąć folder / build z modułu i przebudować projekt - to działało, aby uzyskać powiązanie danych dla oryginalnego układu.
źródło
Jedyną rzeczą, jaką mogę sobie wyobrazić, jeśli to możliwe, jest to, że nie masz
dataBinding { enabled true }
w pliku ocen. Jeśli nie, po prostu dodaj go do pliku gradle. to znaczy
android { ...... dataBinding { enabled true } }
następnie zsynchronizuj swój projekt. Jeśli nadal się nie powiedzie, może być konieczne unieważnienie / ponowne uruchomienie studia Android
źródło
<variable>
w xml generuje klasę Binding, więc nie ma przypadku nie dodawaniadataBinding
w pliku gradle, jeśli nie dodałem, to nie powinno generować klasy powiązania.Podczas pracy z wielomodułową aplikacją na Androida sprawdź ścieżkę klasy powiązań. Może powinieneś użyć:
import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding
zamiast:import com.yourcompany.app.android.databinding.FragmentABCtBinding
źródło
Usuń układy i cofnij, a następnie upewnij się, że wygenerowane klasy powiązań zostały poprawnie zaimportowane.
źródło
Moim rozwiązaniem było przyjęcie jako przyrostka FragmentBinding w nazwie klasy.
Nazewnictwo nazwy aktywności lub klasy fragmentów może różnić się pod względem przedrostków. Ponieważ przyrostek jest zawsze Binding.
Po wykonaniu odpowiedzi Khemraj i Invalidate Caches / Restart , należy przepisać ActivityBinding lub FragmentBinding, aby uzyskać sugestie IDE klas, które zostały już wygenerowane, i NIE Koduj na stałe importu.
W moim przypadku próbowałem zaimportować nazwę klasy do tyłu be
FragmentCompetitionsBinding
zamiastCompetitionsFragmentBinding
.GL
Źródło
źródło
Jeśli odpowiedź nie zadziałała, to moja rekomendacja jest prosta, ale skuteczna.
Chodzi o to, aby określić, który komponent powoduje problem. Aby to zrobić, skomentuj wszystkie swoje linie
custom_fragment.xml
i ich zastosowania wCustomFragment.kt
i zostaw coś minimalistycznego, takiego jak poniżej.<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"> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/test" android:layout_width="match_parent" android:layout_height="match_parent"/> </layout>
Następnie uruchom aplikację i dodaj komponent do komponentu podczas
Apply Code Changes
(Ctrl + Alt + F10) do wykonywania aplikacji, aż aplikacja ulegnie awarii, czyli wtedy, gdy znajdziesz usterkę.Dzienniki powiązań danych czasami nie są tak opisowe i jest to ogólna strategia znajdowania wadliwego składnika.
GL
źródło
Miałem ten sam problem. Wszystko, co zrobiłeś poprawnie. Chodzi o to, że musisz dodać zmienną wewnątrz znacznika danych w xml. W tym celu należy utworzyć przykładową klasę modelu i dodać ją jako zmienną w znaczniku danych.
Do tego czasu nie zobaczysz wygenerowanego ActivityMainBinding.
źródło
Miałem podobny problem, w którym miałem opakowany układ i włączone wiązanie danych w pliku gradle. Główna działalność nadal nie mogła zrozumieć ani zobaczyć moich zajęć. Naprawiło to, że dodałem zmienną powiązania i mimo to zaimportowałem powiązanie. Stamtąd właśnie zbudowałem rozwiązanie, a potem wydawało się, że wiem, jaka jest klasa. Stamtąd mogłem zaimportować wygenerowane przeze mnie klasy skrzynek wielbłądów.
źródło
Pojawił się problem i problem dotyczył układu, którego użyto pola nie było ciągiem, lecz datą.
Wygląda na to, że wszystkie pola muszą być tekstowe, przynajmniej z komponentem TexView.
Jeśli budujesz za pomocą polecenia ./gradlew build --stacktrace
To lepiej pokazuje błędy.
źródło
W moim przypadku pomyślałem, że wygenerowana klasa musi pojawić się z moimi zwykłymi klasami w
src
folderze. Dodatkowo pomyślałem, że nazwa generowanej klasy powinna być nieco inna. To wszystko był mój błąd. Wygenerowaną klasę można znaleźć wbuild
folderzebuild -> generated -> ...
ścieżka. Jeśli w Twoim działaniu nie ma importu wygenerowanej klasy, dodaj importimport com.yourcompany.app.databinding.ActivityMainBinding;"
źródło
W przypadku wystąpienia następującego błędu w DataBindingUtil.setContentView
wszystko, co musisz zrobić, to usunąć następującą instrukcję importu
Rozwiązanie znalazłem na innym forum. Źródło
źródło
Jeśli ostatnio któryś z nich przeprowadził migrację istniejącego projektu do androidx , musisz zastąpić import z
import com.yourpackagename.BR;
do
import androidx.databinding.library.baseAdapters.BR;
Po 2 dniach Google w końcu dostałem rozwiązanie, które działa dla mnie.
źródło
your.project.package.BR
). Nie w bibliotece innej firmy, takiej jakandroidx.databinding.library.baseAdapters.BR
.Istnieją przypadki, gdy nie zobaczysz pliku w wygenerowanym katalogu, możesz wiązać właściwość, która nie jest zadeklarowana w ViewModel. Zasadniczo nie powoduje to błędu lint, jeśli zrobisz to w xml.
źródło
Jeśli implementujesz Serializable -> musisz zaimplementować Serializable
inaczej otrzymasz ten błąd. Mam nadzieję, że pomoże to komuś w przyszłości
W moim przypadku korzystam z biblioteki Parcel. Brakowało mi adnotacji @Parcel w mojej podklasie
źródło
Oprócz powyższych kroków możesz również sprawdzić typ zmiennej. Upewnij się, że jest to ciąg dla TextView lub taki sam, jak zdefiniowano w
BindingAdapter
. Na przykład:data class MyDataObject(val name: String, val age: Int)
iw XML:
android:text="@{dataobject.age}"
Spowoduje to powyższy błąd. Aby to naprawić, możesz utworzyć zmienną wieku typu String lub możesz zaimportować String do swojego XML i użyć
String.valueOf(age)
w następujący sposób:<data> <import type="String" /> ... </data>
A w Twoim TextView:
android:text="@{String.valueOf(dataobject.age)}"
źródło
W moim przypadku klasy powiązań danych nie zostały wygenerowane, ponieważ usunąłem katalog zasobów systemu Android mipmap. Ponownie utworzyłem katalog res / mipmap /, a klasy powiązań danych zostały przywrócone.
źródło
Napotkałem podobny problem, w którym DataBinding nie mógł wygenerować klasy BindingImpl . W moim przypadku był to problem z metodą w klasie danych, gdzie nazwa została użyta nieprawidłowo: Model zawierał metodę onSignInCliked () iw układzie, którego użyłem onSigninCliked () . Zauważyć signin vs signin .
Komunikat o błędzie nie był wystarczający i odkryłem problem tylko wtedy, gdy użyłem skryptu kompilacji z opcją śledzenia stosu.
źródło
Upewnij się, że powiązanie danych jest włączone
dan kliknij przycisk (Synchronizuj projekt z Gradle)
źródło
Jeśli istnieje problem z plikiem XML, klasa Databinding nie zostanie wygenerowana. Szybkim rozwiązaniem byłoby przejrzenie pliku XML i sprawdzenie błędów składniowych (które zwykle są podświetlone na czerwono). Błędy mogą przybrać formę nieistniejących lub błędnych odniesień, błędów typograficznych itp.
Krótko mówiąc, upewnij się, że w kodzie XML nie ma podkreślonej na czerwono linii. Kiedy skończysz, odbuduj i Twoja klasa Databinding zostałaby wygenerowana.
źródło
1. Dodaj poniżej w gradle aplikacji
dataBinding { enabled = true }
W układzie xml napisz poniższy kod
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data></data> </layout>if you don't get data binding class just rename the layout file name and you will get data binding class.
źródło
użyj ścieżki klasy „com.android.databinding: dataBinder: 1.0-rc0”
źródło