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:
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.
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.
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.
Wybierz opcję, aby skonfigurować Kotlin dla wszystkich modułów zawierających pliki Kotlin, jak pokazano na rysunku 4:
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.
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.