web-dev-qa-db-ja.com

Androidデータバインディングクラスを解決できません

データバインディングを使用している間、 データバインディングガイド に従ってクラスMainActivityBindingを取得できません

私のレイアウト名はactivity_main.xmlです。 Android-DataBinding-Bindingクラスがいつ、どのように生成されるのか? が表示されますが、それは役に立ちません。

42
pRaNaY

回答ありがとうございます。データバインディングにContentMainBindingクラス名を使用したソリューションを見つけました。説明させてください。

注:<include ...でレイアウトを使用しているとき、データバインディング機能を含む<include layout="@layout/content_main"があり、クラス名にはレイアウト名が含まれます。これがContentMainBindingです

私のレイアウトファイルは次のとおりです。

activity_main.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.databindingdemo.app.MainActivity">
    ...
    <include layout="@layout/content_main" />
    ...
    </Android.support.design.widget.CoordinatorLayout>

content_main.xmlは、データバインディングレイアウトコードを追加したレイアウトです。

したがって、MainActivityBindingを使用する代わりにContentMainBindingで解決できます

私のために働くコードは以下です:

//Code for data binding
    ContentMainBinding contentMainBinding = DataBindingUtil.setContentView(this, R.layout.content_main);
    user = new User("Pranay", "Patel", "[email protected]", "9999999999");
    contentMainBinding.setUser(user);

できました。

18
pRaNaY

DataBindingクラスは、xmlファイル名に基づいて生成されます。あなたがフォローしているドキュメントで明確に言及されています。

デフォルトでは、Bindingクラスはレイアウトファイルの名前に基づいて生成され、Pascalケースに変換され、接尾辞「Binding」が付けられます。上記のレイアウトファイルはmain_activity.xmlであったため、生成クラスはMainActivityBindingでした

Xml名がactivity_main.xmlの場合、DataBindingクラス名はActivityMainBindingになります。

Xml名がmain_activity.xmlの場合、DataBindingクラス名はMainActivityBindingになります。

一度プロジェクトをきれいにしてビルドすることを忘れないでください

DataBinding の詳細については、このチュートリアルに従ってください。

78
Rocky

TRY xmlファイルの名前を別の名前に変更し、バインディングが機能するかどうかを確認します一度機能すると、使用された名前に戻ります。

Android Studio 3.1に役立ちました

19
Ismail Iqbal

DataBindingクラス名が正しいで、プロジェクトのクリーニングと再構築に使用したが、それでもエラーが表示される場合。
次に、再起動 AndroidStudioを試みます。

7
Phan Van Linh

私はプロジェクトをきれいにしました、再構築は完了しました...しかし役に立たないのです。その後、キャッシュを無効にし、プロジェクトを再起動しましたが、それも私を助けませんでした。

それから、xmlファイル名を変更しました-それは素晴らしくうまくいきました。

それで、私はあなたに一つのことを共有したいと思います、あなたのxmlファイル名を変えてください。

例:xmlファイルがactivity_main.xmlで、そのJavaクラスでActivityMainBindingを取得できない場合.......... xml名をmain_activity.xmlに変更してから使用しますJavaクラスのMainActivityBindingを 'private MainActivityBinding binding;'として

これはおそらく最もうまくいくでしょう。

6
Musthafa

このような場合、キャッシュの再構築も無効化も機能しない場合、@ {xyz.abc}を使用した可能性のあるxmlファイルの1つにエラーがあり、xmlのxyzまたはabcに問題があるはずです。

5
Rohan Taneja

アクティビティ/フラグメントのxmlとクラスに一貫した名前があることを確認してください。たとえば、TimePickerFragmentがある場合、xmlファイル名はtime_picker_fragmentである必要があります。

fragment_time_pickerという名前のレイアウトがあることに気付きました。変更後、バインディングが生成されました。

4
AAryz

Activity_main.xmlファイルがlayoutタグで囲まれていることを確認してください:

<?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">

    <Android.support.constraint.ConstraintLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

    </Android.support.constraint.ConstraintLayout>
</layout>
3
Andrew Lee

ソースのパッケージ名を変更した後も同じ問題が発生しました(ここで説明したものを含む)多くのことを試した後、データバインディングクラスを手動でインポートして問題を解決しました。

import com.domain.my.databinding.MyActivityBinding;
3
hiddeneyes02

バインディングクラスは、レイアウトファイル名に基づいて生成されます。デフォルトでは、クラスの名前はレイアウトファイルの名前に基づいており、Pascalケースに変換し、それにバインディングサフィックスを追加します

たとえば、xml名がactivity_main.xmlの場合、DataBindingクラス名はActivityMainBindingになります

次に、パッケージをインポートします。

import com.companyname.applicationname.databinding.ActivityMainBinding;

その後、あなたはそれを使用することができます

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("Test", "User");
binding.setUser(user);
3
Alen Lee

デフォルトでは、Bindingクラスはレイアウトファイルの名前に基づいて生成され、大文字から始まり、アンダースコア(_)が削除され、次の文字が大文字になり、その後に「Binding」が付加されます。

このクラスは、モジュールパッケージの下のデータバインディングパッケージに配置されます。

たとえば、レイアウトファイルcontact_item.xmlContactItemBindingを生成します。

モジュールパッケージがcom.example.my.appの場合、com.example.my.app.databindingに配置されます。

データ要素のクラス属性を調整することにより、バインディングクラスの名前を変更したり、異なるパッケージに配置したりできます。例えば:

<data class="ContactItem">
    ...
</data>

これにより、モジュールパッケージのデータバインディングパッケージにContactItemとしてバインディングクラスが生成されます。モジュールパッケージ内の別のパッケージでクラスを生成する必要がある場合、接頭辞として“.”を付けることができます。

<data class=".ContactItem">
    ...
</data>

この場合、ContactItemはモジュールパッケージに直接生成されます。完全なパッケージが提供されている場合、任意のパッケージを使用できます。

<data class="com.example.ContactItem">
    ...
</data>
2
Priyank Patel

私の場合、アプリビルドフォルダーを削除してからプロジェクトを再構築すると問題が解決しました。

次の手順でも機能しませんでした。

          1) Rebuild the project after adding the dataBinding  in gradle.

          2) Rebuild after adding layout tag in xml.

          3) cleaning the project

          4) rebuilding the project

          5) Restarted the Android Studio

アプリのgradleファイルでdataBindingを有効にした後、再構築してください。次に、生成されたBindingクラスを見つけることができます。

          If the layout name is fragment_home, The Binding class name will be FragmentHomeBinding.
2
Thriveni

コメントをカントするので、答えにこれを追加します。あなたが述べたように、activity_main.xmlはMainActivityBindingではなくActivityMainBindingを作成すると信じています。スタジオがバインディングクラスを見つけられない場合は、キャッシュを無効にしてプロジェクトを再構築するだけです。

1
Ankit

Android studioを再起動するか、XMLファイルの名前を別の名前に変更して、機能するようになったらバインドが機能するかどうかを確認します。

1
Brahem Mohamed

Build.gradleファイルに以下の行を必ず追加してください

dataBinding {有効true}

1
Revanth

次の解決策を試しましたが、うまくいきませんでした:1)キャッシュを無効にして再起動します。 2)Android St​​udioを再起動します。 3)プロジェクトを再構築します。

問題を解決するDIDは次のとおりです。1.モジュールgradle.buildの「dataBinding」タグを削除します2.プロジェクトを同期します3「databinding」タグを返します4.プロジェクトを再度同期します。

0
Nativ

Android St​​udioを再起動するか、ActivityMainBindingクラスを手動で検索してインポートを追加してください。

最後に含まれたxmlにデータタグを配置します。以下に例を示します。

MainActivity.Java
public class MainActivity extends AppCompatActivity {

    public Item item;
    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        item = new Item();
        item.setChecked(true);
        item.setName("a");
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.included.secondIncluded.setModel(item);


Item.Java
public class Item extends BaseObservable {
    private String name;
    private Boolean checked;
    @Bindable
    public String getName() {
        return this.name;
    }
    @Bindable
    public Boolean getChecked() {
        return this.checked;
    }
    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }
    public void setChecked(Boolean checked) {
        this.checked = checked;
        notifyPropertyChanged(BR.checked);
    }
}


activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">
        <TextView
            Android:id="@+id/tv_title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="abc"
            Android:textSize="20sp" />
        <include
            Android:id="@+id/included"
            layout="@layout/included_layout"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content" />
    </LinearLayout>
</layout>


included_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">
        <TextView
            Android:id="@+id/tv_title2"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="123"
            Android:textSize="20sp" />
        <include
            Android:id="@+id/second_included"
            layout="@layout/second_included_layout"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content" />
    </LinearLayout>
</layout>

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

    <data>
        <variable
            name="model"
            type="com.example.simone.twowaydatabinding.Item" />
    </data>

    <LinearLayout
        Android:id="@+id/linear_layout_included"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">

        <TextView
            Android:id="@+id/tv_title1"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="xyz"
            Android:textSize="20sp" />
        <TextView
            Android:id="@+id/tv_title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@={model.name}"
            Android:textSize="20sp" />
        <Switch
            Android:id="@+id/switch_test"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:checked="@={model.checked}" />
        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="change"
            Android:onClick="button_onClick"/>
        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:id="@+id/world"/>
    </LinearLayout>
</layout>       
0
live-love