Android Studio找不到从布局生成的kotlinx模块

时间:2018-07-03 14:01:40

标签: android android-studio kotlin android-gradle kotlin-android-extensions

我正在使用标准的Kotlin Android扩展程序来引用在View中使用类型化ID在布局XML中定义的kotlinx.android.synthetic.main.activity_main。我可以从Android Studio和CLI编译我的项目,因此这些引用似乎可以正确解析。但是,在Android Studio中,导入语句显示为未解析,因此没有任何类型的ID起作用。

我的build.gradle如下:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-platform-android'
apply plugin: 'kotlin-android-extensions'

buildscript {
    ext.kotlin_version = '1.2.50'

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

androidExtensions {
    experimental = true
}

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 2
        versionName "0.3.0"
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation "org.jetbrains.anko:anko-sdk15:0.8.3"
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.android.support:support-vector-drawable:27.1.1'
    implementation 'org.apache.commons:commons-io:1.3.2'
    expectedBy project(':engine')
    implementation project(':dialogue')
    implementation 'com.android.support:cardview-v7:27.1.1'
    implementation 'com.github.daniel-stoneuk:material-about-library:2.3.0'
}

2 个答案:

答案 0 :(得分:1)

请将以下代码添加到 build.gradle 的应用插件中:

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
}

答案 1 :(得分:0)

我能够解决此问题,方法是制作一个单独的Android库模块,仅使用特定于平台的位(并且重要的是,不使用kotlinx),然后将其导入到主应用程序模块中。这意味着主应用程序模块不再需要使用kotlin-platform-android,而可以只是kotlin-android

因此,总而言之,在包含平台特定位的模块中:

apply plugin: 'com.android.library'
apply plugin: 'kotlin-platform-android'

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    expectedBy project(':engine')
}

并在主模块中:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions {
        freeCompilerArgs = ["-Xmulti-platform"]
    }
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation project(':engine-android')
}

请注意,我们仍然需要将-Xmulti-platform传递给Kotlin编译器才能链接到:engine-android;但是我们使用的是香草kotlin-android插件,似乎可以与kotlin-android-extensions配合使用。