Naprogramujte si mobil

Část 4. Formulářové rozhraní Mobilní telefony jsou zařízení velice různorodá. Definovat pro ně jakýkoliv standa...


Část 4. Formulářové rozhraní
Mobilní telefony jsou zařízení velice různorodá. Definovat pro ně jakýkoliv
standard je proto nesmírně obtížné a lze toho dosáhnout pouze za cenu jisté
abstrakce. Profil MIDP se proto vůbec nesnaží definovat, jak mají ovládací
prvky vypadat, ale zabývá se pouze jejich požadovanou funkcí.
Třída, která chce zobrazovat na displej, musí být potomkem třídy Displayable.
Ta má dva potomky vedle třídy Canvas, o níž jsem hovořil minule, je to ještě
(uměle) abstraktní třída Screen, která je rodičem všech tříd formulářových
rozhraní. Tato třída přidává možnost zadat a zjistit titulek dané formulářové
obrazovky a takzvaný ticker, což je nápis, který běží podél některého okraje
displeje. Pozn: Uměle abstraktní je ta třída, která je deklarována jako
abstraktní, i když nemá žádné abstraktní metody je abstraktní pouze proto, aby
nebylo možné vytvářet její instance.
Třída Screen má čtyři specializované potomky:
Alert slouží k dočasnému převzetí displeje pro zobrazení nejrůznějších
upozornění, která mohou čekat na reakci uživatele, ale také se mohou zobrazit
pouze na předem zadanou dobu.
List zobrazí na displej seznam možností (zadávají se jako vektor textových
řetězců a/nebo vektor obrázků), mezi nimiž si uživatel může vybrat. Ten může
sloužit např. jako podnabídka hlavní nabídky. ŇTextbox slouží k zadávání a
editaci dlouhých textů (v obdobném režimu píšete např. zprávy SMS).
Form je schopen zobrazit a spravovat univerzální formulář s několika položkami
různých typů.

Formuláře
Jak jsem již řekl, třída Form slouží k zobrazení a správě formulářů. Formuláře
sestávají z položek, což jsou instance některého z potomků (uměle) abstraktní
třídy Item. Těmito potomky jsou třídy:
TextField slouží k zadávání čísel a kratších textů. Při čtení zadané informace
sice vždy získáte řetězec, ale třída umožňuje zadat, jestli bude vstupovat
obecný text, číslo, heslo, URL či telefonní číslo. Systém pak mění režim
klávesnice (jak víte, samotná čísla se na mobilech zadávají mnohem lépe než
čísla v rámci textů) i zobrazení vstupujících hodnot (při zadávání hesla se
např. nezobrazuje vstupující text) a hlídá uživatele, aby nezadával, co nemá.
DateField slouží k zadávání dat (tj. "datumů"). Jejich zadávání se vám operační
systém většinou snaží ulehčit zobrazením kalendáře se zvýrazněným dnešním datem
a možností jeho snadné změny.
Gauge (stupnice) umožňuje graficky zobrazit zadávané hodnoty, které se pak
nezadávají přímo číslem, ale mění se pomocí "kurzorových kláves". Stupnice může
být i pasivní a sloužit pak pouze zobrazení dané hodnoty např. poměrné
velikosti již odeslané části přenášených dat.
ChoiceGroup slouží k realizaci přepínačů a voleb (zaškrtávacích políček). To,
jestli právě zadáváte přepínač či volbu, záleží na tom, jestli v parametru
označovaném choiceType zadáte hodnotu EXCLUSIVE (pak se jedná o přepínač) nebo
MULTIPLE (pak se jedná o skupinu voleb). Jednotlivé možnosti pak předáte jako
vektor znakových řetězců a/nebo vektor obrázků (ikon).
ImageItem umožňuje vložit do seznamu položek obrázek (ikonu). Nemá však aktivní
funkci (na rozdíl např. od obrázku v objektu typu List) a slouží pouze ke
grafickému dotvoření formuláře. Obrázek můžete kdykoliv vyměnit např. v
závislosti na zadané hodnotě či stavu programu.
StringItem má stejnou funkci jako ImageItem, pouze místo obrázku zadáváte text.
Položky přidáme do formuláře obdobně, jako jsme v minulém pokračování přidávali
příkazy. Slouží k tomu metoda
public int append(Item item)
Jak vidíte, na rozdíl od příkazů však u položek nezadáváme ani druh, ani jejich
prioritu. Abychom však nebyli omezeni na pouhé přidávání položek na konec,
můžeme využít i metody public void insert(int itemNum, Item item),
s jejíž pomocí můžeme vložit položku na zadanou pozici. Formulář nemusí být v
průběhu programu fixní. Kdykoliv za běhu programu můžeme přidávat další položky
a odebírat či měnit položky stávající. K odstranění položky z formuláře slouží
metoda
void delete(int),
kde itemNum je pořadí odstraňované položky. Pro změnu položky pak použijeme
metodu public void set(int itemNum, Item item),
která umožňuje zaměnit položku na pozici itemNum položkou item. Měnitelný není
jen celý formulář, ale i charakteristiky jednotlivých položek. Každá nabízí
několik metod, jak zjišťovat a měnit její charakteristiky návěští, počáteční
hodnotu, povolený rozsah apod. Tyto změny se okamžitě projeví i na displeji.

Zadávání hodnot
Podobu s příkazy najdete i při nastavování reakce na zadávání hodnot. Je třeba
prostřednictvím metody public void setItemStateListener(ItemStateListener
iListener)
zadat posluchače, což je instance třídy implementující rozhraní
ItemStateListener. Toto rozhraní vyžaduje, aby implementační třída definovala
metodu
public void itemStateChanged(Item item),
kterou operační systém zavolá po každé změně hodnoty některé z položek ve
formuláři. Uvnitř metody itemStateChanged bývá opět posloupnost vnořených
příkazů if ... else if, jež podle hodnoty parametru rozhodnou, která z položek
byla změněna, a příslušně zareagují.
V programu, který ilustruje možnosti formulářových rozhraní, najdete definici
třídy Setup_3, která je volána v okamžiku, kdy chce uživatel změnit nastavení
některé z voleb v našem programu pro házení kostkou tvar ok na kostce, barvy a
maximum, které lze hodit.
Pro zadání barev a tvaru definujeme:
private String[] cName = { "Cervena", "Zelena", "Modra" }; private String[] sName = { "Kruh", "Ctverec", "Krouzek", "Ramecek" }; Barvu pak nastavujeme pomocí trojice voleb pro její komponenty:
cgrColor = new ChoiceGroup( "Barva", Choice.MULTIPLE, cName, null ); Tvar zadáváme výběrem z množiny hodnot přepínače:
cgrShape = new ChoiceGroup( "Tvar", Choice.EXCLUSIVE, sName, null ); Minimální hodnotu zadáme pomocí stupnice
gauMin = new Gauge( gauMinLabel(), true, dc.max, dc.min ); Maximální hodnotu zadáme pomocí textového pole
txfMax = new TextField( txfMaxLabel(), ""+dc.max, 2, TextField.NUMERIC ); Samotné nastavení barev, tvaru a minimálních, resp. maximálních hodnot vypadá
následovně:
public void itemStateChanged( Item item ) {if( item == cgrColor ) { //NASTAVENÍ
BAREV int color = 0; //Zjistí požadované nastave//ní
for( int i=0; i color ShowDie_3.color = color; //Zapamatuje si je
}
else if( item == cgrShape ) {//NASTAVENÍ TVARU int i; //Index nastaveného tvaru v přepínači odpo//vídá indexu tohoto tvaru ve vektoru
tvarů
ShowDie_3.drawer =
ShowDie_3.drawers[i=cgrShape.getSelectedIndex()]; }
else if( item == gauMin ) {//NASTAVENÍ MINIMA
dc.min = gauMin.getValue(); //Přečti nové na//stavení
gauMin.setLabel(gauMinLabel()); //Uprav si //návěští
txfMax.setLabel(txfMaxLabel()); //Uprav ná//věští pro max
}
else if( item == txfMax ) {//NASTAVENÍ MAXIMA
int max = Integer.parseInt( txfMax.getString() ); if( max if( max > dc.MaxN ) max = dc.MaxN; //Nové maximum je zároven maximálním //povoleným minimem
gauMin.setMaxValue(dc.max = max); txfMax.setLabel(txfMaxLabel()); //Nové //
návěští pro max
gauMin.setLabel(gauMinLabel()); //Nové //návěští pro min
}
else throw new IllegalArgumentException(); }//void ItemStateChanged( Item item )
Kompletní funkční podobu programu opět najdete na adrese www.pecinovsky.
cz/cw/pgm-mobil.zip.
Autor pracuje jako EDU Expert ve firmě Amaio Technologies.









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.