Dodawanie Kotlin do istniejącej aplikacji

Android Studio w pełni obsługuje Kotlin, umożliwiając dodawanie plików Kotlin do istniejącego projektu i konwertowanie kodu języka Java na Kotlin. Gdy to zrobisz, możesz używać w swoim kodzie Kotlin wszystkich narzędzi Android Studio, w tym autouzupełniania, sprawdzania lintacji, refaktoryzacji, debugowania i innych.

Jeśli zaczynasz nowy projekt i chcesz korzystać z Kotlin, przeczytaj sekcję Tworzenie projektu.

Przykłady znajdziesz w przykładach kodu Kotlin.

Dodawanie Kotlin do istniejącego projektu

Aby dodać Kotlin do projektu:

  1. Kliknij Plik > Nowy i wybierz jeden z różnych szablonów dla Androida, np. nowy pusty Fragment, jak widać na rysunku 1. Jeśli nie widzisz listy szablonów w tym menu, otwórz okno Projekt i wybierz moduł aplikacji.

    utwórz nowy pusty fragment
    Rysunek 1. Wybierz jeden z dostępnych szablonów, np. fragment lub działanie.
  2. W wyświetlonym kreatorze wybierz Kotlin jako Język źródłowy. Rysunek 2 przedstawia okno Nowa aktywność na Androidzie, które służy do tworzenia nowej aktywności.

    okno dialogowe umożliwiające wybór języka Kotlin jako języka źródłowego.
    Rysunek 2. Okno Nowa aktywność na Androidzie, w którym możesz wybrać Kotlin jako język źródłowy.
  3. Kontynuuj korzystanie z kreatora.

Możesz też kliknąć Plik > Nowy > Plik/klasa Kotlin, aby utworzyć podstawowy plik Kotlin. Jeśli nie widzisz tej opcji, otwórz okno Projekt i wybierz katalog java. Okno Nowy plik/klasa Kotlin pozwala zdefiniować nazwę pliku i oferuje kilka opcji typu pliku: File, Class, Interface, Enum Class i Object. Twój wybór wpłynie na podstawowe rusztowanie utworzone dla Ciebie w nowym pliku Kotlin. Jeśli wybierzesz Class, Android Studio utworzy nowy plik źródłowy Kotlin o podanej nazwie i pasującej definicji klasy. Jeśli wybierzesz Interface, interfejs zostanie zadeklarowany w pliku itd.

Jeśli po raz pierwszy dodajesz nową klasę lub plik Kotlin bezpośrednio do projektu (bez użycia szablonów Androida), Android Studio wyświetli ostrzeżenie, że w projekcie nie skonfigurowano Kotlin, jak widać na rysunku 3. Aby skonfigurować Kotlin, kliknij Skonfiguruj w prawym górnym rogu edytora lub w alercie logu zdarzeń, który pojawia się w prawym dolnym rogu.

okno z ostrzeżeniem z prośbą o skonfigurowanie Kotlin w projekcie
Rysunek 3. Jeśli Kotlin nie jest skonfigurowany w Twoim projekcie, Android Studio wyświetla okno z ostrzeżeniem.

Wybierz opcję, aby skonfigurować Kotlin dla wszystkich modułów zawierających pliki Kotlin, jak pokazano na rysunku 4:

wybierz skonfigurowanie usługi Kotlin dla wszystkich modułów zawierających kod Kotlin
Rysunek 4. Wybierz, aby skonfigurować Kotlin dla wszystkich modułów zawierających kod Kotlin.

Gdy klikniesz OK, Android Studio doda Kotlin do ścieżki klasy projektu i zastosuje wtyczkę Kotlin Android do każdego modułu, który zawiera pliki Kotlin. Pliki build.gradle powinny wyglądać podobnie do tych poniżej:

Odlotowy

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

Odlotowy

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

Organizacja źródłowa

Nowe pliki Kotlin są domyślnie zapisywane w usłudze src/main/java/, dzięki czemu można łatwo wyświetlać pliki Kotlin i Javy w jednym miejscu. Jeśli chcesz oddzielić pliki Kotlin od plików Java, możesz umieścić pliki Kotlin pod nagłówkiem src/main/kotlin/. Jeśli to zrobisz, musisz też uwzględnić ten katalog w konfiguracji sourceSets, jak w tym przykładzie:

Odlotowy

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

Kotlin

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

Przekonwertuj istniejący kod Java na kod Kotlin

Aby przekonwertować kod Java na Kotlin, otwórz plik Java w Android Studio i wybierz Kod > Konwertuj plik Java na plik Kotlin. Możesz też utworzyć nowy plik Kotlin (Plik > Nowy > Plik/klasa Kotlin), a następnie wkleić do niego swój kod Java. Android Studio wyświetli prośbę i proponuje przekonwertowanie kodu na kod Kotlin, jak widać na ilustracji 5. Kliknij Tak, aby dokonać konwersji. Opcjonalnie możesz zaznaczyć pole Nie pokazuj tego okna następnym razem, dzięki czemu kolejne konwersje będą automatyczne.

wybierz skonfigurowanie usługi Kotlin dla wszystkich modułów zawierających kod Kotlin
Rysunek 5. Android Studio potrafi przekonwertować kod Java na Kotlin.

Konwersja kodu i dopuszczalność wartości null

Proces konwersji w Android Studio generuje równoważny funkcjonalnie kod Kotlin, który kompiluje i uruchamia. Możliwe jednak, że trzeba będzie wprowadzić dodatkowe zoptymalizacje przekonwertowanego kodu. Możesz na przykład doprecyzować, jak przekonwertowany kod obsługuje typy z wartością null.

Na Androidzie często opóźnia inicjowanie obiektów View i innych komponentów do momentu, aż fragment lub aktywność, do których są dołączone, osiągnie odpowiedni stan cyklu życia. Możesz np. mieć odniesienie do przycisku w jednym z tych fragmentów, tak jak w tym fragmencie:

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

Mimo że zmienna przycisku może mieć wartość null, do wszystkich praktycznych celów nie powinna mieć wartości null w tym przykładzie. Ponieważ jednak jego wartość nie jest przypisywana w punkcie konstrukcji, wygenerowany kod Kotlin traktuje Button jako typ z wartością null i używa niepustego operatora asercji do wyodrębnienia przycisku podczas dodawania detektora kliknięć, jak pokazano poniżej:

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

Ta konwersja jest w tym przypadku gorsza od użycia lateinit, ponieważ w każdym miejscu, do którego uzyskuje się dostęp, trzeba wyodrębnić odwołanie do przycisku z niepustym asercją lub operatorem Safe-call.

W innych przypadkach, gdy null jest prawidłowym przypisaniem zmiennej na podstawie przypadku użycia aplikacji, odpowiednim sposobem na bezpieczne wyodrębnienie obiektu z wartością null lub wprowadzenie rozsądnej wartości domyślnej, która nie ma wartości null, może być użycie operatora Safe-call (?.) z zakończonym operatorem elvis (?:). Android Studio nie ma wystarczających informacji, aby to określić w trakcie procesu konwersji. Chociaż domyślnie przyjmuje ono wartość niepustą, należy kontynuować i odpowiednio dostosować przekonwertowany kod.

Więcej informacji

Więcej informacji o używaniu w projekcie zarówno kodu Kotlin, jak i kodu Java znajdziesz w tym artykule.

Więcej informacji o użyciu Kotlin w scenariuszach biznesowych znajdziesz w artykule o wdrażaniu Kotlin w dużych zespołach.

Informacje o idiomatycznych kodach Kotlin w istniejących interfejsach API Androida znajdziesz na stronie Android KTX.