Lekce 3 - Vlastní Android Spinner - TextView položky - Java kód
V minulé lekci, Vlastní Android Spinner - TextView položky - XML kód, jsme přidali do projektu ukázkové aplikace
druhý Spinner
, jehož vzhled jsme upravili pomocí XML kódu.
V dnešním Java Android tutoriálu se budeme věnovat Java kódu druhého Spinneru, který se bude od toho prvního lišit nejen vzhledem, ale i způsobem práce s daty.
Java kód druhého Spinneru
Po přípravě veškerého XML kódu druhého Spinneru se vrhneme na jeho
Java kód v souboru MainActivity.java
. Zde doplníme dvě
proměnné:
spinnerCustomItemText
- Proměnná nám poslouží k uložení reference na druhýSpinner
v XML návrhu aplikace. Díky ní budeme moci v Java kóduSpinner
nastavit a reagovat na událost výběru položky v jeho menu.labelCustomItemText
- Proměnná je určena pro referenci komponentyTextView
, zobrazující text položky, která bude zvolena ve druhém Spinneru.
Kód metody onCreate()
doplníme o inicializaci nových
proměnných a o volání metody initCustomItemTextSpinner()
,
kterou budeme deklarovat za okamžik. Java kód souboru
MainActivity.java
bude nyní vypadat takto:
public class MainActivity extends AppCompatActivity { Spinner spinnerDefault; TextView labelSpinnerDefault; Spinner spinnerCustomItemText; TextView labelCustomItemText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); spinnerDefault = findViewById(R.id.spinnerDefault); labelSpinnerDefault = findViewById(R.id.labelSpinnerDefault); spinnerCustomItemText = findViewById(R.id.spinnerCustomItemText); labelCustomItemText = findViewById(R.id.labelCustomItemText); initDefaultSpinner(); initCustomItemTextSpinner(); } // ...
Inicializace Spinneru
Nyní se pustíme do deklarace inicializační metody druhého spinneru,
která je volána v metodě onCreate()
. Metodu
initCustomItemTextSpinner()
přidáme na konec třídy:
private void initCustomItemTextSpinner() { String[] monthsArray = getResources().getStringArray(R.array.months_array); List monthList = new ArrayList(Arrays.asList(monthsArray)); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_item, monthList); adapter.setDropDownViewResource(R.layout.spinner_dropdown_item); spinnerCustomItemText.setAdapter(adapter); spinnerCustomItemText.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { labelCustomItemText.setText(parent.getItemAtPosition(position).toString()); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); }
Ve výše uvedené metodě nejprve vytváříme pole textových řetězců z
pole months_array
připraveného v resources
projektu.
V dalším řádku tímto polem inicializujeme nově vytvořenou kolekci
monthList
, kterou následně použijeme jako třetí parametr
konstruktoru objektu typu ArrayAdapter
.
Nabízí se otázka, proč máme u druhého spinneru "nalévání" dat do
adaptéru řešeno pomocí kolekce a ne pomocí pole, jako v případě prvního
Spinneru. Odpověď je jednoduchá - Abychom si ukázali i jiný postup a jiný
konstruktor třídy
ArrayAdapter
, která má celkem šest konstruktorů. Také
tím, že máme objekt s položkami definovaný ve zvláštní proměnné a ne
přímo v parametru konstruktoru adaptéru (jako u prvního Spinneru), můžeme
k tomuto seznamu položek přímo přistupovat při volání metody
onItemSelected()
při volbě položky Spinneru.
Dále vytváříme již známý ArrayAdapter
, jehož
prostřednictvím naplníme Spinner
daty. Jak již bylo naznačeno,
jako zdroj dat použijeme předem připravenou kolekci v proměnné
monthList
. Proto zde použijeme jiný konstruktor třídy
ArrayAdapter
. Pro srovnání si ukážeme konstruktor použitý v
prvním Spinneru a hned pod ním konstruktor, který používáme nyní:
// První spinner ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.days_array)); // Druhý spinner ArrayAdapter<String> adapter = new ArrayAdapter(this, R.layout.spinner_selected_item, monthList);
Konstruktor druhého Spinneru také přijímá tři parametry:
- Shodně s prvním konstruktorem je prvním parametrem aktuální kontext a
- druhým parametrem ID layoutu zvolené položky. První
spinner používá defaultní vzhled, zatímco druhému Spinneru zde nastavujeme
vzhled definovaný v námi vytvořeném XML návrhu v souboru
spinner_selected_item.xml
. - A ve třetím parametru máme odlišnost těchto dvou konstruktorů - u toho
prvního zde máme datový typ pole, zatímco v druhém
konstruktoru máme kolekci
List<String>
.
V Java kódu metody pokračujeme již známým voláním metody
setDropDownViewResource()
na objektu adaptéru, čímž Spinneru
nastavíme vzhled položek rozbaleného menu. Zde, opět na rozdíl od prvního
Spinneru, použijeme referenci na námi vytvořený XML soubor s návrhem
vzhledu spinner_selected_item.xml
. Dalším řádkem Spinneru
nastavujeme vytvořený adaptér voláním metody setAdapter()
.
U druhého Spinneru definujeme akci po zvolení jedné z položek menu
stejně jako u prvního Spinneru a i zde bude zvolený text zobrazen v
příslušném TextView
pod Spinnerem. V následující ukázce
kódu si ukážeme další dvě možné varianty získání dat ze zvolené
položky v přepsané metodě onItemSelected()
. Využijeme toho,
že máme seznam položek uložený ve zvláštní proměnné
monthList
mimo adaptér, jak bylo zmíněno výše:
labelCustomItemText.setText(monthList.get((int) id).toString());
nebo:
labelCustomItemText.setText(monthList.get(position).toString());
Požadovanou hodnotu získáme přímo z proměnné monthList
.
Správný index této položky získáme buď pomocí proměnné id
(nutná typová konverze z typu long
na typ int
) a
nebo pomocí proměnné position
. Tyto dvě proměnné získáme z
parametrů přepsané metody onItemSelected()
.
Tímto jsme dokončili druhou část ukázkové aplikace s druhým Spinnerem
a již umíme upravovat vzhled TextView
jeho položek. Projekt s
prvními dvěma Spinnery je ke stažení pod lekcí.
V příští lekci, Vlastní Android Spinner - Příprava obrázkových položek, si připravíme XML a vlastní Java třídu pro Spinner s obrázky položek.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 9x (1.47 MB)
Aplikace je včetně zdrojových kódů v jazyce Java