Tvorba aplikací pro Android

04

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

V minulé kapitole jsme si ukázali vlastnos­ti tlačítka. Ukázali jsme si také, jak pop­sat, co se bude dít při stis­ku tlačítka. Naše možnosti jsou ale zatím jen velmi omeze­né. Dovedeme man­ipulovat pouze s vlastnostmi prvku, který vyvol­al událost a ukázali, jak z kódu ap­likace měnit barvu. Neumíme zatím man­ipulovat s os­tatními grafic­kými prvky a jinými vlastnostmi prvků. To je tématem této kapito­ly. Opět použijeme jako příklad tlačítko.


Iden­tifikace grafic­kého prvku

Každý prvek je z pro­gramátorského hledis­ka in­stancí třídy, která je potom­kem třídy View (android.view.View).


Například tlačítko je in­stancí třídy Button (android.widget.Button), která je potom­kem třídy View.


In­stan­ci prvku můžeme získat:

  1. Přímo (třeba jako para­metr metody)
    Třeba při stis­ku tlačítka dostává odpovídající metoda para­metr view, který nese in­stan­ci zdroje události. Zdroj události je typu View. Pokud tedy chceme pra­covat se specific­kými metodami konkrétní třídy, musíme provést přetypování.

  2. Vyh­ledáním podle iden­tifikátoru
    V tomto případě musíme grafic­kému prvku (třeba tlačítku) v XML popisu nas­tavit at­ribut android:id. Na toto ID se pak odkážeme. Třída Ac­tiv­ity má metodu findViewById(id), která vrací in­stan­ci prvku s daným iden­tifikátorem.

Příklad: K tlačítku s at­ributem android:id nas­taveným na hod­notu tlacitko1 byc­hom se mohli dos­tat pomocí kódu

Button tlacitko = (Button) this.findViewById(R.id.tlacitko1);

Nas­tav­ení at­ributů tlačítka z kódu

Jak­mile máme k dis­pozici in­stan­ci tlačítka, můžeme této in­stan­ci posílat zprávy (volat metody) a tím nas­tavovat její vlastnos­ti.
V násle­dujícím textu před­pokládáme, že in­stan­ci tlačítka máme uloženu v proměnné s názvem button.


Nas­tav­ení popisu tlačítka

Použijeme metodu setText(String text).


Můžeme nas­tavit hod­notu přímo:
button.setText("Text na tlačítko"),
resp. button.setText(promenna_s_textem).
Lepší je ale odkázat na přip­rav­ené texty v pro­jek­tu
(soubor re­s/values/strings.xml): button.setText(R.string.nazev_textu);


Nas­tav­ení barev

Barvy už jsme nas­tavovali v minulé kapitole. Použijeme metody
setBackground(Color color) resp. setTextColor(Color color).


Podobně jako u textů můžeme nas­tavit hod­notu přímo:
button.setBackground(Color.WHITE),
resp. button.setBackground(promenna_s_barvou).


Lepší je ale odkázat na přip­rav­ené texty v pro­jek­tu (soubor re­s/values/colors.xml). Zde ovšem musíme provést kon­verzi iden­tifikátoru barvy na skutečnou hod­notu barvy:
button.setBackground(this.getResources().getColor(R.color.nazev_barvy) );


Nas­tav­ení rozměrů tlačítka

Pro nas­tav­ení rozměrů se používá in­stan­ce třídy LayoutParams.
Každý layout má svoji verzi třídy LayoutParams de­finovanou jako vnořenou třídu. Ex­is­tují 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 šab­lonu:

button.setLayoutParams(
        new LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

První para­metr konstruk­toru určuje chování tlačítka na šířku, druhý na výšku.


Nas­tav­ení id

Pokud nas­tavujeme ID prvku v XML souboru, je situace jedno­duchá a nemusíme se starat o to, jaké iden­tifikační číslo přek­ladač prvku přidělí. Pokud však chceme dynamic­ky (až za běhu pro­gramu) 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čeb­nice.


Nas­tav­ení rea­kce

Rea­kce na stisk tlačítka se nas­tavuje podobně jako při práci s tlačítky v grafic­kém rozhraní klasic­kých ap­likací Javy (knihov­na Swing), pro­střed­nictvím pos­luchače
(OnClickListener). I zde můžeme vytvářet an­onymní pos­luchače.

Můžeme tedy použít násle­dující šab­lonu 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 nas­tavit rea­kci. Dále už stačí místo: metodaReakce(…) dop­sat správný název metody, která má rea­govat na tlačítko. Pra­vid­la jsou stejná jako při nas­tavování v XML, takže hlavička metody musí vypadat násle­dovně:

public void metodaReakce(View view) {  }

Příklad – změna popisu tlačítka v pro­jek­tu Svitil­na

Přidej­me do předchozího pro­jek­tu tex­tovou popis­ku s tex­tem „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 od­kazovat na prvky grafic­kého rozhraní.


Do XML souboru ak­tiv­ity v pro­jek­tu Svitil­na přidáme prvek TextView a nas­taví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“„oznameniNesviti“:

<string name="oznameniSviti">Světlo svítí!</string>
<string name="oznameniNesviti">Světlo zhaslo!</string>

V popisu rea­kce 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 pro­jek­tu Svitil­na



Shrnutí

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

  2. Nas­tav­ení vlastností grafic­kého prvku se provádí pomocí metod odpovídající třídy. Ukázali jsme si jako příklad některé metody třídy But­ton. U dalších tříd jsou metody podobné.

  3. Rea­kci na tlačítko popíšeme v metodě, jejíž název uvede­me v at­ributu: android:onClick.
    V kódu nas­tavujeme rea­kci vytvořením pos­luchače OnClickListener. Můžeme použít an­onymní pos­luchače stejně jako v kódu pro prvky z balíčku Swing:

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