Aggiungi Kotlin a un'app esistente

Android Studio offre il supporto completo per Kotlin, che consente di aggiungere file Kotlin al progetto esistente e di convertire il codice del linguaggio Java in Kotlin. Puoi quindi utilizzare tutti gli strumenti esistenti di Android Studio con il tuo codice Kotlin, tra cui completamento automatico, controllo dei pelucchi, refactoring, debug e altro ancora.

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

Per gli esempi, dai un'occhiata agli 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 di Android, ad esempio un nuovo Frammento vuoto, come mostrato nella Figura 1. Se non vedi l'elenco dei modelli in questo menu, innanzitutto apri la finestra Progetto e seleziona il modulo dell'app.

    crea un nuovo frammento vuoto
    Figura 1. Scegli uno dei modelli disponibili, ad esempio frammento o attività.
  2. Nella procedura guidata visualizzata, scegli Kotlin per la lingua di origine. La figura 2 mostra la finestra di dialogo Nuova attività Android relativa a quando vuoi creare una nuova attività.

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

In alternativa, puoi fare clic su File > Nuovo > Kotlin File/Class 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 definire il nome del file e offre varie opzioni per il tipo di file: File, Classe 1}, Interfaccia, Classe enum o Oggetto. La scelta che fai determina il ponteggio di base creato per te nel nuovo file Kotlin. Se scegli Classe, Android Studio crea un nuovo file sorgente Kotlin con il nome specificato e una definizione di 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 tuo progetto (non utilizzando i modelli Android), Android Studio visualizza un avviso che indica che Kotlin non è configurato nel progetto, come mostrato in figura 3. Configura Kotlin facendo clic su Configura nell'angolo in alto a destra dell'editor o nell'avviso del log eventi che appare 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 dialogo 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:

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 percorso del progetto e applica il plug-in Android per Kotlin a ogni modulo contenente file Kotlin. Il tuo file build.gradle dovrebbe essere simile agli esempi seguenti:

Scadente

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

Scadente

// 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 visualizzazione dei file Kotlin e Java in un'unica posizione. Se preferisci separare i file Kotlin da quelli Java, puoi invece inserire i file Kotlin in src/main/kotlin/. In questo caso, devi includere questa directory anche nella configurazione di sourceSets, come mostrato di seguito:

Scadente

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 file Java in file Kotlin. In alternativa, crea un nuovo file Kotlin (File > New > Kotlin File/Class) e incolla il codice Java in quel file. Android Studio mostra una richiesta 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 attivare automaticamente le conversioni future.

scegli 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 nullità

Il processo di conversione di Android Studio produce codice Kotlin equivalente dal punto di vista funzionale che compila ed esegue. Tuttavia, è probabile che tu debba apportare ulteriori ottimizzazioni per il codice convertito. Ad esempio, potresti voler perfezionare il modo in cui il codice convertito gestisce i tipi nulli.

In Android, è frequente ritardare l'inizializzazione degli oggetti View e di altri componenti fino al momento in cui il frammento o l'attività a cui sono collegati raggiunge lo stato del ciclo di vita appropriato. Ad esempio, potresti avere un riferimento a un pulsante in uno dei tuoi frammenti, come mostrato nel seguente snippet:

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 è nullo, in questo esempio non dovrebbe mai essere null quando viene utilizzata. Tuttavia, poiché il suo valore non è assegnato al momento della creazione, il codice Kotlin generato considera Button come tipo null e utilizza l'operatore di asserzione non null per annullare il wrapping del pulsante durante l'aggiunta. 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, questa conversione è meno ideale dell'utilizzo di lateinit, in quanto devi decriptare il riferimento del pulsante con un'affermazione che non è null o con un operatore di chiamata sicura in ogni posizione in 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 terminante elvis (?:) potrebbe essere un un modo più appropriato per annullare in modo sicuro l'oggetto nullabile o costringerlo a un valore predefinito ragionevole non null. Android Studio non dispone di informazioni sufficienti per effettuare questa determinazione durante il processo di conversione. Anche se l'impostazione predefinita è l'asserzione non null, devi seguire il follow-up e modificare il codice convertito, se necessario.

Ulteriori informazioni

Per ulteriori informazioni sull'utilizzo del codice Kotlin e di Java nel progetto, consulta la sezione Calling Java code from Kotlin.

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

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