Príklady

3. Kapitola: Časovač

Vytvoríme časovač, ktorý odpočítava 10 sekúnd, keď kliknete na tlačidlo. Predtým, než sa začneme venovať písaniu kódu, vytvoríme si rozhranie, teda to čo užívateľ uvidí, keď spustí aplikáciu. Vľavo máte tzv. Package explorer, kde otvorte súbor z adresára “res/layout/activity_countdown.xml” (tento je otvorený už po vytvorení projektu). Android ponúka dve možnosti vytvorenia tohto rozhrania a to ručne pomocou XML kódu alebo grafickým editorom. Vždy odporúčame využiť prvú možnosť. Takže prepnite sa na záložku activity_main.xml a vložte tento kód: ⋖RelativeLayout 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" > ⋖TextView android:id="@+id/time_display_box" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="60dp" android:text="@string/_00_30" android:textAppearance="?android:attr/textAppearanceLarge"/> ⋖Button android:id="@+id/startbutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/time_display_box" android:layout_centerHorizontal="true" android:layout_marginTop="41dp" android:text="@string/start" /> ⋖/RelativeLayout> Týmto sme vytvorili dva nové prvky rozhrania a to TextView (textové pole) a Button (tlačidlo). Všimnite si referencie na @string/start a @string/__00_30. Tieto hodnoty sú uložené v súbore res/values/strings.xml. Otvorte ho a vložte nasledujúci kód: ⋖string name="start">štart⋖/string> ⋖string name="_00_30">00:30⋖/string> Toto ilustruje štandardný spôsob referencie na Android zdroje. Je ďaleko vhodnejšie vytvoriť takéto odkazy, skôr ako “tvrdé” kódovanie reťazcov (eclipse vás na to dokonca upozorní).
Ďalej sa budeme zaoberať samotným kódom nášho časovača. Vo vašom editore otvorte súbor CountdownActivity.java, ktorý by mal obsahovať vygenerovanú metódu onCreate(). Príkazy, ktoré napíšete do tejto metódy, sa vykonajú po spustení danej aktivity, takže sa často používa na inicializáciu prostredia. Ostatné vygenerované metódy budeme zatiaľ ignorovať. Pod riadok “public class MainActivity extends Activity {” vložte nasledujúci kód tak, aby ste nemali dvakrát uvedenú metódu oncreate:
private static final int MILLIS_PER_SECOND = 1000; private static final int SECONDS_TO_COUNTDOWN = 30; private TextView countdownDisplay; private CountDownTimer timer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); countdownDisplay = (TextView) findViewById(R.id.time_display_box); Button startButton = (Button) findViewById(R.id.startbutton); startButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { try { showTimer(SECONDS_TO_COUNTDOWN * MILLIS_PER_SECOND); } catch (NumberFormatException e) { // metóda ignoruje neplatný vstup a čaká // na niečo čo môže použiť } } }); }

Pridaním tohto kódu vás Eclipse bude varovať na určité chyby. Sú spôsobené najmä tým, že ste nepridali potrebné knižnice. Tento problém odstránite stlačením klávesovej skratky “command+shift+O“ alebo“Control + Shift + O”. To čo robí tento projekt veľmi jednoduchý je fakt, že Android API už obsahuje vlastný časovač odpočítavania, ktorý môžeme použiť. Všetky premenné sme deklarovali, ako privátne. V metóde onCreate () používame metódy, s ktorými sa budete často stretávať. Metóda setContentView sa používa na načítanie XML layout-u a syntax R.layout.main je štandardný spôsob ako sa odkazovať na Android XML zdroj v kóde. findViewById je ďalšou z metód, ktoré sa veľmi často používajú. V našom prípade zachytávajú textové pole a tlačidlo z XML súboru. Aby sme mohli spojazdniť tlačidlo, musíme najskôr vytvoriť tzv. OnClickListener. Tento sa radí medzi interface, takže musí byť napísaný ako podtrieda. Mohli by sme vytvoriť úplne novú triedu MyButton, no to by bolo vzhľadom na to, že využívame jedno tlačidlo zbytočné. Namiesto toho, vytvoríme nový OnClickListener a jeho onClick() metódu. V našom prípade sa zavolá metóda showTimer() na počet milisekúnd, ktoré sme zadali natvrdo. Takže čo robí metóda showTimer()?
>private void showTimer(int countdownMillis) { if(timer != null) { timer.cancel(); } timer = new CountDownTimer(countdownMillis, MILLIS_PER_SECOND) { @Override public void onTick(long millisUntilFinished) { countdownDisplay.setText("odpočítavam: " + millisUntilFinished / MILLIS_PER_SECOND); } @Override public void onFinish() { countdownDisplay.setText("KABOOM!"); } }.start(); } >
Trieda CountDownTimer robí za nás väčšinu práce, čo je výborné. Na začiatku kódu sa pre istotu presvedčíme či časovač náhodou nie je spustený. Ak áno zrušíme ho. Potom vytvoríme nový časovač a nastavíme počet milisekúnd pre odpočítavanie a počet milisekúnd za jeden interval. Tento interval je za počet zavolaní metódy onTick(). CountDownTimer je ďalšia abstraktná trieda a medódy __onTick()__ and __onFinish()__ musia byť implementované, ako podtriedy. Metódu onTick() používame na zníženie hodnoty sekúnd na displeji vždy o jedna a metódu onFinish() na nastavenie správy po dokončení odpočítavania. Metóda, start()spustí časovač.

Spustením aplikácie sa automaticky vygeneruje emulátor Android zariadenia, kde sa nahrá aj vaša nová aplikácia. Výsledok vašej práce by mal vyzerať nasledovne:

Odpočítavam

Kaboom!