Kotlin einer vorhandenen App hinzufügen

Android Studio bietet vollständige Unterstützung für Kotlin, sodass Sie Kotlin-Dateien zu Ihrem bestehenden Projekt hinzufügen und Java-Sprachcode in Kotlin umwandeln können. Anschließend können Sie alle vorhandenen Tools von Android Studio mit Ihrem Kotlin-Code verwenden, einschließlich automatischer Vervollständigung, Lint-Prüfung, Refaktorierung, Fehlerbehebung und mehr.

Wenn Sie ein neues Projekt starten und Kotlin verwenden möchten, lesen Sie Projekt erstellen.

Kotlin-Codebeispiele

Kotlin einem vorhandenen Projekt hinzufügen

So fügen Sie Ihrem Projekt Kotlin hinzu:

  1. Klicken Sie auf File > New (Datei > Neu) und wählen Sie eine der verschiedenen Android-Vorlagen aus, z. B. ein neues leeres Fragment (siehe Abbildung 1). Wenn Sie in diesem Menü keine Vorlagenliste sehen, öffnen Sie zuerst das Fenster Projekt und wählen Sie Ihr Anwendungsmodul aus.

    neues leeres Fragment erstellen
    Abbildung 1. Wählen Sie eine der verfügbaren Vorlagen aus, z. B. „Fragment“ oder „Aktivität“.
  2. Wählen Sie im angezeigten Assistenten Kotlin als Quellsprache aus. Abbildung 2 zeigt das Dialogfeld Neue Android-Aktivität für das Erstellen einer neuen Aktivität.

    Dialogfeld, in dem Sie Kotlin als Ausgangssprache auswählen können
    Abbildung 2. Das Dialogfeld Neue Android-Aktivität, in dem Sie Kotlin als Quellsprache auswählen können.
  3. Folgen Sie dem Assistenten.

Alternativ können Sie auf Datei > Neu > Kotlin-Datei/-Klasse klicken, um eine einfache Kotlin-Datei zu erstellen. Wenn diese Option nicht angezeigt wird, öffnen Sie das Fenster Project und wählen Sie das Verzeichnis java aus. Im Fenster Neue Kotlin-Datei/-Klasse können Sie den Dateinamen definieren und verschiedene Optionen für den Dateityp auswählen: Datei, Klasse, Schnittstelle, Enum-Klasse oder Objekt. Ihre Auswahl bestimmt das grundlegende Gerüst, das für Sie in der neuen Kotlin-Datei erstellt wird. Wenn Sie Klasse auswählen, erstellt Android Studio eine neue Kotlin-Quelldatei mit dem angegebenen Namen und einer passenden Klassendefinition. Wenn Sie Schnittstelle auswählen, wird eine Schnittstelle in der Datei deklariert usw.

Wenn Sie Ihrem Projekt zum ersten Mal eine neue Kotlin-Klasse oder -Datei direkt hinzufügen (ohne Android-Vorlagen), zeigt Android Studio eine Warnung an, dass Kotlin im Projekt nicht konfiguriert ist (siehe Abbildung 3). Sie können Kotlin konfigurieren, indem Sie entweder rechts oben im Editor oder in der Ereignisprotokollbenachrichtigung unten rechts auf Konfigurieren klicken.

Warndialogfeld, das Sie auffordert, Kotlin für Ihr Projekt zu konfigurieren
Abbildung 3. In Android Studio wird eine Warnung angezeigt, wenn Kotlin nicht für Ihr Projekt konfiguriert ist.

Wählen Sie die Option zum Konfigurieren von Kotlin für Alle Module mit Kotlin-Dateien aus, wenn Sie dazu aufgefordert werden, wie in Abbildung 4 gezeigt:

Kotlin-Code für alle Module konfigurieren, die Kotlin-Code enthalten
Abbildung 4. Sie können Kotlin für alle Module konfigurieren, die Kotlin-Code enthalten.

Wenn Sie auf OK klicken, wird Kotlin in Android Studio dem Projektklassenpfad hinzugefügt und das Kotlin-Android-Plug-in auf jedes Modul angewendet, das Kotlin-Dateien enthält. Ihre build.gradle-Dateien sollten in etwa so aussehen:

Groovig

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

Groovig

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

Quellorganisation

Neue Kotlin-Dateien werden standardmäßig in src/main/java/ gespeichert, damit Kotlin- und Java-Dateien ganz einfach an einem Ort angezeigt werden können. Wenn Sie Kotlin-Dateien lieber von Ihren Java-Dateien trennen möchten, können Sie sie stattdessen unter src/main/kotlin/ ablegen. In diesem Fall müssen Sie dieses Verzeichnis auch in Ihre sourceSets-Konfiguration aufnehmen, wie unten gezeigt:

Groovig

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

Kotlin

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

Vorhandenen Java-Code in Kotlin-Code konvertieren

Wenn du Java-Code in Kotlin konvertieren möchtest, öffne die Java-Datei in Android Studio und wähle Code > Java-Datei in Kotlin-Datei konvertieren aus. Alternativ können Sie eine neue Kotlin-Datei erstellen (Datei > Neu > Kotlin-Datei/-Klasse) und dann den Java-Code in diese Datei einfügen. Android Studio zeigt dann eine Aufforderung an und bietet an, den Code in Kotlin zu konvertieren (siehe Abbildung 5). Klicken Sie zum Umwandeln auf Ja. Wenn Sie Dieses Dialogfeld beim nächsten Mal nicht anzeigen aktivieren, werden zukünftige Conversions automatisch ausgeführt.

Kotlin-Code für alle Module konfigurieren, die Kotlin-Code enthalten
Abbildung 5. Mit Android Studio kann Java-Code in Kotlin konvertiert werden.

Codekonvertierung und Null-Zulässigkeit

Der Konvertierungsprozess von Android Studio erzeugt funktional gleichwertigen Kotlin-Code, der kompiliert und ausgeführt wird. Wahrscheinlich müssen Sie jedoch weitere Optimierungen am konvertierten Code vornehmen. Sie können beispielsweise optimieren, wie der konvertierte Code Typen verarbeitet, für die Nullwerte zulässig sind.

In Android wird die Initialisierung von View-Objekten und anderen Komponenten häufig verzögert, bis das Fragment oder die Aktivität, dem sie zugeordnet sind, den entsprechenden Lebenszyklusstatus erreicht. Sie haben beispielsweise einen Verweis auf eine Schaltfläche in einem Ihrer Fragmente, wie im folgenden Snippet gezeigt:

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

Auch wenn für die Schaltflächenvariable Nullwerte zulässig sind, sollte sie in diesem Beispiel aus praktischen Gründen nie null sein. Da der Wert zum Zeitpunkt der Erstellung jedoch nicht zugewiesen wird, behandelt der generierte Kotlin-Code Button als Typ mit Null-Zulässigkeit und verwendet den Nicht-Null-Assertion-Operator zum Entpacken der Schaltfläche beim Hinzufügen eines Klick-Listeners, wie unten gezeigt:

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

Diese Konvertierung ist in diesem Fall weniger ideal als lateinit, da Sie dazu gezwungen werden, die Schaltflächenreferenz an jedem Ort, auf den zugegriffen wird, mit einer Nicht-Null-Assertion oder einem Safe-Call-Operator zu entpacken.

In anderen Fällen, in denen null eine gültige Variablenzuweisung basierend auf dem Anwendungsfall Ihrer Anwendung ist, kann die Verwendung eines Safe-Call-Operators (?.) mit einem abschließenden Elvis-Operator (?:) eine geeignetere Möglichkeit sein, um das Objekt, das Nullwerte zulässt, sicher zu entpacken oder in einen sinnvollen Standardwert, der nicht null ist, zu entpacken. Android Studio verfügt nicht über genügend Informationen, um dies während des Konvertierungsprozesses zu ermitteln. Auch wenn standardmäßig die Nicht-Null-Assertion verwendet wird, sollten Sie den konvertierten Code nach Bedarf anpassen.

Weitere Informationen

Weitere Informationen zur Verwendung von Kotlin- und Java-Code in Ihrem Projekt finden Sie unter Java-Code aus Kotlin aufrufen.

Weitere Informationen zur Verwendung von Kotlin in Unternehmensszenarien finden Sie unter Kotlin für große Teams einführen.

Informationen zu idiomatischen Kotlin-Wrappern für vorhandene Android APIs finden Sie unter Android KTX.