findview - kotlinx.android.synthetic problema de estudio de Android no utilizado
kotlin findviewbyid button (7)
Estoy trabajando en un proyecto usando kotlin + Rxjava + MVVM. Durante el desarrollo, el problema es la importación de ID de vista en Fragmento o marcador de vista.
import kotlinx.android.synthetic.main.layout.*
no utilizado con kotlin.
Normalmente, la identificación de vista se debe utilizar desde las importaciones de diseños sintéticos de kotlin, pero se importa directamente desde R.id, eso no debería suceder.
Versión del complemento de Kotlin: org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.40
Mi archivo de 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
}
}
También he intentado construir limpio y reconstruir proyecto.
¿Alguna idea de cómo puedo resolver este problema?
Estoy usando Android Studio 3.1.3 y encontré el mismo problema. kotlin/
resolver esto moviendo todos mis códigos de java/
al directorio kotlin/
dentro de main/
.
app/
|-- src/
| |-- main/
| | |-- java/
| | | |-- com.example.android.app
| | |-- kotlin/ <-- (use this)
| | | |-- com.example.android.app
Luego, agregue el kotlin/
como parte de los conjuntos de fuentes:
app / build.gradle
android {
sourceSets {
main.java.srcDirs += ''src/main/kotlin''
}
}
A veces, todavía se requiere sincronizar y reconstruir el proyecto para importar correctamente el kotlinx.android....
Referencia: Añadir código kotlin
Hay un problema existente (que se asigna) en el rastreador de Google con respecto a las importaciones sintéticas. https://issuetracker.google.com/issues/78547457
He intentado varios enfoques incluyendo las soluciones reportadas en este hilo. También descubrí que muchas personas se enfrentan a este problema molesto como pueden ver here
Sin embargo, la solución más cercana a este problema que me ha funcionado hasta ahora es eliminar el apply plugin: kotlin-android-extensions
de gradle, Sync
gradle plugin y luego volver a agregarlo.
He resuelto problemas similares para las implementaciones de ViewHolder:
Tenemos que heredar la implementación de nuestra clase ViewHolder de LayoutContainer. LayoutContainer es una interfaz disponible en el paquete kotlinx.android.extensions.
Tendrás algún código similar con esto:
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) }
}
}
No sé si esto hizo tropezar a alguien más, pero tuve problemas porque no me di cuenta de que los objetos sintéticos solo están disponibles si estás dentro de una Activity
, un Dialog
o un Fragment
. Si estás en otra clase (como usar el Controller
Conductor ) no tienes suerte.
Para el conductor:
Crea esta clase base.
import android.os.Bundle
import android.view.View
import com.bluelinelabs.conductor.Controller
import com.bluelinelabs.conductor.RestoreViewOnCreateController
abstract class BaseController(
bundle: Bundle? = null
) : RestoreViewOnCreateController(bundle){
init {
addLifecycleListener(object : LifecycleListener() {
override fun postCreateView(controller: Controller, view: View) {
onViewCreated(view)
}
})
}
open fun onViewCreated(view: View) { }
}
Luego en su controlador:
import kotlinx.android.synthetic.main.controller_example.view.*
class ProfileController : BaseController() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedViewState: Bundle?): View {
return inflater.inflate(R.layout.controller_example, container, false)
}
override fun onViewCreated(view: View) {
view.txtName.text = "Example"
}
}
Tengo el mismo problema y trato de resolverlo durante muchos días ...
Un truco que puede hacer es excluir de la importación y finalización <package-name>.R.id.*
Para el alcance del proyecto.
Vaya a Settings/Editor/Auto Import
para agregarlo.
Mejora nuestro problema y si haces esto y limpia el proyecto, funcionará pero no resuelve el problema completamente. Muchas veces las importaciones vuelven a aparecer como importaciones no utilizadas y hay que limpiar el proyecto una y otra vez :-(.
Editado
Además, otra mejora que he logrado es trabajar con include
s en XML. Por ejemplo, si voy a usar el botón "el mismo" en varias pantallas, hago un diseño específico para este botón y lo reutilizo en varias actividades / fragmentos. Puede configurar el ID dentro de este diseño específico y sintetizado lo importará automáticamente sin generar conflictos, ya que tiene la referencia de vista de contenido declarada anteriormente.
Os muestro un ejemplo sencillo:
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 { }
Debo admitir que, en los otros casos , he vuelto a la convención típica húngara que describe la configuración (tamaño) debido a que es demasiado molesto para tratar las importaciones entre actividades / fragmentos / ver todo el tiempo.