Agrega Kotlin a una app existente

Android Studio ofrece compatibilidad completa con Kotlin, lo que te permite agregar archivos de Kotlin a tu proyecto existente y convertir el código de lenguaje Java en Kotlin. Luego, puedes usar todas las herramientas existentes de Android Studio con tu código Kotlin, como autocompletar, comprobación de lint, refactorización, depuración y mucho más.

Si estás comenzando un proyecto nuevo y quieres usar Kotlin, consulta Cómo crear un proyecto.

Para ver muestras, consulta nuestras muestras de código Kotlin.

Cómo agregar Kotlin a un proyecto existente

Para agregar Kotlin a tu proyecto, haz lo siguiente:

  1. Haz clic en File > New y elige una de las diversas plantillas de Android (por ejemplo, un nuevo Fragment en blanco), como se muestra en la Figura 1. Si no ves la lista de plantillas en este menú, primero abre la ventana Project y selecciona el módulo de tu app.

    cómo crear un nuevo fragmento en blanco
    Figura 1: Elige entre las plantillas disponibles, como fragment o activity
  2. En el asistente que aparece, elige Kotlin para el Source Language. En la Figura 2, se muestra el diálogo New Android Activity para cuando quieras crear una actividad nueva.

    diálogo que te permite elegir Kotlin como lenguaje fuente
    Figura 2: En el diálogo New Android Activity, puedes elegir Kotlin como Source Language
  3. Sigue los pasos que indique el asistente.

Como opción, puedes hacer clic en File > New > Kotlin File/Class para crear un archivo Kotlin básico. Si no ves esa opción, abre la ventana Project y selecciona el directorio Java. La ventana New Kotlin File/Class te permite definir el nombre del archivo y ofrece varias opciones para el tipo de archivo: File, Class, Interface, Enum Class u Object. Tu elección determina la estructura básica creada para ti en el nuevo archivo Kotlin. Si eliges Class, Android Studio creará un nuevo archivo fuente de Kotlin con el nombre otorgado y una definición de clase coincidente. Si eliges Interface, se declara una interfaz en el archivo, y así sucesivamente.

Si es la primera vez que agregas una nueva clase o archivo Kotlin a tu proyecto de forma directa (sin usar las plantillas de Android), Android Studio mostrará la advertencia de que Kotlin no está configurado en el proyecto, como se muestra en la Figura 3. Configura Kotlin haciendo clic en Configure, en la esquina superior derecha del editor, o en la alerta de registro de acontecimientos que aparece como ventana emergente en la esquina inferior derecha.

diálogo de advertencia que te indica que configures Kotlin para tu proyecto
Figura 3: Android Studio muestra un diálogo de advertencia cuando Kotlin no está configurado para tu proyecto

Elige la opción a fin de configurar Kotlin para All modules containing Kotlin files cuando se te solicite, como se muestra en la Figura 4:

elige configurar Kotlin para todos los módulos que contengan código Kotlin
Figura 4: Elige configurar Kotlin para todos los módulos que contengan código de ese lenguaje.

Una vez que hagas clic en OK, Android Studio agregará Kotlin a la ruta de clase de tu proyecto y aplicará el complemento para Android de Kotlin a cada módulo que contenga archivos de este lenguaje. Tus archivos build.gradle deben ser similares a los siguientes ejemplos:

Groovy

// Project build.gradle file.
buildscript {
    ext.kotlin_version = '1.4.10'
    ...
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

Kotlin

// Project build.gradle.kts file.
buildscript {
    extra["kotlin_version"] = "1.4.10"
    ...
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
    }
}

Groovy

// Inside each module using kotlin
plugins {
    ...
    id 'kotlin-android'
}

...

dependencies {
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

Kotlin

// Inside each module using kotlin
plugins {
    ...
    kotlin("android")
}

...

val kotlin_version: String by rootProject.extra

dependencies {
    implementation("androidx.core:core-ktx:1.3.2")
    implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version")
}

Organización de origen

Según la configuración predeterminada, los nuevos archivos Kotlin se guardan en src/main/java/, lo que facilita ver los archivos Kotlin y Java en una ubicación. Si prefieres separar tus archivos Kotlin de los de Java, puedes colocar, en su lugar, los archivos Kotlin en src/main/kotlin/. Si haces eso, también debes incluir ese directorio en la configuración de sourceSets, como se muestra a continuación:

Groovy

android {
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }
}

Kotlin

android {
    sourceSets {
        getByName("main") {
            java.srcDir("src/main/kotlin")
        }
    }
}

Cómo convertir código Java existente en código Kotlin

Para convertir el código Java en Kotlin, abre el archivo Java en Android Studio y selecciona Code > Convert Java File to Kotlin File. Como opción, crea un nuevo archivo Kotlin (File > New > Kotlin File/Class) y, luego, pega el código Java en ese archivo. Luego, Android Studio mostrará un mensaje y te ofrecerá convertir el código a Kotlin, como se muestra en la Figura 5. Haz clic en Yes para convertirlo. De forma opcional, puedes marcar Don't show this dialog next time para que las próximas conversiones sean automáticas.

elige configurar Kotlin para todos los módulos que contengan código Kotlin
Figura 5: Android Studio puede convertir código Java a Kotlin

Conversión de código y nulabilidad

El proceso de conversión de Android Studio produce un código Kotlin equivalente desde un punto de vista funcional que se compila y ejecuta. Sin embargo, es probable que debas realizar optimizaciones adicionales al código convertido (por ejemplo, si quieres definir mejor cómo procesa tipos nulos el código convertido).

En Android, es común retrasar la inicialización de objetos View y otros componentes hasta que el fragmento o la actividad a la que están vinculados alcanza el estado de ciclo de vida apropiado. Por ejemplo, puedes tener una referencia a un botón en uno de los fragmentos, como se demuestra en el siguiente fragmento:

public class JavaFragment extends Fragment {

    // Null until onCreateView.
    private Button button;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_content, container,false);

        // Get a reference to the button in the view, only after the root view is inflated.
        button = root.findViewById(R.id.button);

        return root;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // Not null at this point of time when onViewCreated runs
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ...
            }
        });
    }
}

Aunque la variable del botón es nula, para todos los fines prácticos, nunca debe ser nula cuando se usa en este ejemplo. Sin embargo, ya que no se asigna su valor en el punto de construcción, el código Kotlin generado trata a Button como un tipo nulo y usa el operador de aserción no nulo para desplegar el botón cuando se agrega a un objeto de escucha de clics, como se muestra a continuación:

class JavaFragment : Fragment() {

    // Null until onCreateView.
    private var button: Button? = null

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?): View? {
        ...
        // Get a reference to the button in the view, only after the root view is inflated.
        button = root.findViewById(R.id.button)
        ...
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // Not null at the point of time when onViewCreated fires 
        // but force unwrapped nonetheless
        button!!.setOnClickListener { }
    }
}

Esta conversión no es tan ideal como usar lateinit para este caso, porque te ves obligado a desplegar la referencia del botón con una aserción no nula o un operador de llamada segura en cada lugar desde el que se accede.

En otros casos, en los que null es una asignación variable válida, según el caso práctico de tu aplicación, si se usa un operador de llamada segura (?.) con un operador elvis de finalización (?:), el operador puede ser una forma más apropiada y segura de desplegar el objeto nulo o forzar un valor predeterminado confidencial no nulo. Android Studio no tiene suficiente información para determinar eso durante el proceso de conversión. Si bien eso se predetermina como una aserción no nula, debes hacer un seguimiento y ajustar según sea necesario el código convertido.

Más información

Para obtener más información sobre el uso de código Kotlin y Java en tu proyecto, consulta Cómo llamar a código Java desde Kotlin.

Para obtener más información sobre el uso de Kotlin en ámbitos empresariales, consulta Cómo usar Kotlin en equipos grandes.

Para obtener información sobre los wrappers idiomáticos de Kotlin para las API de Android existentes, consulta Android KTX.