java - Android 使用另一个包中的 BR

标签 java android data-binding android-gradle-plugin android-databinding

我正在尝试访问另一个包生成的数据绑定(bind) propertyId。我收到此错误:

<小时/>
D:\Android\TestApp\appbase\src\main\java\com\testapp\appbase\adapters\MenuAdapter.java:175: error: cannot find symbol
        if (propertyId == com.testapp.procallapi.BR.position)
                                                  ^
symbol:   class BR
location: package com.testapp.procallapi
<小时/>

这是我的代码 MenuAdapter.java:

public void reloadDataSource(ObservableList<CatData> dataSource)
{
    ...
    ...
    ...

    for (CatData data : dataSource)
    {
        data.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback()
        {
            @Override
            public void onPropertyChanged(Observable sender, int propertyId)
            {
                if (propertyId == com.testapp.procallapi.BR.position)
                {
                    sortItems();
                }
            }
        });
    }
}

我的问题是,是否可以从另一个包访问BR?如果我注释了该行 if (propertyId == com.testapp.procallapi.BR.position),那么它会编译并运行正常。

这是我的 build.gradle:

apply plugin: 'com.android.library'
apply plugin: 'realm-android'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 19
        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(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile project(path: ':components')
    compile project(path: ':appdb')
    compile project(path: ':procallapi')
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:support-v4:25.3.1'
    testCompile 'junit:junit:4.12'
}

是否可以使用其他包生成的BR?我错过了我的 gradle 上的任何内容吗?有什么想法吗?

谢谢...

<小时/>

更新

经过调查,我发现我可以在我的主应用程序上使用 BR。

这是应用程序的结构:

- com.testapp.procallapi   //contains all my models
- com.testapp.appbaseui    //contains a common UI
- com.testapp.warehouse    //my main application

现在,com.testapp.appbaseui 包含将用于仓库零售 用户的通用 UI。如果我尝试从通用 ui 模块 appbaseui (com.testapp.appbaseui) 然后我收到错误。

但是,如果我尝试从主应用warehouse(com.testapp.仓库),然后就可以了!

这是怎么回事?任何想法?请帮忙。

<小时/>

更新:添加示例项目

我已经精简并创建了一个示例项目。会有很多未使用的方法,因为我试图尽可能多地删除它们。这是Sample Code .

要复制错误:

1. Simply run the project and you will see the error occurs on appbaseui --> CatListViewAdapter.java (line #94)
2. To make it run, simply disable line #94

Here is the code:
if (propertyId == com.testapp.procallapi.BR.position)  //disable this line to run
{
    reloadCats();
}

最佳答案

您不需要访问项目的 BR 类。生成的 BR 是一个合并类,其中将包含为所有包含的库生成的 ID。

您应该能够从任何包含的项目访问生成的 BR 类。确保库中也启用了数据绑定(bind),并且 BR 包与模块声明的包匹配。 (我记不太清了,但我认为它是在数据绑定(bind)包下生成的)。通过比较您在模块导入语句中使用的包进行验证。

-- 编辑--

您可以从模块所依赖的任何库的 BR 访问任何 ID,但必须从您自己模块的 BR 访问它。您可能会发现 Android Studio 无法识别该 ID(红色下划线表示该 ID),但它会编译。在上面的示例中,更改行:

if (propertyId == com.testapp.procallapi.BR.position)

if (propertyId == BR.position)

关于java - Android 使用另一个包中的 BR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44621407/

相关文章:

java - android 类未找到错误的致命异常

java - 什么是输入流和输出流?我们为什么以及何时使用它们?

android - whereArgs SQLite 数据库删除

android - Google Cloud Translation API 请求缺少有效的 API key

javascript - 数据绑定(bind)在没有功能的情况下不起作用

javascript - Angular Directive(指令)的属性

javascript - 为 EditorFor 提供 ID 属性

java - 使用 Java 泛型确保类型安全

Java 实体类 : How to add/edit items in an entity with joined columns?

java - 路径元素包含条件