Lekce 9 - Android Programování - Neobjevujte kolo, použijte Gradle
V minulé lekci, Android programování - Životní cyklus aktivity, jsme se dozvěděli co je to aktivita a jaký je její životní cyklus.
Programovali jste v jiném jazyku či si říkáte, že nemá smysl stále dokola vynalézat kolo? Tak to jste zde dnes správně. Ukážeme si totiž, jak se vyhnout programování stejných věcí stále dokola.
Gradle
Kotlin/Java má oficiální podporu balíčkovacího nástroje Gradle. Možná si vzpomenete, že v minulých lekcích jsme museli počkat, než se nám projekt "zesynchronizoval". To byl právě balíčkovací nástroj Gradle, který stahoval knihovny potřebné k zapnutí Android aplikace.
Je důležité říci, že Gradle není pouze balíčkovací nástroj, ale dají se v něm volat i automatizované akce, např. generování kódu, spouštění unit testů při každém buildu apod.
Nejdříve si ukážeme, jak knihovny do svého projektu vůbec dostat. Dále si v dnešním tutoriálu představíme i několik knihoven, které byste do začátku měli znát.
Instalace
Pojďme si tedy založit nový projekt, Android studio nám při jeho
založení vše připraví. Pro účely článku projekt nazvu
SampleGradleProject
.
Nyní je vhodná chvíle si položit otázku, jak to, že nám Gradle funguje, když jsme nestáhli žádný balíčkovací nástroj? Otevřme si složku projektu v "průzkumníku souborů".
Na odpověď naší otázky nám postačí složka gradle/
, kde
je uložený .jar
soubor, reprezentující "celý" Gradle. Jelikož
samotný Gradle je velice malý, nemusí nám vadit, že se nám vytváří v
každém projektu znovu. Asi nemusím vysvětlovat, že je příjemnější a
rychlejší mít takto balíčkovací systém bez nutnosti stahování a mnohdy
"komplikovaného" instalování.
Přidávání knihoven
Pojďme zpět do Android Studia a otevřeme soubor build.gradle
našeho modulu. Knihovny, které chceme v naší aplikaci využívat, budeme
primárně psát do bloku `dependencies:
Občas budeme muset upravit build.gradle
v rootu projektu (to je
druhý gradle soubor). Zde budeme definovat repositáře, ze kterých se
potřebné knihovny mají stahovat.
Pojďme tedy přidat knihovnu a následně ji použít v ukázkovém projektu. My použijeme knihovnu MPAndroidChart, která slouží k vytváření grafů. Vytvoříme si triviální aplikaci, která nám vykreslí koláčový graf. V grafu zobrazíme počet programátorů v určitém věkovém rozmezí. Naše data budou vypadat následovně:
- Pod 24 let - 16,854 programátorů
- 25 - 34 let - 31,770 programátorů
- Nad 35 let - 15,950 programátorů
Pro náš příklad používám statistiku od Stack Overflow.
Začněme tím, že upravíme blok repositories
v rootu
projektu, kam přidáme repositář maven
. Příslušný blok kódu
bude nyní vypadat takto:
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
}
}
Tím Gradlu říkáme, že knihovna, kterou budeme stahovat, je uložená na
této adrese. Dále přidáme samotnou knihovnu do bloku
dependencies
(to je druhý soubor build.gradle
v
modulu). Náš blok dependecies
bude tedy vypadat nějak takto:
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0-alpha' }
Po tom, co jsme provedli obě akce, je potřeba projekt "synchronizovat". To provedeme tlačítkem "Sync Now" v pravém horním rohu:
Máme všechno co potřebujeme, pojďme tedy konečně začít psát kód.
Nejdříve si upravme naši aktivitu. Protože zatím umíme používat pouze
LinearLayout
, přepíšeme ConstraintLayout
nějak
takto:
<?xml version="1.0" encoding="utf-8"?> <android.widget.LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:gravity="center"> <!-- Zde za okamžik vložíme náš graf --> </android.widget.LinearLayout>
Dále potřebujeme přidat koláčový graf. Toho docílíme přidáním následujícího kódu na místo komentáře v předchozí ukázce:
<com.github.mikephil.charting.charts.PieChart android:id="@+id/chart" android:layout_width="match_parent" android:layout_height="match_parent" />
Dále potřebujeme graf vyplnit daty. Pojďme tedy do
MainActivity.kt
a pomocí metody findViewById()
graf
vybereme. Graf bude typu PieChart
. Metoda onCreate()
tedy bude vypadat nějak takto:
super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val chart = findViewById<PieChart>(R.id.chart)
Také si musíme připravit data, která budeme chtít zobrazit:
val entries = listOf( PieEntry(16854f, "Pod 24 let"), PieEntry(31770f, "25 - 34 let"), PieEntry(15950f, "Nad 35 let") )
Dále budeme muset vytvořit titulek, nastavit barvy, velikost písma a ve finále předat tyto informace grafu. To uděláme následujícím kódem:
val dataSet = PieDataSet(entries, "Věkové rozmezí programátorů za rok 2018") dataSet.colors = ColorTemplate.MATERIAL_COLORS.toList() //Barvy pozadí dataSet.valueTextSize = 18f //Velikost písma chart.data = PieData(dataSet) chart.description.text = "" //Popisek chceme prázdný, není jaký použít
Celá naše metoda onCreate()
vypadá tedy nějak takto:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val chart = findViewById<PieChart>(R.id.chart) val entries = listOf( PieEntry(16854f, "Pod 24 let"), PieEntry(31770f, "25 - 34 let"), PieEntry(15950f, "Nad 35 let") ) val dataSet = PieDataSet(entries, "Věkové rozmezí programátorů za rok 2018") dataSet.colors = ColorTemplate.MATERIAL_COLORS.toList() dataSet.valueTextSize = 18f chart.data = PieData(dataSet) chart.description.text = "" }
Pojďme zkusit jestli funguje vše jak jsme chtěli:
Pokud při kompilaci projektu narazíte na chybu:
More than one file was found with OS independent path 'META-INF/proguard/androidx-annotations.pro'
,
přidejte do bloku android
v gradle kód níže. Jedná se o
známý problém se současnou verzí. Více
informací
// Temporary fix packagingOptions { exclude 'META-INF/proguard/androidx-annotations.pro' }
Vidíme, že vše funguje jak má.
V jedné z dalších lekcí Gradle využijeme, až si budeme ukazovat, jak získat data z internetu (ve formátu JSON) a jak tento formát zpracovat. Oboje umí i sám Kotlin, ale pomocí knihoven nám to půjde mnohem snadněji. Dá se říci, že se staly takovým nepsaným standardem.
V příští lekci, Android programování - ConstraintLayout - Vytvoření omezení, si představíme ConstraintLayout
a
ukážeme si, jak vytvářet a odstraňovat omezení různými způsoby.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 54x (16.64 MB)
Aplikace je včetně zdrojových kódů v jazyce Kotlin