android - DataBinding 在模块中不起作用

标签 android android-databinding

我在我的应用程序中使用数据绑定(bind)。我有一个应用程序模块,数据绑定(bind)工作成功。

但是,我也有一个“home-module”,我正在尝试使用相同的技术,但数据绑定(bind)在 xml 中出现以下错误:

Error:(63, 34) No resource type specified (at 'onClick' with value '@{viewModel::onButtonClicked}').

我找到了 this bug report这表明这是一个问题,但已得到修复。

我看不出代码有任何问题,我认为问题出在库模块中。

我能做些什么来让它工作吗?

主模块

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>

主页 Activity

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);
    }
}

主页 View 模型

public class HomeViewModel {

    private CustomSensorManager mSensorManager;

    public HomeViewModel(@NonNull CustomSensorManager sensorManager) {
        mSensorManager = sensorManager;
    }

    public void onButtonClicked(View view) {
        mSensorManager.scan(true);
    }
}

构建.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:+'
}

更新:

可能是一个错误。 link

我的问题:

enter image description here

引擎模块没有 UI,因此缺少依赖项,现在很有意义。

最佳答案

假设您的应用中有一个像这样的多级模块层次结构:

Multilevel module hierarchy in Android

为了数据绑定(bind)到模块 A,您必须确保在从根模块到模块 A 的整个层次结构中启用数据绑定(bind)。

这意味着你必须添加:

dataBinding {
    enabled = true
}

模块:

  • 应用模块
  • 模块A
  • 模块B

重要的是要记住,您已经也在模块B中启用了数据绑定(bind),所以所有路径都被覆盖了。

关于android - DataBinding 在模块中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41765114/

相关文章:

Android Studio 3.0 数据绑定(bind)时显示错误

android - ConstraintLayout Ratio 绑定(bind)有宽度但没有高度

Android - 强制 PreferenceActivity 不自动保存

android - 您可以在其他应用程序中使用一个应用程序中的 .so 库吗?

android - 尝试发送 Android 图像时应用程序崩溃

android - 为什么不可见的 LinearLayout 会占用空间?

java - 旋转后保持TextView文本、大小、可见性

android - 如何在 android 数据绑定(bind)中使用逻辑操作?

android - 我可以使用数据绑定(bind)将 UI 与我的 View 模型中的数据绑定(bind)吗?

android - Kotlin DataBinding 将静态函数传递到布局 xml