03
Naše první aplikace nám funguje. Zatím ale umíme pouze zobrazit text na obrazovce. Je čas seznámit se s prvky grafického rozhraní, které nabídnou uživateli více interakce. Nejběžnějším prvkem je nejspíš tlačítko. V této kapitole tedy do projektu přidáme tlačítko. Na něm si vysvětlíme práci s komponentami grafického rozhraní. Popis dalších komponent už bude stručnější.
Pojďme se nejprve zabývat tím, jak můžeme prvky přidávat a jak můžeme měnit jejich vlastnosti.
Která z variant je nejlepší?
Většinou se doporučuje pokud možno vytvářet rozhraní pomocí souborů XML. V principu je jedno, zda píšeme kód XML přímo, nebo používáme grafický návrhář. Vlastnoručně napsaný kód nám poskytuje větší kontrolu a bude asi stručnější, použití grafického návrháře je pohodlnější a nenutí nás znát názvy elementů a psát je ručně.
Kdykoli však chceme měnit vzhled nebo vlastnosti prvků za běhu aplikace, nebo například vytvořit správný počet tlačítek podle počtu záznamů načtených ze souboru, s XML soubory nevystačíme a potřebujeme přístup ke grafickému rozhraní z kódu aplikace.
Element: Button
Atributy:
android:layout_height, android:layout_width
match_parent
a wrap_content
viz předchozí kapitola).
android:text
. @string/název_textu
.
android:background
,android:textColor
,
Podobně jako není vhodné psát do kódu přímo texty, ...
android:id
.android:onClick
.Popis toho, jak má naše aplikace zareagovat na stisk tlačítka, umístíme do kódu aplikace.
Chování každé aktivity (okna) je v kódu projektu popsáno v samostatné třídě. Všechny tyto třídy jsou umístěny ve složce app/java, respektive v její podsložce odpovídající zvolenému balíčku. Třída je vždy potomkem obecné třídy Activity
.
Popis chování tlačítka umístíme v odpovídající třídě do nové metody.
android:onClick
v XML popisu tlačítka. Tím propojíme tlačítko s popisem jeho funkce.
View
. Hodnota tohoto parametru reprezentuje grafický prvek (v našem případě tlačítko), který spuštění metody vyvolal. Obecně tedy můžeme mít jednu metodu, která zpracuje reakci na více tlačítek nebo jiných grafických prvků. Podle hodnoty parametru metoda pozná, který prvek událost vyvolal.
void
).
Šablona hlavičky třídy a hlavičky metody tedy bude vypadat takto:
class MainActivity extends Activity { … public void reakce(View prvekZdrojUdalosti) { // Co se má stát při stisku tlačítka. } … }
Vytvoříme projekt Svítilna. Bude velmi jednoduchý. Na obrazovce bude stručná informace o účelu aplikace a tlačítko. Po stisku tlačítka se bude měnit barva tlačítka z černé na bílou a zpět.
Svitilna
, název hlavní aktivity SvitilnaActivity
. Titulek aplikace bude Svítilna
.
RelativeLayout
na LinearLayout
(nezapomeňte na android:orientation
).
TextView
) v hlavní aktivitě upravíme tak, aby popisovala chování aplikace. Upravte šířku. Text uvedeme jako odkaz do souboru strings.xml.
<Button>
, nastavte atributy android:text
, android:layout_width
a android:layout_height
. tak, aby tlačítko zabíralo celý zbytek okna kromě textové položky na prvním řádku a aby popis tlačítka byl „Rozsviť!“
. Text nastavte jako odkaz na zdroj v souboru strings.xml.
android:onClick
metodu s názvem prepniBarvu
.
prepniBarvu(...)
. SvitilnaActivity
.public void prepniBarvu(View view) {…}
.view
. Nastavení barvy pozadí provedeme metodou setBackgroundColor
(ContextCompat
.getColor(
this.
R.color.
sviti
)). view
jako s tlačítkem (třída Button
) musíme provést přetypování. Zde odkazujeme na znalosti čtenáře z Javy a pouze stručně okomentujeme: prepniBarvu
dostává jako atribut reálně instanci třídy Button
, ale datový typ je View
(metoda je připravena na obecně jakýkoli prvek). To je možné, protože Button
je potomkem třídy Blue
. Potřebujeme tedy přetypování na Button
, abychom mohli nastavovat text a barvu textu. To provedeme kódem: Button tlacitko = (Button) view
;
<color name="sviti">#FFFFFF</color>
. Tím nastavíme barvu svítícího tlačítka na bílou.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".SvitilnaActivity" android:orientation="vertical"> <TextView android:text="@string/popis_chovani" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:text="@string/tlacitko_je_vypnute" android:layout_width="match_parent" android:layout_height="match_parent" android:onClick="prepniBarvu"/> </LinearLayout>
public class SvitilnaActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_svitilna); } @Override public boolean onCreateOptionsMenu(Menu menu) { ... } @Override public boolean onOptionsItemSelected(MenuItem item) { … } public void prepniBarvu(View view) { Button zdroj = (Button) view; // Přetypování!!! zdroj.setBackgroundColor(ContextCompat.getColor(this, R.color.sviti)); ); } }
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#303F9F</color> <color name="colorAccent">#FF4081</color> <color name="sviti">#FFFFFF</color> </resources>
<resources> <string name="app_name">Svítilna</string> <string name="ovladani">Kliknutím na tlačítko přepnete jeho barvu:</string> <string name="tlacitko_je_vypnute">Rozsviť !</string> </resources>
Tlačítko nyní zdánlivě reaguje pouze na první stisk. To je ale jen zdání. Tlačítko reaguje na každý stisk, ale stále nastavuje jen bílou barvu.
Z hlediska Androidu jsme vyřešili vše potřebné. Aby náš projekt byl alespoň trochu užitečný, potřebujeme ještě:
Zde předpokládáme, že čtenář má již jakousi zkušenost s programováním v Javě. V tuto chvíli totiž není podstatné, zda programujeme aplikaci pro Android nebo klasickou desktopovou aplikaci. Uveďme několik doporučení:
zapnuto
ve třídě SvitilnaActivity
. Datový typ bude boolean
. Podle hodnoty atributu poznáme, zda je tlačítko zapnuté nebo vypnuté. Po každém stisku tedy provedeme: zapnuto = ! zapnuto;
// přepne hodnotu na opačnouif (zapnuto) { … }
// nastavíme barvu podle toho, zda je zapnuto tlačítko.
prepniBarvu()
bude následující:
public void prepniBarvu(View view) { Button zdroj = (Button) view; this.zapnuto = ! this.zapnuto; if (zapnuto) { zdroj.setBackgroundColor( ContextCompat.getColor(this, R.color.sviti)); } else { zdroj.setBackgroundColor( ContextCompat.getColor(this, R.color.nesviti )); } }
Nezapomeňme na začátku třídy SvitilnaActivity
přidat atribut zapnuto
:
public class SvitilnaActivity extends AppCompatActivity { boolean zapnuto = true; ...
android:text
a android:background
a android:textColor
.
setBackgroundColor
(…).
android:onClick
.