Android: Datenbindungsfehler: Symbolklasse kann nicht gefunden werden

Lesezeit: 7 Minuten

Ich beginne mit der Verwendung DataBinding Besonderheit. Ich stehe vor einem Problem damit.

Fehler: (21, 9) Fehler: Symbolklasse ContactListActivityBinding kann nicht gefunden werden

build.gradle (Modul: app)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.letsnurture.ln_202.databindingdemo"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
}

ContactListActivity.java

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

import com.letsnurture.ln_202.databindingdemo.model.Contact;

public class ContactListActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ContactListActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);
        Contact user = new Contact("Chintan Soni", "+91 9876543210");
        binding.setContact(user);

//        setContentView(R.layout.activity_contact_list);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_contact_list, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

content_contact_list.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"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.letsnurture.ln_202.databindingdemo.ContactListActivity"
    tools:showIn="@layout/activity_contact_list">

    <data>

        <variable
            name="user"
            type="com.letsnurture.ln_202.databindingdemo.model.Contact" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="@dimen/activity_horizontal_margin"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.contactName}"
            tools:text="Name" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.contactNumber}"
            tools:text="Number" />
    </LinearLayout>
</layout>

activity_contact_list.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.letsnurture.ln_202.databindingdemo.ContactListActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_contact_list" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="https://stackoverflow.com/questions/35126670/@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

  • Kannst du deine Manifest-Inhalte hier posten? weil Ihre Klasse ContactListActivity ist, aber der Fehler ContactListActivityBinding sagt, so dass Sie möglicherweise einen falschen Namen in das Aktivitätstag-Checkout der Manifestdatei eingeben!

    – Prithviraj Shiroor

    1. Februar 2016 um 9:19 Uhr

  • Wenn Sie der Meinung sind, dass Ihnen meine Antwort geholfen hat, können Sie das tun Akzeptiere meine Antwort.

    – Yennsarah

    11. Februar 2016 um 12:38 Uhr

  • Ihre Klasse sollte ActivityContactListBinding heißen

    – Massimo

    10. Oktober 2016 um 12:19 Uhr

  • Stelle sicher das kapt 'com.android.databinding:compiler:3.0.1' hat die gleiche Version wie für gradle, classpath 'com.android.tools.build:gradle:3.0.1'

    – AbdulMomen عبدالمؤمن

    28. März 2018 um 19:09 Uhr

  • In meinem Fall war es nur eine verwirrende Fehlermeldung. Der gemeldete Fehler war, dass das Symbol für die Bindung nicht gefunden wurde. Das stimmte, aber das zugrunde liegende Problem war, dass ich dort meine Bindung falsch gemacht hatte, sodass sie nicht generiert wurde.

    – Matt Robertson

    27. August 2019 um 10:40 Uhr

Benutzer-Avatar
Khemraj Sharma

Du kannst sehen Hauptantwort für vollständige Informationen zu Datenbindungsfehlern und Lösungen. Ich werde versuchen, einige wichtige Punkte unten zu erzählen.

5 Tipps, die ich verwende, um Bindungsprobleme zu lösen.

Vorausgesetzt, Sie haben aktivierte Datenbindung in build.gradle und Sie haben Ihr Layout konvertiert verbindliches Layout.

Zunächst wird die Bindungsklasse automatisch generiert, wenn Sie das Layout in ein Bindungslayout konvertieren. Trotzdem wird es manchmal nicht generiert, wenn Hintergrund-Threads nicht funktionieren. Hier sind einige Tipps für Sie, um dieses Problem zu lösen.

(1) Name der generierten Klasse

Layoutname ist drin Schlangenfall activity_main.xml

Die Datenbindungsklasse wird in sein PascalFall wie ActivityMainBinding.

(2). Geben Sie den vollständigen Namen der Binding-Klasse ein

Ich fühlte mich manchmal beim Tippen ActivityMai...dann es zeigt keinen Vorschlagaber das bedeutet nicht Klasse ist nicht generiert. In diesem Fall sollten Sie Geben Sie den vollständigen Namen ein der erwarteten generierten Klasse. Wie Art ActivityMainBinding und es wird das Import-Popup anzeigen. (Damit bin ich oft konfrontiert worden.)

Bekomme immer noch keinen Importvorschlag. Versuchen Sie den manuellen Import.

import <yourpackage>databinding.ActivityMainBinding;

(3). Projekt neu erstellen

Wenn immer noch Ihre Klasse nicht generiert wird. (Einige Zeit, wenn wir Layout-Dateien einfügen, dann passiert es). Dann Projekt neu erstellen aus Build> Rebuild (Kein Build- oder Make-Projekt). Es generiert Ihre Datenbindungsklasse. (Rebuild macht für mich immer Magie.)

(4) Wenn Sie eine erstellt haben <variable in Ihrem Layout und es zeigt seinen Setter und Getter nicht an in der Datenbindungsklasse, dann 4. Punkt folgen.

(5) Wenn Ihre Klasse jedoch nicht generiert wird, sollten Sie dies tun Überprüfen Sie, ob der Build nicht aufgrund eines Fehlers fehlschlägt in Ihrer Layoutdatei. Die Datenbindungsklasse wird bei einem erfolgreichen Build generiert.

Dies ist alles, was ich tue, um meine Datenbindungsfehler zu beheben. Wenn Sie weitere Probleme haben, können Sie hier einen Kommentar abgeben.

Quelle Antwort

  • Punkt 5 ist gut – aber es ist oft der Fall, dass, wenn ein Build aufgrund von Datenbindung fehlschlägt, der angezeigte Fehler vage ist und manchmal nichts mit dem eigentlichen Problem zu tun hat. Betrieb ./gradlew :app:build --stacktrace wird viel mehr nützliche Informationen liefern

    – Lukas Needham

    2. September 2020 um 17:19 Uhr

  • Punkt 5 hat bei mir auch funktioniert. Für mich habe ich einen Parameter in einem Funktionsaufruf verpasst, mit dem ich fertig bin onclick Attribut im Layout. Es gab keinen Fehler im Editor.

    – Anubhab Maji

    10. Mai 2021 um 18:51 Uhr

Benutzer-Avatar
George Chen

Bitte wende dich an die Android-Entwicklerleitfaden

Die Layoutdatei war main_activity.xml, also war die generierte Klasse MainActivityBinding

Da Ihre XML-Datei “activity_contact_list.xml” heißt, sollten Sie verwenden ActivityContactListBinding anstelle des Originals

  • Dieser ist wirklich wichtig!

    – 476rick

    10. März 2018 um 13:44 Uhr

Benutzer-Avatar
Gk Mohammad Emon

Tatsächlich kann es aus verschiedenen Gründen passieren, und für einen schlechten Protokollierungsmechanismus bei der Datenbindung ist es sehr schwierig, den Grund zu finden. Gehen Sie also zuerst zum richtigen Fehler, gehen Sie zum Terminal und führen Sie den folgenden Befehl aus:

gradlew :app:build --stacktrace

Es zeigt Ihnen den richtigen Fehler mit der Nummer der Zeile in XML, wo der Fehler gefunden wurde.

Zum Beispiel –

ERROR: Could not find accessor com.example.model file://app\src\main\res\layout\fragment_example.xml Line:91

  • Dieser ist wirklich wichtig!

    – 476rick

    10. März 2018 um 13:44 Uhr

Benutzer-Avatar
Mardan

Falsche Paketnamen können ebenfalls den obigen Fehler verursachen. Ab dem Android Gradle-Plug-in 3.2 (soweit ich das beurteilen kann) werden CamelCase-Paketnamen nicht ordnungsgemäß als abgeleitet classeswodurch das generierte Bindungsobjekt unterbrochen wird.

Beispiel:

src
|
-> FooPackage
    |
    -> Bar.java

wird fälschlicherweise als generiert

import src.FooPackage

...

public abstract class MyBinding extends ViewDataBinding {
    @NonNull
    public final FooPackage.Bar mInstance;
...
}

Das ergibt offensichtlich keinen Sinn.

Umgestalten FooPackage zu foopackage entsprechend Java-Konventionen und gerettet werden. Sie erhalten dann:

import src.foopackage.Bar

...

public abstract class MyBinding extends ViewDataBinding {
    @NonNull
    public final Bar mInstance;
...
}

  • Ihre großartige und Ihre Lösung hat wirklich für mich funktioniert. Mein Fehler war, dass ich meinen Ordnernamen in Großbuchstaben wie Company.CompanyViewModel geschrieben habe. Dann refaktoriere ich es in company.CompanyViewModel und dann lässt es sich gut kompilieren.

    – Gk Mohammad Emon

    28. April 2020 um 7:23 Uhr

  • Ich weiß, das ist alt, hat aber wie ein Zauber funktioniert! Databinding ist sehr sinnvoll mit Namen. Vielen Dank

    – Engel Pat Martin

    26. September 2020 um 5:50 Uhr

1298210cookie-checkAndroid: Datenbindungsfehler: Symbolklasse kann nicht gefunden werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy