Anko biblioteka
Od kada je Kotlin postao zvanično podržan programski jezik od strane Google-a i Android-a, pa do sada, zapanjujuće je koliko su vremena i resursa ljudi iz Kotlin tima uložili u kreiranje pomoćnih alata koji nam olakšavaju razvoj Android aplikacija. U ovom tekstu ću vam detaljnije pojasniti kako nam Anko library olakšava život.
U nastavku teksta podeliću sa vama različite načine i pristupe korišćenja Anko library-ja prilikom kreiranja Android aplikacija.
Šta je Anko?
Anko je veoma robusna biblioteka kreirana od strane Jetbrains-a. Njegova glavna svrha je generisanje UI layouta u Android aplikaciji, koristeći Kotlin kod umesto XML pristupa koji se intenzivno koristi od početka razvoja Android aplikacija.
Ovo je fascinantan pristup u kreiranju layout-a aplikacije, toliko fascinantan da su kreatori Android Jetpack seta tehnologija iskoristili upravo ovaj deo Anko-a za svoj library Jetpack Compose.
Anko nam donosi gomilu ekstremno korisnih funkcija i propertija koji pomažu developeru u suzbijanju redudantnosti i takozvanog “boilerplate” koda u projektu.
U daljem tekstu pokazaćemo nekoliko slučajeva korišćenja ove biblioteke, i ubrzo uvideti koje sve probleme Anko rešava.
Kako je Anko biblioteka napisana specijalno za Android razvoj aplikacija, preporučujem da što bolje shvatite šta se dešava “iza scene”. Implementacija Anko-a je odličan način da naučite da iskoristite što više iz Kotlin programskog jezika.
Za početak iskoristićemo Anko da uprostimo parče koda. Kao što ćete videti, svaki put kada hoćemo da iskoristimo nešto iz Anko biblioteke, to će podrazumevati importovanje imena propertija ili funkcije koje biblioteka sadrži u naš fajl (Activity, Fragment.).
Ovo se dešava zato što Anko koristi extension funkcije da unapredi i doda nove funkcionalnosti Android Framework-u. Pogledaćemo šta je to extension funkcija, i kako da je sami napišemo. Extension funkcije u Kotlin programskom jeziku, kao što samo ime govori, su nadogradnje neke framework klase ili interfejsa, bez menjanja njihovih struktura. Ovo znači da je developeru dat legitimitet da izmeni i adaptira postojeći interfejs/klasu prema svojim potrebama.
Uzmimo za primer neki ListActivity i njegov lifecycle method OnCreate() unutar koga ćemo identifikovati naš RecycleView, koji nam je potreban da prikažemo našu listu :
/* val todoList : RecycleView = find(R.id.todo_list) */
Alert dijalozi
Anko obezbeđuje deklarativan način kreiranja alert dialoga sa tekstualnim sadržajem, listama, progres barovima i sa korisnički definisanim DSL layoutima.
Uzmimo za primer da želimo prikazati korisniku dijalog sa par button-a na dnu i tekstom:
/* alert("Contact", "Do you want to call Aleksandar?") { positiveButton("Yes") { processToCall() } negativeButton("No") { } }.show() */
A ovde imamo funkciju koja kreira i prikazuje dijalog sa listom tekstualnih elemenata :
/* val fruits = listOf("Apple", "Banana", "Peach") selector("What is your favorite fruit?", fruits) { i -> toast("So your fruit is ${fruits[i]}, right?") */
Sledeći primer nam pokazuje kreiranje osnovnog i indeterminat progres bara:
/* progressDialog("Please wait a minute.", "Downloading…") indeterminateProgressDialog("Fetching the data…") */
Pomenuli smo na početku da možete kreirati sopstvene DSL layout-e unutar dijaloga.
Sledeći primer nam pokazuje i kako :
/* alert { customView { verticalLayout { val familyName = editText { hint = "Family name" } val firstName = editText { hint = "First name" } positiveButton("Register") { register(familyName.text, firstName.text) } } } }.show() */
Intent Caller-i
U Androidu, svaka aplikacija ima sopstvenu implementaciju učitavanja stranica u default-nom browseru, otvaranja novog email activity-ja ili uspostavljanja telefonskog poziva ka nekoj osobi iz telefonskog imenika koristeći intent objekte.
Sledeći primer nam pokazuje pomoćnu funkciju za ovo, naravno u Anko stilu:
/* browse("http://somewebsite.org (http://kotlinlang.org/)") email("admin@domain.net (admin@kotlin.net)", "Here I am!", "Hello World") makeCall(number) */
Servisi
Android sistem servisi, kao što su WiFiManager, LocationManager i Vibrator, dostupni su u Anko biblioteci kroz extension propertije Context klase :
/* if (!wifiManager.isWifiEnabled()) { vibrator.vibrate(200) toast("Wifi is disabled. Please turn on!") } */
Intenti
Uobičajen način startovanja novog Activity-ja je kreiranje objekta klase Intent, eventualno stavljanje nekih parametara prostih tipova i prosleđivanje istih kroz startActivity() metod klase Context.
Evo i konkretnog primera :
/* val intent = Intent(this, javaClass()) intent.putExtra("id", 1) intent.putExtra("firstName", "Velimir") startActivity(intent) */
Sa Anko bibliotekom ovo isto možemo uraditi jednom linijom koda :
/* startActivity("id" to 1, "firstName" to "Velimir") */
startActivity() funkcija prihvata ključ-vrednost parove, koji će biti prosleđeni kao Intent extra vrednosti. Druga funkcija startActivityForResult ima sličan potpis uz nekoliko i takođe je dostupna u Anko biblioteci.
Dodavanje Anko biblioteke u naš projekat
Ovo je poprilično laka i uobičajena aktivnost u svetu Android development-a, te i dodavanje Anko dependencie-a nije izuzetak.
Unutar build.gradle fajla u vašem projektu, u element dependencies dodajte sledeće linije :
/* ankoVersion = "0.10.1" dependencies { compile "org.jetbrains.anko:anko-appcompat-v7-listeners:$ankoVersion" compile "org.jetbrains.anko:anko-design-listeners:$ankoVersion" compile "org.jetbrains.anko:anko-design:$ankoVersion" compile "org.jetbrains.anko:anko-sdk15-listeners:$ankoVersion" compile "org.jetbrains.anko:anko-sdk15:$ankoVersion }
Toliko od mene za sad :). Nadam se da sam vam bar malo približio Anko biblioteku i da ćete je uspešno koristiti praveći nove Android aplikacije.