Aggiungi Kotlin a un'app esistente

Android Studio offre il supporto completo per Kotlin, consentendoti di aggiungere file Kotlin al progetto esistente e di convertire il codice del linguaggio Java in Kotlin. Puoi quindi usare con il codice Kotlin tutti gli strumenti di Android Studio, inclusi il completamento automatico, il controllo lint, il refactoring, il debug e altro ancora.

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

Per vedere alcuni esempi, consulta i nostri esempi di codice Kotlin.

Aggiungi Kotlin a un progetto esistente

Per aggiungere Kotlin al tuo progetto:

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

    crea un nuovo frammento vuoto
    Figura 1. Scegli tra i modelli disponibili, ad esempio 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 per quando vuoi creare una nuova attività.

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

In alternativa, puoi fare clic su File > Nuovo > File/Classe Kotlin per creare un file Kotlin di base. Se questa opzione non viene visualizzata, apri la finestra Progetto e seleziona la directory java. La finestra Nuovo file/classe Kotlin consente di definire il nome del file e fornisce diverse opzioni per il tipo di file: File, Class, Interface, Enum Class o Object. La scelta che farai determina lo scaffolding di base creato per te nel nuovo file Kotlin. Se scegli Class, Android Studio crea un nuovo file di origine Kotlin con il nome specificato e una definizione della classe corrispondente. Se scegli Interfaccia, nel file viene dichiarata un'interfaccia e così via.

Se è la prima volta che aggiungi direttamente una nuova classe o un nuovo file Kotlin al progetto (senza utilizzare i modelli Android), Android Studio mostra un avviso che ti informa che Kotlin non è configurato nel progetto, come mostrato nella Figura 3. Configura Kotlin facendo clic su Configura nell'angolo in alto a destra dell'editor o nell'avviso del log eventi che viene visualizzato nell'angolo in basso a destra.

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

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

scegliere 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 Android Kotlin a ogni modulo contenente file Kotlin. I file build.gradle dovrebbero avere un aspetto simile ai seguenti esempi:

Trendy

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

Trendy

// 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 di Kotlin vengono salvati in src/main/java/, il che consente di visualizzare facilmente sia i file Kotlin che Java in un'unica posizione. Se preferisci separare i file Kotlin dai file Java, puoi inserire i file Kotlin in src/main/kotlin/. Se lo fai, devi anche includere questa directory nella configurazione di sourceSets, come mostrato di seguito:

Trendy

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 file Kotlin. In alternativa, crea un nuovo file Kotlin (File > Nuovo > File/Classe Kotlin) e incolla il codice Java al suo interno. Android Studio mostra un messaggio e propone di convertire il codice in Kotlin, come mostrato nella figura 5. Fai clic su per convertire. Se vuoi, puoi selezionare Non mostrare questa finestra di dialogo la prossima volta per rendere automatiche le conversioni future.

scegliere di configurare Kotlin per tutti i moduli che contengono codice Kotlin
Figura 5. Android Studio è in grado di convertire il codice Java in Kotlin.

Conversione del codice e possibilità di valori null

Il processo di conversione di Android Studio produce codice Kotlin equivalente a livello funzionale che viene compilato ed eseguito. Tuttavia, è probabile che tu debba apportare ulteriori ottimizzazioni al codice convertito. Ad esempio, potresti voler perfezionare il modo in cui il codice convertito gestisce i tipi di valori null.

In Android, è comune ritardare l'inizializzazione degli oggetti View e di altri componenti finché il frammento o l'attività a cui sono associati non raggiunge lo stato appropriato del ciclo di vita. Ad esempio, potresti avere un riferimento a un pulsante in uno dei tuoi frammenti, come mostrato 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 del pulsante può essere null, per scopi pratici non dovrebbe mai essere nulla se utilizzata in questo esempio. Tuttavia, poiché il suo valore non è assegnato al momento della creazione, il codice Kotlin generato considera Button come un tipo con valore null e utilizza l'operatore di asserzione non null per annullare il wrapping del pulsante quando si aggiunge 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 { }
    }
}

Questa conversione non è l'ideale rispetto all'utilizzo di lateinit in questo caso, perché devi annullare il wrapping del riferimento del pulsante con un'asserzione o un operatore di chiamata sicura non null in ogni posizione a cui si accede.

In altri casi, dove null è un'assegnazione di variabile valida in base al caso d'uso della tua applicazione, l'utilizzo di un operatore di chiamata sicura (?.) con un operatore Elvis Operator (?:) terminante potrebbe essere un modo più appropriato per decodificare in sicurezza l'oggetto nullo o forzare a un valore predefinito non nullo sensibile. Android Studio non dispone di informazioni sufficienti per effettuare questa valutazione durante il processo di conversione. Anche se il valore predefinito è l'asserzione "non-null", devi seguire e modificare il codice convertito in base alle esigenze.

Altre informazioni

Per ulteriori informazioni sull'utilizzo del codice Kotlin e Java nel progetto, consulta Chiamata del codice Java da Kotlin.

Per ulteriori informazioni sull'utilizzo di Kotlin in scenari aziendali, consulta Adottare Kotlin per i team di grandi dimensioni.

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