web-dev-qa-db-ja.com

android:データバインディングエラー:シンボルクラスが見つかりません

DataBinding機能の使用を開始しています。私はそれで問題に直面しています。

エラー:(21、9)エラー:シンボルクラスContactListActivityBindingが見つかりません

build.gradle(Module: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="@Android:drawable/ic_dialog_email" />

</Android.support.design.widget.CoordinatorLayout>
30
Chintan Soni

これはあなたのコードです

ContactListActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);

このコードを置き換える

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);
10
Finava Vipul

私は一貫してこの問題に遭遇しました。 Android studioが動的に生成されたファイルを認識していないことに関係があると思います。データバインディングに必要なものが他にすべてある場合は、[ファイル]> [キャッシュの無効化/再起動...]を選択し、[キャッシュの無効化と再起動]を選択します。次に、BRファイルをインポートしてみてください...正常にインポートされるはずです。

Clean and Rebuildをスローする必要がある場合があります。

18
feilong

Androidデベロッパーガイド を参照してください

レイアウトファイルはmain_activity.xmlであったため、生成クラスはMainActivityBindingでした

Xmlの名前は「activity_contact_list.xml」なので、元のXMLではなくActivityContactListBindingを使用する必要があります

13
GeorgeChen

Main Answerを参照して、データバインディングのエラーと解決策の詳細を確認してください。以下にいくつかの重要なポイントを説明します。

バインディングの問題を解決するために使用する5つのヒント。

build.gradle有効なデータバインディングがあり、レイアウトをbinding layoutに変換したと仮定します。

まず、レイアウトをバインディングレイアウトに変換すると、バインディングクラスが自動生成されます。それでも、バックグラウンドスレッドが動作していないときに生成されないことがあります。これを解決するためのヒントを次に示します。

(1)生成されたクラスの名前

レイアウト名はsnake_caseactivity_main.xmlにあります

データバインディングクラスはCamelCase like ActivityMainBindingになります。

(2)。バインディングクラスの完全な名前を入力

ActivityMai...と入力すると時々感じました[提案を表示しない、しかし意味しないクラスは生成されません。その場合、期待される生成されたクラスの完全な名前を入力する必要があります。タイプActivityMainBindingおよびそのようなインポートポップアップが表示されます。 (それは私が何度も直面したことです。)

インポートの提案がまだ得られていません。手動インポートを試してください。

import <yourpackage>databinding.ActivityMainBinding;

(3)。プロジェクトの再構築

それでもクラスが生成されない場合。 (レイアウトファイルを貼り付けたときに起こることがあります)。次に、プロジェクトの再構築からBuild> Rebuildプロジェクトの構築または作成ではありません)。データバインディングクラスが生成されます。 (リビルドは常に私のためにマジックを行います。

(4)レイアウトで<variableを作成し、それをデータバインディングクラスでセッターとゲッターを表示しないの場合、- 4番目のポイントに従う

(5)それでもクラスが生成されない場合は、レイアウトファイルでエラーが原因でビルドが失敗していないかどうかを確認するを実行する必要があります。ビルドが成功すると、データバインディングクラスが生成されます。

これが、データバインディングエラーを解決するためのすべてのことです。さらに問題が発生した場合は、ここでコメントできます。

ソースの回答

9
Khemraj

インクルードレイアウトではなく、アクティビティレイアウトでバインディングを宣言して渡す必要があります。

ドキュメント の例:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:bind="http://schemas.Android.com/apk/res-auto">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       Android:orientation="vertical"
       Android:layout_width="match_parent"
       Android:layout_height="match_parent">
       <include layout="@layout/name"
           bind:user="@{user}"/>
       <include layout="@layout/contact"
           bind:user="@{user}"/>
  </LinearLayout>
</layout>

ここでは、name.xmlおよびcontact.xmlレイアウトファイルの両方にユーザー変数が必要です。

4
yennsarah

不適切なパッケージ名も上記のエラーを引き起こす可能性があります。 Android Gradleプラグイン3.2以降(私が知る限り)、CamelCaseパッケージ名はclassesとして不適切に推論され、生成されたバインディングオブジェクトが破損します。

例:

src
|
-> FooPackage
    |
    -> Bar.Java

として誤って生成されます

import src.FooPackage

...

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

これは明らかに意味をなしません。

Java規約 に従ってFooPackagefoopackageにリファクタリングし、保存します。その後、次のものが得られます。

import src.foopackage.Bar

...

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

同じエラーが発生しましたが、Kotlinを使用しています。

それを解決するために、私はgradlesファイルにいくつかの変更を加えます:

projectのGradleファイル:

dependencies {
    classpath "com.Android.tools.build:gradle:3.1.2"
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.40"
}

appのGradleファイル:

dependencies {

    ...
    implementation "Android.Arch.lifecycle:extensions:1.1.1"
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.30"
    kapt 'com.Android.databinding:compiler:3.1.2'
}


kapt {
    generateStubs = true
}

//used to resolve annotation conflicts
configurations.all {
    resolutionStrategy {
        force 'com.Android.support:support-annotations:23.1.1'
    }
}
2
Kevin ABRIOUX

モデルの名前と参照の名前が同じであることを確認してください。

たとえば、name = "item"はAndroid:checked = "@ = {item。checked}"と一致する必要があります

<data>
    <variable
        name="item"
        type="com.simone.mywordlist.model.MyModel" />
</data>

            <Switch
                Android:id="@+id/my_switch"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:checked="@={item.checked}"
            />
2
live-love

バインドするactivity_contact_listを変更する必要があります-content_contact_listで行ったようにレイアウトタグを追加します。忘れないでください、activity_contact_list内のルートレイアウトには、生成されるBindingクラスのIDが必要で、名前はActivityContactListBinding(つまり、アンダースコアの代わりにキャメルキャスティングを使用したレイアウトの名前) )。

次に、activity_contact_list内で<include layout="@layout/content_contact_list" />にIDを与えると、ActivityContactListBindingインスタンスを介してそのバインディングインスタンスにアクセスできます。

次のようなもの:

binding.contentContactList.setContact(user);

動作するかどうか教えてください。

2
Shirane85

この問題は、レイアウトファイルに問題がある場合に発生する可能性があります。私の場合、間違った方法でメソッドを呼び出すだけです

Android:onClick="@={() -> viewModel.showText()}"

の代わりに

  Android:onClick="@{() -> viewModel.showText()}"
1
Zeeshan Ali

これらのエラーの理由はDataBinding自体ではなく、コードの他の部分である場合があります。私の場合、Roomデータベースにエラーがあったため、コンパイラはバインディングクラスを生成できず、これらのエラーが発生しました。

Googleによると:

データバインディングコンパイラの以前のバージョンは、マネージコードをコンパイルするのと同じ手順でバインディングクラスを生成しました。マネージコードのコンパイルに失敗すると、バインディングクラスが見つからないことを報告する複数のエラーが発生する場合があります。新しいデータバインディングコンパイラは、マネージコンパイラがアプリをビルドする前にバインディングクラスを生成することにより、これらのエラーを防ぎます。

したがって、新しいデータバインディングコンパイラを有効にするには、次のオプションをgradle.propertiesファイルに追加します。

Android.databinding.enableV2=true

次のパラメータを追加して、gradleコマンドで新しいコンパイラを有効にすることもできます。

-Pandroid.databinding.enableV2=true

Android St​​udioバージョンの新しいコンパイラ.2デフォルトで有効です。

1
Saman Sattari

プロジェクトディレクトリの「build」フォルダを削除して、もう一度コンパイルします。

1

キーポイント

レイアウト名はsnake_caseにあります。

activity_login.xml

バインディングクラス名はCamelCaseになります。

ActivityLoginBinding.Java

レイアウトの作成後にプロジェクトもビルドします。場合によっては自動的に生成されません。

1
Khemraj

アクティビティの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">
    <data>
        <variable
             name=""
             type="" />
    </data
    <Android.support.design.widget.CoordinatorLayout 
        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.CoordinatorLayout>
</layout>

次に、Android:idをタグに追加します

その後、ActivityContactListBindingオブジェクトが作成され、含まれるレイアウトの変数にアクセスしてバインドできます。

1
Daniel Andujar

私の場合、生成されたデータバインディングクラスに欠落しているインポートと同じ名前のパッケージがありました。コンパイラが混乱したようです。

0
tricknology

アクティビティがMainActivityMVVMと呼ばれ、バインディングがMainActivityMvvmBindingではなくMainActivityMVVMBindingに変換されたため、この問題に陥りました。生成されたクラスを掘り下げた後、問題が見つかりました。

0
Pablo