Dev*_*esh 19 android mvvm kotlin android-studio
我正在使用kotlin + Rxjava + MVVM工作一个项目.在开发过程中面临在Fragment或viewholder中导入视图ID的问题.
import kotlinx.android.synthetic.main.layout.* 未使用kotlin.
Normaly view id应该从kotlin合成布局导入中使用,但它直接从R.id导入它不应该发生.
Kotlin插件版本: org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.40
我的gradle文件:
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
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过clean build和Rebuild项目.
知道如何解决这个问题?
我正在使用Android Studio 3.1.3,我遇到了同样的问题.我设法通过将所有代码从内部移动java/到kotlin/目录来解决这个问题main/.
app/
|-- src/
| |-- main/
| | |-- java/
| | | |-- com.example.android.app
| | |-- kotlin/ <-- (use this)
| | | |-- com.example.android.app
Run Code Online (Sandbox Code Playgroud)
然后,添加kotlin/源集的一部分:
应用程序/的build.gradle
android {
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}
Run Code Online (Sandbox Code Playgroud)
有时,它仍然需要同步和重建项目才能正确导入 kotlinx.android....
参考:添加kotlin代码
我有同样的问题,我已经尝试解决它很多天了......
您可以做的一个技巧是从项目范围的导入和完成中排除 <package-name>.R.id.*。
前往Settings/Editor/Auto Import添加它。
它改善了我们的问题,如果您这样做并清理项目,它会起作用,但不能完全解决问题。很多时候,导入会重新显示为未使用的导入,并且需要一遍又一遍地清理项目:-(。
编辑
另外,我实现的另一项改进是在 XML 上使用includes。例如,如果我要在多个屏幕中使用“相同”按钮,我会为该按钮制作特定的布局,并在多个活动/片段上重复使用它。您可以在此特定布局中设置 id,并且合成将自动导入它而不会产生冲突,因为您之前已声明了内容视图引用。
我给你看一个简单的例子:
活动主文件
<!-- ... -->
<include layout="@layout/btn_foo"/>
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)
btn_foo.xml
<?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"/>
Run Code Online (Sandbox Code Playgroud)
MainActivity.kt
// ...
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.btn_foo.*
// ...
setContentView(R.layout.activity_main)
// ...
btnFoo.setOnClickListener { }
Run Code Online (Sandbox Code Playgroud)
我必须承认,在其他情况下,我已经回到了典型的匈牙利约定WhatWhereDescription(Size)来设置ids,因为始终处理活动/片段/视图之间的导入太烦人了。
| 归档时间: |
|
| 查看次数: |
6223 次 |
| 最近记录: |