Cómo kotlin hace que setOnClickListener acepte funciones como parámetro
En kotlin, podemos usar setOnClickListener()
así:
view.setOnClickListener { println("Hello") }
Pero si defino mi propia interfaz, sólo puedo pasar un objeto anónimo como este:
- ¿Hay una sobrecarga para escribir una biblioteca en Kotlin para Android?
- ¿Cómo acceder a "Activity.this" en Kotlin?
- No se puede usar el valor argb color int en Kotlin?
- Convertir el proyecto de Android para utilizar Gradle Script Kotlin
- Android: Kotlin con Butterknife
obj.setMyListener(object: MyListener() { ... })
Me pregunto cómo hacen setOnClickListener()
aceptar una función en lugar de un objeto anónimo.
- Error al ejecutar el proyecto de Android (escrito en Kotlin) compilado con el complemento Gradle2.0.0-alpha
- Android Kotlin: java.lang.NoClassDefFoundError: Resolución fallida de: <KotlinObject>
- ¿Cuál es la mejor manera de declarar en el componente de la interfaz de usuario en android con Kotlin?
- Kotlin es más difícil de realizar ingeniería inversa que java
- Controles de pelusa de Kotlin y android
- Kotlin - La forma más idiomática de convertir una lista a una MutableList
- Kotlin.TypeCastException: null no se puede convertir en tipo no null com.midsizemango.databasekotlin.Note
- Dagger 2 Named no se puede proporcionar sin un método @Provides
De acuerdo con las documentaciones de Kotlin sobre interoperabilidad Java , para una interfaz funcional definida en Java, puede utilizar una conversión SAM.
Al igual que Java 8, Kotlin soporta las conversiones SAM. Esto significa que los literales de función de Kotlin pueden convertirse automáticamente en implementaciones de interfaces Java con un solo método no predeterminado, siempre y cuando los tipos de parámetros del método de interfaz coincidan con los tipos de parámetros de la función Kotlin.
val runnable = Runnable { println("This runs in a runnable") } val executor = ThreadPoolExecutor() // Java signature: void execute(Runnable command) executor.execute { println("This runs in a thread pool") }
Sin embargo, Kotlin tiene tipos funcionales, por lo tanto, la conversión SAM no funciona para las interfaces definidas en Kotlin:
También tenga en cuenta que esta función sólo funciona para Java interop; Ya que Kotlin tiene tipos de funciones adecuadas, la conversión automática de funciones en implementaciones de interfaces Kotlin es innecesaria y, por lo tanto, no es compatible.
Soluciones posibles:
- Defina la interfaz en Java. Útil si se trata de una biblioteca / código que puede utilizarse desde un código Java.
-
Haga que el método reciba una función como argumento:
// Example listener receives a bool and return unit. fun setMyListener(listener: (isChecked: Bool) -> Unit) { ... } // Usage: obj.setMyListener { isChecked -> }
-
Usar alias de tipo (sólo admitido en Kotlin 1.1+):
typealias MyListener = (Bool) -> Unit fun setMyListener(listener: MyListener) { ... }
- Desplazamiento vertical de la línea de texto en Android
- SimpleDateFormat error de zona horaria en Android