проблема с kotlinx.android.synthetic unused android studio
Я работаю над одним проектом, используя kotlin + Rxjava + MVVM. Во время разработки возникает проблема импорта идентификаторов просмотра в фрагменте или в качестве зрителя.
import kotlinx.android.synthetic.main.layout.*
не использовался с kotlin.
Идентификатор нормального представления должен использоваться из импорта синтетических макетов kotlin, но он напрямую импортирует его из R.id, которого не должно быть.
Версия плагина Kotlin: org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.40
Мой файл градиента:
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:[email protected]'
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 Retrofits 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 Retrofits 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:[email protected]") { 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:[email protected]') {
transitive = true
}
}
Я также попробовал проект чистой сборки и перестроить.
Любая идея, как я могу решить эту проблему?
Ответы
Ответ 1
Я использую Android Studio 3.1.3, и я столкнулся с той же проблемой. Мне удалось решить это, переместив все мои коды из java/
в kotlin/
directory внутри main/
.
app/
|-- src/
| |-- main/
| | |-- java/
| | | |-- com.example.android.app
| | |-- kotlin/ <-- (use this)
| | | |-- com.example.android.app
Затем добавьте kotlin/
как часть исходных множеств:
Приложение /build.gradle
android {
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}
Иногда, по-прежнему требуется синхронизировать и перестроить проект, чтобы правильно импортировать kotlinx.android....
Ссылка: Добавить код kotlin
Ответ 2
Я пробовал несколько подходов, включая решения, сообщаемые в этой теме. Я также узнал, что многие люди сталкиваются с этой неприятной проблемой, как вы можете видеть здесь
Тем не менее, самым близким решением этой проблемы, которое для меня до сих пор работало, является удаление apply plugin: kotlin-android-extensions
из gradle, плагин Sync
gradle, а затем добавьте его снова.
Ответ 3
У меня такая же проблема, и я пытаюсь решить ее слишком много дней...
Один трюк, который вы можете сделать, - это исключить из импорта и завершения <package-name>.R.id.*
Для области проекта.
Перейдите в Settings/Editor/Auto Import
чтобы добавить его.
Это улучшает нашу проблему, и если вы это сделаете и очистите проект, это сработает, но это не решит проблему полностью. Многократно импорт снова появляется как неиспользуемый импорт, и он снова и снова очищает проект :-(.
РЕДАКТИРОВАНИЕ
Кроме того, другое усовершенствование я достиг работает с include
в XML. Например, если я собираюсь использовать "ту же" кнопку на нескольких экранах, я создаю конкретный макет для этой кнопки, и я повторно использую ее для нескольких действий/фрагментов. Вы можете установить идентификатор в этом конкретном макете, а синтез автоматически импортирует его, не создавая конфликтов, из-за того, что вы ранее указывали ссылку на контент.
Я покажу вам простой пример:
activity_main.xml
<!-- ... -->
<include layout="@layout/btn_foo"/>
<!-- ... -->
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"/>
MainActivity.kt
// ...
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.btn_foo.*
// ...
setContentView(R.layout.activity_main)
// ...
btnFoo.setOnClickListener { }
Я должен признать, что в других случаях я вернулся к типичной венгерской конвенции whatWhereDescription (Size), чтобы установить id
из-за чрезмерного раздражения, чтобы иметь дело с импортом между действиями/фрагментами/просматривать все время.
Ответ 4
Существует существующая проблема (которая назначается) в Google tracker относительно синтетического импорта. https://issuetracker.google.com/issues/78547457
Ответ 5
Я не знаю, справилось ли это с кем-то другим, но у меня были проблемы, потому что я не понимал, что синтетические объекты доступны только в том случае, если вы находитесь внутри Activity
, Dialog
или Fragment
. Если вы находитесь в каком-то другом классе (например, с помощью Controller
кондуктора), вам не повезло.
Ответ 6
Я решил аналогичные проблемы для реализации ViewHolder:
Мы должны наследовать реализацию класса ViewHolder из LayoutContainer. LayoutContainer - это интерфейс, доступный в пакете kotlinx.android.extensions.
У вас будет код, похожий на этот:
class TaskVH(override val containerView: View, val itemListener: TasksFragment.TaskItemListener) : RecyclerView.ViewHolder(containerView), LayoutContainer {
fun bindItem(task: Task) {
item_title.text = ""
item_complete.isChecked = task.isCompleted
itemView.setBackgroundResource(rowViewBackground)
itemView.setOnClickListener { itemListener.onTaskClick(task) }
}
}