04
V minulé kapitole jsme si ukázali vlastnosti tlačítka. Ukázali jsme si také, jak popsat, co se bude dít při stisku tlačítka. Naše možnosti jsou ale zatím jen velmi omezené. Dovedeme manipulovat pouze s vlastnostmi prvku, který vyvolal událost a ukázali, jak z kódu aplikace měnit barvu. Neumíme zatím manipulovat s ostatními grafickými prvky a jinými vlastnostmi prvků. To je tématem této kapitoly. Opět použijeme jako příklad tlačítko.
Každý prvek je z programátorského hlediska instancí třídy, která je potomkem třídy View (android.view.View)
.
Například tlačítko je instancí třídy Button
(android.widget.Button
), která je potomkem třídy View
.
Instanci prvku můžeme získat:
view
, který nese instanci zdroje události. Zdroj události je typu View
. Pokud tedy chceme pracovat se specifickými metodami konkrétní třídy, musíme provést přetypování.
android:id
. Na toto ID se pak odkážeme. Třída Activity má metodu findViewById(id)
, která vrací instanci prvku s daným identifikátorem.
Příklad: K tlačítku s atributem android:id
nastaveným na hodnotu tlacitko1
bychom se mohli dostat pomocí kódu
Button tlacitko = (Button) this.findViewById(R.id.tlacitko1);
Jakmile máme k dispozici instanci tlačítka, můžeme této instanci posílat zprávy (volat metody) a tím nastavovat její vlastnosti.
V následujícím textu předpokládáme, že instanci tlačítka máme uloženu v proměnné s názvem button
.
Použijeme metodu setText(String text)
.
Můžeme nastavit hodnotu přímo:
button.setText("Text na tlačítko")
,
resp. button.setText(promenna_s_textem)
.
Lepší je ale odkázat na připravené texty v projektu
(soubor res/values/strings.xml): button.setText(R.string.nazev_textu);
Barvy už jsme nastavovali v minulé kapitole. Použijeme metody setBackground(Color color)
resp. setTextColor(Color color)
.
Podobně jako u textů můžeme nastavit hodnotu přímo:
button.setBackground(Color.WHITE)
,
resp. button.setBackground(promenna_s_barvou)
.
Lepší je ale odkázat na připravené texty v projektu (soubor res/values/colors.xml). Zde ovšem musíme provést konverzi identifikátoru barvy na skutečnou hodnotu barvy:
button.setBackground(this.getResources().getColor(R.color.nazev_barvy) );
Pro nastavení rozměrů se používá instance třídy LayoutParams
.
Každý layout má svoji verzi třídy LayoutParams
definovanou jako vnořenou třídu. Existují tedy třídy LinearLayout.LayoutParams
, RelativeLayout.LayoutParams
a další.
Nás zatím zajímají hlavně rozměry vnořených prvků, použijeme tedy šablonu:
button.setLayoutParams( new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
První parametr konstruktoru určuje chování tlačítka na šířku, druhý na výšku.
Pokud nastavujeme ID prvku v XML souboru, je situace jednoduchá a nemusíme se starat o to, jaké identifikační číslo překladač prvku přidělí. Pokud však chceme dynamicky (až za běhu programu) přidávat vlastní prvky (třeba měnit počet tlačítek podle pokynů uživatele), musíme číslo ID přiřadit sami metodou setId(int id)
. Tato situace je poměrně netypická a případný zájemce se o ní dozví více v kapitolách na konci této učebnice.
Reakce na stisk tlačítka se nastavuje podobně jako při práci s tlačítky v grafickém rozhraní klasických aplikací Javy (knihovna Swing), prostřednictvím posluchače
(OnClickListener
). I zde můžeme vytvářet anonymní posluchače.
Můžeme tedy použít následující šablonu kódu:
Button tlacitko = (Button) this.findViewById(R.id.idTlacitka); tlacitko.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { metodaReakce(view); } });
První řádek získá odkaz na tlačítko, kterému chceme nastavit reakci. Dále už stačí místo: metodaReakce(…)
dopsat správný název metody, která má reagovat na tlačítko. Pravidla jsou stejná jako při nastavování v XML, takže hlavička metody musí vypadat následovně:
public void metodaReakce(View view) { … }
Přidejme do předchozího projektu textovou popisku s textem „Světlo svítí!“
nebo „Světlo nesvítí!“
podle aktuálního stavu tlačítka. Na tomto malém příkladě si ukážeme, jak odkazovat na prvky grafického rozhraní.
Do XML souboru aktivity v projektu Svitilna přidáme prvek TextView
a nastavíme mu ID:
<TextView android:id="@+id/sviti" android:text="@string/oznameniSviti" android:layout_width="match_parent" android:layout_height="wrap_content" />
Do souboru strings.xml přidáme texty „oznameniSviti“
a „oznameniNesviti“
:
<string name="oznameniSviti">Světlo svítí!</string> <string name="oznameniNesviti">Světlo zhaslo!</string>
V popisu reakce na tlačítko v metodě prepniBarvu(…)
pak stačí přidat:
TextView stav = (TextView) this.findViewById(R.id.sviti); stav.setText(this.zapnuto ? R.string.oznameniSviti : R.string.oznameniNesviti);
Úkol – změna popisu vypínače v projektu Svitilna
android:id
a funkci findViewById(id)
k získání odkazu na grafický prvek v kódu.
android:onClick
. OnClickListener
. Můžeme použít anonymní posluchače stejně jako v kódu pro prvky z balíčku Swing:
button.setOnClickListener(new OnClickListener() { public void onClick(View v) { … } });