首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >kotlinx.android.synthetic未使用的android studio问题

kotlinx.android.synthetic未使用的android studio问题
EN

Stack Overflow用户
提问于 2018-04-25 14:32:49
回答 10查看 11K关注 0票数 23

我正在做一个使用kotlin + Rxjava + MVVM的项目。在开发过程中遇到在片段或viewholder中导入视图in的问题。

import kotlinx.android.synthetic.main.layout.*未与kotlin一起使用。

Normaly view id应该从kotlin合成布局导入中使用,但它直接从R.id导入,这是不应该发生的。

Kotlin插件版本:org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.40

我的gradle文件

代码语言:javascript
复制
apply plugin: 'com.android.feature'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'idea'
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 27
    baseFeature true
    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }


    lintOptions {
        abortOnError false
    }
}

dependencies {

    api "com.android.support:design:$rootProject.support_library_version"
    api "com.android.support:appcompat-v7:$rootProject.support_library_version"
    api "com.android.support:recyclerview-v7:$rootProject.support_library_version"
    api "com.android.support:support-dynamic-animation:$rootProject.support_library_version"
    api "com.android.support:cardview-v7:$rootProject.support_library_version"
    api "com.android.support:customtabs:$rootProject.support_library_version"

    api "com.android.support.constraint:constraint-layout:1.1.0-beta5"
    api 'android.arch.lifecycle:extensions:1.1.0'


    api 'androidx.core:core-ktx:0.2'


    api "com.google.dagger:dagger:$rootProject.dagger_version"
    kapt "com.google.dagger:dagger-compiler:$rootProject.dagger_version"

    api "android.arch.persistence.room:runtime:$rootProject.room_version"
    kapt "android.arch.persistence.room:compiler:$rootProject.room_version"
    testImplementation "android.arch.persistence.room:testing:$rootProject.room_version"
    api "android.arch.persistence.room:rxjava2:$rootProject.room_version"
    androidTestImplementation "android.arch.core:core-testing:$rootProject.room_version"
    testImplementation "android.arch.core:core-testing:$rootProject.room_version"

    api "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    api "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"


    api 'com.jakewharton.timber:timber:4.5.1'

    api "com.android.support:multidex:1.0.3"

    api "com.github.bumptech.glide:glide:$rootProject.glide_version"
    api "jp.wasabeef:glide-transformations:$rootProject.glide_transformation_version"
    api 'com.github.bumptech.glide:okhttp3-integration:1.5.0@aar'

    api "io.reactivex.rxjava2:rxandroid:$rootProject.rxAndroid_version"
    api "io.reactivex.rxjava2:rxjava:$rootProject.rxJava_version"
    api "com.google.code.gson:gson:$rootProject.gson_version"

    api("com.squareup.retrofit2:retrofit:$rootProject.retrofit_version") {
        // exclude Retrofit’s OkHttp peer-dependency module and define your own module import
        exclude module: 'okhttp'
    }

    api "com.squareup.okhttp3:okhttp:$rootProject.okhttp_version"
    api "com.squareup.okhttp3:logging-interceptor:$rootProject.okhttp_version"
    api "com.squareup.retrofit2:adapter-rxjava2:$rootProject.retrofit_version"
    api "com.squareup.retrofit2:converter-gson:$rootProject.retrofit_version"

    api 'com.jakewharton.threetenabp:threetenabp:1.0.5'

    api "com.google.firebase:firebase-invites:$rootProject.play_services_version"
    api "com.google.firebase:firebase-core:$rootProject.play_services_version"
    api "com.google.firebase:firebase-config:$rootProject.play_services_version"
    api "com.google.firebase:firebase-perf:$rootProject.play_services_version"
    api "com.google.firebase:firebase-auth:$rootProject.play_services_version"
    api "com.google.firebase:firebase-firestore:$rootProject.play_services_version"



    api("com.firebaseui:firebase-ui-auth:$rootProject.firebase_ui_version") {
        // exclude Retrofit’s OkHttp peer-dependency module and define your own module import
        exclude module: 'play-services-auth'
        exclude module: 'firebase-auth'
    }

    // Required only if Facebook login support is required
    api('com.facebook.android:facebook-android-sdk:4.31.0')

    api "com.google.android.gms:play-services-auth:$rootProject.play_services_version"

    // Required only if Twitter login support is required
    api("com.twitter.sdk.android:twitter-core:3.0.0@aar") { transitive = true }

    api 'com.jakewharton.rxbinding2:rxbinding-kotlin:2.0.0'
    api 'com.jakewharton.rxbinding2:rxbinding-support-v4-kotlin:2.0.0'
    api 'com.jakewharton.rxbinding2:rxbinding-appcompat-v7-kotlin:2.0.0'
    api 'com.jakewharton.rxbinding2:rxbinding-design-kotlin:2.0.0'

    api('com.crashlytics.sdk.android:crashlytics:2.9.1@aar') {
        transitive = true
    }
}

我也尝试过干净的构建和重建项目。

你知道我如何解决这个问题吗?

EN

回答 10

Stack Overflow用户

发布于 2018-06-11 05:58:33

我已经尝试了几种方法,包括本文中报告的解决方案。我还发现很多人都面临着这个恼人的问题,正如你所看到的here

然而,到目前为止,对这个问题最有效的解决方案是从gradle,Sync gradle插件中删除apply plugin: kotlin-android-extensions,然后重新添加它。

票数 7
EN

Stack Overflow用户

发布于 2018-06-24 20:32:33

我使用的是Android Studio 3.1.3,我遇到了同样的问题。我设法解决了这个问题,将我所有的代码从java/移到了main/中的kotlin/目录。

代码语言:javascript
复制
app/
 |-- src/
 |    |-- main/
 |    |    |-- java/
 |    |    |     |-- com.example.android.app
 |    |    |-- kotlin/  <-- (use this)
 |    |    |     |-- com.example.android.app

然后,将kotlin/添加为源集的一部分:

app/build.gradle

代码语言:javascript
复制
android {
   sourceSets {
       main.java.srcDirs += 'src/main/kotlin'
   }
}

有时,仍需要同步并重新生成项目才能正确导入kotlinx.android....

参考:Add kotlin code

票数 7
EN

Stack Overflow用户

发布于 2018-04-30 22:30:30

我也有同样的问题,我花了太多的时间来解决它……

您可以做的一个技巧是从项目范围的导入和完成 <package-name>.R.id.*中排除。

转到Settings/Editor/Auto Import添加它。

它改善了我们的问题,如果您这样做并清理项目,它将工作,但它不能完全解决问题。很多时候,导入会以unused 的形式重新出现,并且需要反复清理项目:-(.

编辑的

另外,我实现的另一个改进是在XML上使用include。例如,如果我要在几个屏幕中使用“同一”按钮,我会为这个按钮做一个特定的布局,并在几个活动/片段上重用它。您可以在此特定布局中设置id,由于您之前声明了内容视图引用,因此合成将自动导入它,而不会产生冲突。

我给你看一个简单的例子:

activity_main.xml

代码语言:javascript
复制
<!-- ... -->

<include layout="@layout/btn_foo"/>

<!-- ... -->

btn_foo.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<Button
    android:id="@+id/btnFoo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android"/>

MainActivity.kt

代码语言:javascript
复制
// ...

import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.btn_foo.*

// ...

setContentView(R.layout.activity_main)

// ...

btnFoo.setOnClickListener { }

我必须承认,在其他情况下,我已经返回到,这是典型的匈牙利约定whatWhereDescription(Size)来设置id,因为处理活动/片段/视图之间的导入太麻烦了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50015465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档