8
votes

Liaison de données Android: impossible de trouver ... BindingImpl dans le fichier de liaison de données généré

J'essaye de rechercher un modèle de vue en utilisant l'exemple de projet android-sunflower. Le problème actuel est que lorsque j'essaie de créer le projet, j'obtiens l'erreur error: cannot find symbol symbol: class FragmentShopBindingImpl location: package {{packageName}}. databinding dans la classe DataBindinMapperImpl Je ne suis pas vraiment sûr de ce qui me manque ici, car j'ai tout ajouté du projet d'exemple. La classe FragmentShopBindingImpl n'est pas générée, ou ne devrait-elle pas? Puisque je ne vois aucune occurrence d'une classe se terminant par "Impl" dans l'exemple de tournesol android
Mon code:

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

    <data>
        <variable
            name="viewModel"
            type="{{packageName}}.viewmodel.ShopViewModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".fragments.ShopFragment">

        <TextView
            android:text="@{viewModel}"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>
</layout>

Mise en page:

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val factory = InjectorUtils.provideShopViewModelFactory(context!!)
        val shopViewModel = ViewModelProviders.of(this, factory)
            .get(ShopViewModel::class.java)

        val binding = DataBindingUtil.inflate<FragmentShopBinding>(
            inflater, R.layout.fragment_shop, container, false).apply {
            viewModel = shopViewModel
            lifecycleOwner = this@ShopFragment
        }

        return binding.root
    }

Image du fichier généré (ignorez le {{packageName}}:

entrez la description de l'image ici


2 commentaires

Copie possible de l'erreur : impossible de trouver le symbole import com.gourav .news.databinding.ActivityDetailBindingImpl;


Je vais le vérifier si j'ai le temps


4 Réponses :


8
votes

Il semble que la seule chose que je devais ajouter était dans les balises de données ...


0 commentaires

7
votes

Dans votre code xml à l'intérieur de la balise textView, pour android: attribut text que vous avez utilisé @ {viewmodel}. Il fait simplement référence à votre classe shopViewModel, vous devez cibler la variable de texte à l'intérieur de cette classe. Puis le gen. les erreurs de fichier de classe disparaîtront.

Les erreurs bindingImpl sont principalement générées pour des erreurs affectation pour les attributs XML-text ou XML-onClick.


0 commentaires

3
votes

Si vous utilisez une liaison de données bidirectionnelle ( @ = {myBindingValue} , avec le signe '=' au lieu de @ {myBindingValue} ) parfois, vous aurez cette erreur générique inhabituelle parce que la valeur que vous essayez de lier est déclarée comme immuable => val au lieu de var dans Kotlin dans votre classe de données.

Exemple:

data class User(
   val name,
   var email
)

Dans cet exemple, vous pouvez lier la variable de messagerie de l'utilisateur comme suit: text = "@ = {myViewModel .user.email} " Mais, si vous essayez de lier le nom de l'utilisateur: text = "@ = {myViewModel.user.name}" , vous obtiendrez cette erreur.


0 commentaires

0
votes

Vous devez définir la variable comme ObservableField ci-dessous:

 public final ObservableField<String> name = new ObservableField<>();
 public final ObservableField<String> family = new ObservableField<>();


0 commentaires