initialize findview extensions android android-studio mvvm kotlin

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



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.