Remember Me
Ciele
- Naučiť sa vytvoriť a aplikovať ponuku nastavení aplikácie.
Úvod
Každá aplikácia by mala ponúkať používateľovi možnosť prispôsobenia funkcionality
a používateľského rozhrania. Vo vašej hre to bude predstavovať možnosť zapnúť/ vypnúť
prehrávanie zvukov, zobrazenie mriežky, zobrazenie čísiel. Voľba zmeny nastavení bude prístupná
cez menu vyvolané stlačením tlačidla MENU na klávesnici
telefónu.
Postup
-
Menu aplikácie je vyvolateľné z každej Aktivity, v ktorej je táto možnosť implementovaná. Aby ste nemuseli implementáciu menu aplikovať v každej Aktivite, z ktorej môže byť vyvolané,v tomto kroku vytvoríte samostatnú Aktivitu, ktorá bude implementovať iba vytvorenie menu a následne iba aplikujete dedenie v požadovaných triedach od tejto Aktivity.Úloha: Otvorte si projekt HelloAndroid z minulého cvičenia alebo si ho stiahnite a importujte do vývojového prostredia Eclipse.Úloha: Vytvorte zdrojový XML súbor pre menu /res/menu/game_menu.xml.Poznámka: Vytvorený zdrojový súbor pre menu už by mal mať nastavený predvolený koreňový element menu definujúci objekt typu Menu. Položky menu, objekty MenuItem, budú definované elementami item, prípadne group.Úloha: Uvažujeme, že menu budú tvoriť 2 položky pre možnosť ukončenia hry a možnosť zmeny nastavení. Pridajte ich vo vytvorenom súbore, prideľte im atribúty pre pridelenie jedinečného identifikátora a zobrazovaný názov. Voliteľným može byť atribút pre pridanie ikony android:icon.Poznámka: Predvolené menu sa zobrazuje na spodku obrazovky a môže ho tvoriť maximálne 6 položiek. Vo verzii 3.0 a vyššie je možné využiť prístup ku položkám menu prostredníctvom ich umiestnenia na nástrojovú lištu (ActionBar)
-
Nastavenia.Objekty typu Preference tvoria základný konštrukčný prvok používateľského rozhrania pri tvorbe nastavení aplikácií, ktoré sú zobrazované Aktivitou typu PreferenceActivity vo forme ListView. Nastavenia sú asociované so SharedPreferences, pre uloženie a načítanie trvalých dát a teda aj nastavení. Objekty typu PreferenceScreen reprezentujú najvyšší level v hierarchii pri zobrazovaní nastavení.Úloha: Vytvorte zdrojový XML súbor pre nastavenia aplikácie /res/xml/settings.xml, pri vytváraní zvoľte typ súboru Preference a koreňový element PreferenceScreen.Úloha: Zatiaľ budete potrebovať iba nastavenia typu áno/nie, preto využijete iba elementy typu CheckBoxPreference. Pridajte do zdrojového súboru elementy nastavení pre:
- prehrávanie zvukov
- zobrazenie časovača
- zobrazenie mriežky
- zobrazenie čísiel
- zobrazenie obrázka
android:defaultValue // true alebo false android:key // jedinecny identifikator android:summary // popis nastavenia android:title // nazov nastavenia
Úloha: Vytvorte Aktivitu typu PreferenceActivity src/tuke.fei.hello/Prefs.java, ktorá bude zobrazovať a obsluhovať nastavenia.Úloha: Deklarujte v danej triede verejné statické premenné pre všetky nastavenia a priraďte im identifikátory defnované pre nastavenia v zdrojovom súbore settings.xml.Úloha: Implementujte zobrazovanie nastavení zo zdrojového súboru@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); }
Úloha: Vytvorte Aktivitu src/tuke.fei.hello/SharedMenu.java a implementujte metódu slúžiacu na vyvolanie menu, ktorá pomocou metódy getMenuInflater() vráti objekty typu MenuInflater. Na tomto objekte volaním inflate(int, Menu) priradíte identifikovaný zdrojový súbor pre menu Menu objektu.@Override public boolean onCreateOptionsMenu(Menu)
Úloha: Implementuje metódu definujúcu akcie na výber položky menu, identifikátor zvolenej položky získate volaním getItemId(). Pri výbere zmeny nastavení bude teda vyvolaná Aktivita Prefs.@Override public boolean onOptionsItemSelected(MenuItem)
Poznámka: Je dobrým zvykom prenechať obsluhu pre nedefinované voľby položiek prichádzajúce do metódy super triede. -
V tomto kroku si môžete vyskúšať, ako vytvoriť menu v Aktivite typu PreferenceActivity a ako do neho programovo pridať položku, v tomto prípade možnosť vrátiť nastavenia aplikácie do pôvodného stavu.Na vyvolanie menu v oblasti Aktivity pre nastavenia je nutné implementovať metódu onPrepareOptionsMenu(Menu). Keďže je cieľom vytvoriť iba jednu položku, ktorá bude reprezentovať voľbu vrátenia nastavení do pôvodného stavu, nie je nutné vytvárať samostatný návrhový súbor.Úloha: Implementujte metódu pre vytvorenie menu tak, aby sa pri každom volaní najprv zmazali všetky existujúce položky dostupného Menu objektu pomocou volania clear() na danom objekte a následne bola pomocou metódy add(int, int, int, CharSequence) alebo add(int, int, int, int) pridaná požadovaná položka.
@Override public boolean onPrepareOptionsMenu(Menu)
Poznámka: Je na vašom uvážení, akým spôsobom zadefinujete zobrazovaný názov položky (4. parameter), v nasledujúcich krokoch budete potrebovať iba zvolený identifikátor položky (3. parameter)Úloha: Vytvorte privátnu metódu restoreDefaultPreferences(), ktorá bude vykonávať obnovu pôvodných nastavení.Postup obnovenia pôvodných nastavení spočíva vo vymazaní uložených nastavení a znovu-načítaní pôvodných nastavení definovaných v zdrojovom súbore.Úloha: Načítajte uložené nastavenia pomocou volania statickej metódy getDefaultSharedPreferences(Context) na triede manažéra nastavení PreferenceManager.Úloha: Aby ste mohli meniť načítané nastavenia, vyvolajte na objekte obsahujúcom načítané nastavenia editor edit() a pomocou metódy clear() vymažte nastavenia.Poznámka: Nezabudnite, že akékoľvek zmeny vykonané pomocou editora musíte potvrdiť volaním commit().Úloha: Načítajte nastavenia zo zdrojového súboru settings.xml.Úloha: Implementujte obsluhu výberu položky menu vykonávanú v metóde onOptionsItemSelected(MenuItem), identifikátor zvolenej položky menu získate volaním getItemId().@Override public boolean onOptionsItemSelected(MenuItem)
-
V tomto kroku aplikujete zmenu nastavení v aplikácii.Úloha: Deklarujte v Aktivite src/tuke.fei.hello/Game.java privátne boolean premenné, ktoré budú uchovávať hodnoty nastavení, ktoré obsluhuje táto trieda - teda zobrazenie časovača a prehrávanie zvuku.Úloha: Vytvorte privátnu metódu loadPrefs(), ktorá bude kontrolovať prípadnú zmenu nastavení.Úloha: Načítajte v danej metóde uložené nastavenia rovnako ako v predchádzajúcom kroku a získajte hodnoty požadovaných nastavení pod príslušnými kľúčmi pomocou volania getBoolean(String, boolean)Úloha: Aplikujte volanie metódy a zmeny v závislosti od získaných hodnôt na potrebných miestach.Poznámka: Pomôckou môže byť uvedomenie si, kedy je potrebné overovanie zmeny nastavení v súvislosti so stavmi, v ktorých sa Aktivita môže nachádzať v rámci životného cyklu.Úloha: Deklarujte v triede hracieho poľa src/tuke.fei.hello/GameView.java privátne boolean premenné, ktoré budú uchovávať hodnoty nastavení, ktoré obsluhuje táto trieda - teda zobrazenie obrázka, mriežky a čísiel.Úloha: Vytvorte verejnú metódu loadViewPrefs() a implementujte ju tak, aby načítala z uložených nastavení nastavenia potrebné pre túto triedu.Úloha: Prispôsobte vykresľovanie hracieho poľa nastaveniam.Poznámka: V prípade, že je zvolené nastavenie nezobrazovať obrázok, je potrebné načítať farbu priradenú dlaždici a vykresliť element zvolenej farby pomocou klasickej funcie plátna drawRect().Úloha: Aby sa prípadné zmeny nastavení prejavili hneď po ich načítaní, zavolajte na konci metódy loadViewPrefs() opätovné vykreslenie hracieho poľa pomocou requestLayout().Úloha: Volanie načítania nastavení, teda volanie metódy loadViewPrefs() sa bude vykonávať v Aktivite Game, porozmýšľajte, v ktorom stave životného cyklu sa toto volanie bude vykonávať a aplikujte ho.
Doplňujúce úlohy
Ďalšie zdroje