问题描述
我在我的应用程序中使用数据绑定.我有一个应用程序模块,数据绑定成功运行.
I'm using data binding within my app. I have an application module and the data binding is working successfully.
但是,我也有一个'home-module',我正在尝试使用相同的技术,但是xml中的数据绑定出现以下错误:
However, I also have a 'home-module' I'm trying to use the same techniques, but the data binding is erroring in the xml with the following:
我找到了此错误报告,该信息提示了是一个问题,但已得到解决.
I've found this bug report which suggests this was an issue but it's been fixed.
我看不到代码的任何问题,我认为问题是因为它在库模块中.
I can't see any issues with the code, I think the problem is because it's in the library module.
有什么我可以做的工作吗?
Is there anything I can do to get this working?
家庭模块
activity_home.xml
activity_home.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="viewModel" type="com.flowmellow.projectx.home.ui.viewmodel.HomeViewModel"/>
</data>
<android.support.design.widget.CoordinatorLayout
android:id="@+id/home_screen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="com.flowmellow.projectx.home.ui.viewmodel.HomeActivity">
<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>
<android.support.constraint.ConstraintLayout
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:id="@+id/content_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.flowmellow.projectx.home.ui.viewmodel.HomeActivity">
<TextView
android:text="@string/activity_home_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/activity_home_title"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:layout_marginStart="16dp"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginLeft="16dp"
android:layout_marginEnd="16dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginRight="16dp"
app:layout_constraintBottom_toTopOf="@+id/activity_home_button"
android:layout_marginBottom="64dp" />
<Button
android:text="@string/activity_home_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/activity_home_button"
style="@style/Widget.AppCompat.Button.Colored"
android:onClick="@{viewModel::onButtonClicked}"/>
</android.support.constraint.ConstraintLayout>
</android.support.design.widget.CoordinatorLayout>
</layout>
HomeActivity
HomeActivity
public class HomeActivity extends AppCompatActivity {
private HomeViewModel mHomeViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
final CustomSensorManager customSensorManager = new CustomSensorManager(sensorManager);
mHomeViewModel = new HomeViewModel(customSensorManager);
setBindingContentView(R.layout.activity_home);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
private void setBindingContentView(@LayoutRes int layoutResID) {
ActivityHomeBinding binding = DataBindingUtil.setContentView(this, layoutResID);
binding.setViewModel(mHomeViewModel);
}
}
HomeViewModel
HomeViewModel
public class HomeViewModel {
private CustomSensorManager mSensorManager;
public HomeViewModel(@NonNull CustomSensorManager sensorManager) {
mSensorManager = sensorManager;
}
public void onButtonClicked(View view) {
mSensorManager.scan(true);
}
}
build.gradle
build.gradle
apply plugin: 'com.android.library'
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.android.support:design:25.0.0'
compile 'com.android.support.constraint:constraint-layout:+'
}
更新:
可能是一个错误. 链接
我的问题:
引擎模块没有UI,因此错过了依赖关系,现在很有意义了.
The engine module has no UI, so the dependency was missed, makes a lot of sense now.
推荐答案
假设您的应用中具有这样的多级模块层次结构:
Say you have a multilevel module hierarchy like this in your app:
为了使数据绑定到工作模块A,必须确保在整个层次结构中启用数据绑定,从根模块到模块A.
In order for databinding to work module A, you have to make sure you enable databinding in the whole hierarchy from the root module into module A.
这意味着您必须添加:
dataBinding {
enabled = true
}
到模块:
- 应用程序模块
- 模块A
- 模块B
重要的是要记住,您必须也要在module B
中启用数据绑定,因此涵盖了所有路径.
It is important to remember that you do have to also enable databinding in module B
, so all paths are covered.
这篇关于DataBinding在模块中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!