04

Práce s grafickými prvky z kódu

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.


Identifikace grafického prvku

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:

  1. Přímo (třeba jako parametr metody)
    Třeba při stisku tlačítka dostává odpovídající metoda parametr 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í.

  2. Vyhledáním podle identifikátoru
    V tomto případě musíme grafickému prvku (třeba tlačítku) v XML popisu nastavit atribut 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);

Nastavení atributů tlačítka z kódu

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.


Nastavení popisu tlačítka

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);


Nastavení barev

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) );


Nastavení rozměrů tlačítka

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.


Nastavení id

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.


Nastavení reakce

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říklad – změna popisu tlačítka v projektu Svitilna

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



Shrnutí

  1. Nyní už umíme použít atribut android:id a funkci findViewById(id) k získání odkazu na grafický prvek v kódu.

  2. Nastavení vlastností grafického prvku se provádí pomocí metod odpovídající třídy. Ukázali jsme si jako příklad některé metody třídy Button. U dalších tříd jsou metody podobné.

  3. Reakci na tlačítko popíšeme v metodě, jejíž název uvedeme v atributu: android:onClick.
    V kódu nastavujeme reakci vytvořením posluchače OnClickListener. Můžeme použít anonymní posluchače stejně jako v kódu pro prvky z balíčku Swing:

  4. button.setOnClickListener(new OnClickListener() { public void onClick(View v) {  } });