Aggiungi Kotlin a un'app esistente

Android Studio offre supporto completo per Kotlin, consentendoti di aggiungere i file Kotlin nel progetto esistente e converti il codice del linguaggio Java in Kotlin. Dopodiché potrai usare tutti gli strumenti di Android Studio con il tuo codice Kotlin, tra cui completamento automatico, controllo lint, refactoring, debug e altro ancora.

Se stai iniziando un nuovo progetto e vuoi utilizzare Kotlin, consulta Crea un progetto.

Per alcuni esempi, dai un'occhiata alla nostra Esempi di codice di Kotlin.

Aggiungi Kotlin a un progetto esistente

Per aggiungere Kotlin al tuo progetto, segui questi passaggi:

  1. Fai clic su File > Nuovo e scegli uno dei vari modelli per Android, ad esempio come un nuovo Frammento vuoto, come mostrato nella Figura 1. Se non vedi l'elenco di modelli in questo menu, apri innanzitutto la finestra Progetto e seleziona dell'app.

    crea un nuovo frammento vuoto
    Figura 1. Scegli tra i modelli disponibili, ad esempio il frammento o attività.
    .
  2. Nella procedura guidata visualizzata, scegli Kotlin come Lingua di origine. La Figura 2 mostra la finestra di dialogo Nuova attività Android quando vuoi crea una nuova attività.

    che ti consente di scegliere Kotlin per la tua lingua di origine
    Figura 2. Una finestra di dialogo Nuova attività Android in cui puoi scegli Kotlin come Lingua di origine.
  3. Continua con la procedura guidata.

In alternativa, puoi fare clic su File > Nuovo > file/classe Kotlin per creare un file Kotlin di base. Se non vedi questa opzione, apri la finestra Progetto e seleziona la directory java. La finestra Nuovo file/classe Kotlin ti consente di definiscono il nome del file e offre diverse opzioni per il tipo di file: File, Class, Interface, Enum Class oppure Object. La scelta che fai determina lo scaffolding di base creato per te nel nuovo file Kotlin. Se scegli Class, Android Studio crea un nuovo file sorgente Kotlin con e una definizione di classe corrispondente. Se scegli Interfaccia, viene eseguita un'interfaccia viene dichiarato nel file e così via.

Se è la prima volta che aggiungi una nuova classe o un nuovo file Kotlin al tuo progetto direttamente (non utilizzando i modelli Android), Android Studio mostra avviso che Kotlin non è configurato nel progetto, come mostrato nella figura 3. Configura Kotlin facendo clic su Configura nell'angolo in alto a destra della pagina. nell'editor o nell'avviso del log eventi che appare nell'angolo in basso a destra.

che ti chiede di configurare Kotlin per il tuo
      progetto
Figura 3. Android Studio mostra una finestra di dialogo di avviso quando Kotlin non è configurata per il tuo progetto.

Scegli l'opzione per configurare Kotlin per Tutti i moduli contenenti Kotlin quando richiesto, come mostrato nella figura 4:

scegli di configurare Kotlin per tutti i moduli che contengono codice Kotlin
Figura 4. Scegli di configurare Kotlin per tutti i moduli che contengono codice Kotlin.

Dopo aver fatto clic su OK, Android Studio aggiunge Kotlin al classpath del progetto e applica il plug-in Kotlin per Android a ogni modulo che contiene file Kotlin. I tuoi file build.gradle dovrebbero avere un aspetto simile agli esempi riportati di seguito:

Alla moda

// 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")
    }
}

Alla moda

// 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")
}

Organizzazione di origine

Per impostazione predefinita, i nuovi file Kotlin vengono salvati in src/main/java/, il che semplifica la procedura per vedere i file Kotlin e Java in un'unica posizione. Se preferisci separare i file Kotlin dai file Java, puoi mettere i file Kotlin in src/main/kotlin/ in alternativa. Se lo fai, dovrai includere anche questo nella directory sourceSets dell'applicazione, come illustrato di seguito:

Alla moda

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

Kotlin

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

Converti il codice Java esistente in codice Kotlin

Per convertire il codice Java in Kotlin, apri il file Java in Android Studio e seleziona Codice > Converti il file Java in un file Kotlin. In alternativa, crea un nuovo Kotlin (File > New > File/Class Kotlin) e incolla il codice Java in quel file. Android Studio mostra una richiesta di conversione del codice a Kotlin, come mostrato nella Figura 5. Fai clic su per convertire. In via facoltativa, Seleziona Non mostrare questa finestra di dialogo la prossima volta per eseguire conversioni future automatica.

scegli di configurare Kotlin per tutti i moduli che contengono codice Kotlin
Figura 5. Android Studio può convertire il codice Java in Kotlin.

Conversione di codice e possibilità di usare i valori null

Il processo di conversione di Android Studio produce un codice Kotlin funzionalmente equivalente che esegue la compilazione e l'esecuzione. Tuttavia, è probabile che tu debba apportare ulteriori ottimizzazioni al codice convertito. Ad esempio, potresti voler perfezionare il modo il codice convertito gestisce i tipi nulli.

In Android, è comune ritardare l'inizializzazione degli oggetti View e di altri componenti finché il frammento o l'attività a cui sono collegati non raggiungono stato del ciclo di vita appropriato. Ad esempio, potresti fare riferimento a una in uno dei frammenti, come illustrato nello snippet seguente:

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) {
                ...
            }
        });
    }
}

Anche se la variabile pulsante può essere impostata come null, in pratica non deve mai essere nullo quando utilizzato in questo esempio. Tuttavia, poiché il suo valore non è assegnato al punto di costruzione, il codice Kotlin generato tratta Button come tipo null e utilizza l'operatore di asserzione "non null" per annullare il wrapping del pulsante quando aggiungi un listener di clic, come mostrato di seguito:

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 { }
    }
}

In questo caso, la conversione è meno ideale rispetto all'utilizzo di lateinit, perché Devi eseguire l'unwrapping del riferimento al pulsante con un'asserzione non null o una chiamata sicura in ogni luogo a cui si accede.

In altri casi, dove null è un'assegnazione di variabile valida in base a al caso d'uso di un'applicazione, utilizzando un operatore di chiamata sicura (?.) con un server elvis in fase di terminazione dell'operatore (?:) può essere un modo più appropriato per null o forzato a un valore predefinito sensibile non null. Android Studio non dispone di informazioni sufficienti per effettuare questa valutazione durante processo di conversione. Sebbene per impostazione predefinita sia l'asserzione non null, devi e modificare il codice convertito in base alle esigenze.

Ulteriori informazioni

Per ulteriori informazioni sull'utilizzo di codice Kotlin e Java nel tuo progetto, vedi Chiamata al codice Java da Kotlin.

Per saperne di più sull'utilizzo di Kotlin in scenari aziendali, consulta Adozione di Kotlin per team di grandi dimensioni.

Per informazioni sui wrapper Kotlin idiomatici per le API Android esistenti, consulta Android KTX.