データバインディングを使用している間、 データバインディングガイド に従ってクラスMainActivityBinding
を取得できません
私のレイアウト名はactivity_main.xml
です。 Android-DataBinding-Bindingクラスがいつ、どのように生成されるのか? が表示されますが、それは役に立ちません。
回答ありがとうございます。データバインディングに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);
できました。
DataBindingクラスは、xmlファイル名に基づいて生成されます。あなたがフォローしているドキュメントで明確に言及されています。
デフォルトでは、Bindingクラスはレイアウトファイルの名前に基づいて生成され、Pascalケースに変換され、接尾辞「Binding」が付けられます。上記のレイアウトファイルはmain_activity.xmlであったため、生成クラスはMainActivityBindingでした
Xml名がactivity_main.xml
の場合、DataBindingクラス名はActivityMainBinding
になります。
Xml名がmain_activity.xml
の場合、DataBindingクラス名はMainActivityBinding
になります。
一度プロジェクトをきれいにしてビルドすることを忘れないでください
DataBinding の詳細については、このチュートリアルに従ってください。
TRY xmlファイルの名前を別の名前に変更し、バインディングが機能するかどうかを確認します一度機能すると、使用された名前に戻ります。
Android Studio 3.1に役立ちました
DataBindingクラス名が正しいで、プロジェクトのクリーニングと再構築に使用したが、それでもエラーが表示される場合。
次に、再起動 AndroidStudioを試みます。
私はプロジェクトをきれいにしました、再構築は完了しました...しかし役に立たないのです。その後、キャッシュを無効にし、プロジェクトを再起動しましたが、それも私を助けませんでした。
それから、xmlファイル名を変更しました-それは素晴らしくうまくいきました。
それで、私はあなたに一つのことを共有したいと思います、あなたのxmlファイル名を変えてください。
例:xmlファイルがactivity_main.xmlで、そのJavaクラスでActivityMainBindingを取得できない場合.......... xml名をmain_activity.xmlに変更してから使用しますJavaクラスのMainActivityBindingを 'private MainActivityBinding binding;'として
これはおそらく最もうまくいくでしょう。
このような場合、キャッシュの再構築も無効化も機能しない場合、@ {xyz.abc}を使用した可能性のあるxmlファイルの1つにエラーがあり、xmlのxyzまたはabcに問題があるはずです。
アクティビティ/フラグメントのxmlとクラスに一貫した名前があることを確認してください。たとえば、TimePickerFragment
がある場合、xmlファイル名はtime_picker_fragment
である必要があります。
fragment_time_picker
という名前のレイアウトがあることに気付きました。変更後、バインディングが生成されました。
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>
ソースのパッケージ名を変更した後も同じ問題が発生しました(ここで説明したものを含む)多くのことを試した後、データバインディングクラスを手動でインポートして問題を解決しました。
import com.domain.my.databinding.MyActivityBinding;
バインディングクラスは、レイアウトファイル名に基づいて生成されます。デフォルトでは、クラスの名前はレイアウトファイルの名前に基づいており、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);
デフォルトでは、Bindingクラスはレイアウトファイルの名前に基づいて生成され、大文字から始まり、アンダースコア(_)が削除され、次の文字が大文字になり、その後に「Binding」が付加されます。
このクラスは、モジュールパッケージの下のデータバインディングパッケージに配置されます。
たとえば、レイアウトファイルcontact_item.xml
はContactItemBinding
を生成します。
モジュールパッケージが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>
私の場合、アプリビルドフォルダーを削除してからプロジェクトを再構築すると問題が解決しました。
次の手順でも機能しませんでした。
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.
コメントをカントするので、答えにこれを追加します。あなたが述べたように、activity_main.xmlはMainActivityBindingではなくActivityMainBindingを作成すると信じています。スタジオがバインディングクラスを見つけられない場合は、キャッシュを無効にしてプロジェクトを再構築するだけです。
Android studioを再起動するか、XMLファイルの名前を別の名前に変更して、機能するようになったらバインドが機能するかどうかを確認します。
Build.gradleファイルに以下の行を必ず追加してください
dataBinding {有効true}
次の解決策を試しましたが、うまくいきませんでした:1)キャッシュを無効にして再起動します。 2)Android Studioを再起動します。 3)プロジェクトを再構築します。
問題を解決するDIDは次のとおりです。1.モジュールgradle.buildの「dataBinding」タグを削除します2.プロジェクトを同期します3「databinding」タグを返します4.プロジェクトを再度同期します。
Android Studioを再起動するか、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>