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
}
}
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.
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.