web-dev-qa-db-fra.com

ActivityMainBindingImpl est introuvable

Ceci provient du site google: une classe de liaison est générée pour chaque fichier de mise en page. Par défaut, le nom de la classe est basé sur le nom du fichier de disposition, en le convertissant en cas Pascal et en y ajoutant le suffixe Binding. Le nom de fichier de mise en page ci-dessus est activity_main.xml donc la classe générée correspondante est ActivityMainBinding. Cette classe contient toutes les liaisons des propriétés de mise en page (par exemple, la variable utilisateur) aux vues de la mise en page et sait comment attribuer des valeurs aux expressions de liaison.

Dans mon cas, ActivityMainBinding est généré, mais pas ActivityMainBindingImpl. Quelle est cette classe? Comment est-il généré? Mon projet est écrit en Kotlin.

import Android.util.SparseArray;
import Android.util.SparseIntArray;
import Android.view.View;
import androidx.databinding.DataBinderMapper;
import androidx.databinding.DataBindingComponent;
import androidx.databinding.ViewDataBinding;
import com.example.drake.kunuk.databinding.ActivityMainBindingImpl;
import Java.lang.IllegalArgumentException;
import Java.lang.Integer;
import Java.lang.Object;
import Java.lang.Override;
import Java.lang.RuntimeException;
import Java.lang.String;
import Java.util.ArrayList;
import Java.util.HashMap;
import Java.util.List;

public class DataBinderMapperImpl extends DataBinderMapper {
  private static final int LAYOUT_ACTIVITYMAIN = 1;

  private static final SparseIntArray INTERNAL_LAYOUT_ID_LOOKUP = new SparseIntArray(1);

  static {
    INTERNAL_LAYOUT_ID_LOOKUP.put(com.example.drake.kunuk.R.layout.activity_main, LAYOUT_ACTIVITYMAIN);
  }

  @Override
  public ViewDataBinding getDataBinder(DataBindingComponent component, View view, int layoutId) {
    int localizedLayoutId = INTERNAL_LAYOUT_ID_LOOKUP.get(layoutId);
    if(localizedLayoutId > 0) {
      final Object tag = view.getTag();
      if(tag == null) {
        throw new RuntimeException("view must have a tag");
      }
      switch(localizedLayoutId) {
        case  LAYOUT_ACTIVITYMAIN: {
          if ("layout/activity_main_0".equals(tag)) {
            return new ActivityMainBindingImpl(component, view);
          }
      throw new IllegalArgumentException("The tag for activity_main is invalid. Received: " + tag);
    }
  }
}
return null;
  }

mon xml:

<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="handler"
            type="com.example.drake.kunuk.ui.main.MainActivity" />
    <variable
            name="manager"
            type="androidx.fragment.app.FragmentManager" />
</data>

<LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:animateLayoutChanges="true"
            app:title="@string/app_name"
            app:titleMarginStart="8dp" />

    <com.google.Android.material.tabs.TabLayout
            Android:id="@+id/tab_layout"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            app:pager="@{(pager)}">
    </com.google.Android.material.tabs.TabLayout>

    <androidx.viewpager.widget.ViewPager
            Android:id="@+id/pager"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            app:handler="@{handler}" />

</LinearLayout>

MainActivity.kt:

import Android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.example.drake.kunuk.R
import com.example.drake.kunuk.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding: ActivityMainBinding = DataBindingUtil
        .setContentView(this, R.layout.activity_main)
    binding.handler = this
    binding.manager = supportFragmentManager



}

}

11
Dr4ke the b4dass

La cause probable est une erreur dans l'étape de liaison des données.

Le compilateur de liaison de données prend des fichiers de disposition et génère des classes pour prendre en charge la liaison de données (comme vous le notez: ActivityMainBinding, ActivityMainBindingImpl; le modèle général, chers lecteurs, est {layout}Binding et {layout}BindingImpl, où {layout} est le nom en chameau du fichier de mise en page). Les erreurs qui surviennent lors de la compilation de la liaison de données empêchent la génération de ces classes de support. Cela provoque alors l'erreur de classe manquante que vous voyez dans le compilateur Kotlin ou Java.

Actuellement, les erreurs de liaison de données ne sont pas affichées dans le journal de génération cuit; pour les voir, basculez la vue sur sortie brute du compilateur . À partir d'AS 3.5, erreurs de liaison de données doit être affiché dans le journal de cuisson.

Une fois que vous avez localisé le message d'erreur du compilateur de liaison de données, vous pouvez le corriger ou chercher une réponse ici sur la façon de le corriger si vous n'êtes pas sûr.

1
outis

dans dataBinding modèle si vous avez une erreur (sans erreur d'exécution) dans layout.xml ou dans activity ... Vous n'avez pas cette classe .. et dans kotlin assurez-vous que vous ajoutez dataBinding comme ceci:

Android {
   //
        }
    }

    dataBinding {
        enabled = true
    }
}

et :

// notice that the compiler version must be the same than our gradle version
kapt 'androidx.databinding:databinding-compiler:3.2.1'

ça devrait être bon.

1
sana ebadi