4

J'ai un module d'application, disons "Test". Le module "Test" dépend d'un sous-module B. Les deux activent la liaison de données. Dans le module de bibliothèque B, je crée une activité simple en utilisant la liaison de données, son but est la réutilisation, par exemple: Je peux créer un écran de connexion de base et l'utiliser dans de nombreuses applications plus tard. Ci-dessous un exemple de code dans le paquet B.Liaison de données Android dans le sous-module

package com.test.packageb 

     open class MainActivity : AppCompatActivity() { 

     lateinit var binding : ActivityMainBinding 

     override fun onCreate(savedInstanceState: Bundle?) { 
      super.onCreate(savedInstanceState) 
      binding = DataBindingUtil.setContentView(this, R.layout.activity_main) 
     } 
    } 

puis dans le module « Test », je peux tout simplement hériter classe MainActivity à faire personnaliser les choses, comme ceci:

class MainActivity1 : MainActivity(){ 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
    } 

    fun doSomething(){ 
     binding.rootLayout.setBackgroundResource(R.color.colorPrimary) 
    } 
} 

Cependant, lorsque je tente pour exécuter l'application "Test", j'ai eu cette erreur

Error:(17, 9) Cannot access class 'com.test.packageb.databinding.ActivityMainBinding'. Check your module classpath for missing or conflicting dependencies
Error:(17, 17) Unresolved reference: rootLayout

Qu'est-ce que j'ai manqué? Y a-t-il autre chose à mettre en œuvre?

Test app build.gradle

apply plugin: 'com.android.application' 

apply plugin: 'kotlin-android' 
apply plugin: 'kotlin-kapt' 
apply plugin: 'kotlin-android-extensions' 

android { 
    compileSdkVersion 26 
    buildToolsVersion "26.0.1" 
    defaultConfig { 
     applicationId "com.test.testapplication" 
     minSdkVersion 15 
     targetSdkVersion 26 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 

    dataBinding{ 
     enabled true 
    } 

    buildTypes { 
     debug { 

     } 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    kapt 'com.android.databinding:compiler:3.0.0-beta4' 
    implementation fileTree(include: ['*.jar'], dir: 'libs') 
    implementation 'com.android.support:appcompat-v7:26.0.2' 
    implementation 'com.android.support.constraint:constraint-layout:1.0.2' 
    testImplementation 'junit:junit:4.12' 
    androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 
    implementation project(':packageb') 
} 

Forfait B build.gradle

apply plugin: 'com.android.library' 
apply plugin: 'kotlin-android' 
apply plugin: 'kotlin-android-extensions' 
apply plugin: 'kotlin-kapt' 
android { 
    compileSdkVersion 26 
    buildToolsVersion "26.0.1" 


    defaultConfig { 
     minSdkVersion 15 
     targetSdkVersion 26 
     versionCode 1 
     versionName "1.0" 

     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

    } 
    dataBinding{ 
     enabled true 
    } 
    buildTypes { 
     debug { 
      minifyEnabled false 
     } 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

} 

dependencies { 
    kapt 'com.android.databinding:compiler:3.0.0-beta4' 
    implementation fileTree(dir: 'libs', include: ['*.jar']) 
    implementation 'com.android.support:appcompat-v7:26.0.2' 
    implementation 'com.android.support.constraint:constraint-layout:1.0.2' 
    testImplementation 'junit:junit:4.12' 
    androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 
} 
+0

vous mettre du code graduel pour l'aide à voir. –

+0

@KuLdipPaTel: J'ai ajouté des fichiers gradle des deux modules. Merci. – jeytoe

+0

https://blog.mindorks.com/implementation-vs-api-in-gradle-3-0-494c817a6fa vérifier le lien –

Répondre

0

Je ne sais pas si la question est pertinente pour vous, mais je suis parvenu à trouver une sorte de Solution.

Pour le faire fonctionner la classe de base devrait avoir générique

class A<BINDING extends ViewDataBinding> { 
    protected ABinding binding; 

    void init(){ 
     binding = (ABinding) DataBindingUtil.setContentView(this, R.layout.a); 
    } 
} 

et passer la même liaison à la classe des enfants de la sous-module

class B<ABinding> { 
    // you can use instance in this class 
} 

Le principal problème ici que vous ne pouvez pas changer radicalement l'interface utilisateur, uniquement masquer les éléments existants ou ajouter de nouveaux à l'exécution. Mais je suppose que dans ce cas, créer plus facilement une classe totalement nouvelle.