3. diel - Spinner - Vlastné TextView položky - Java kód
V minulej lekcii, Vlastné Android komponent - Vytvorenie a usadenie do layoutu , sme vytvorenú komponent usadili do layoutu.
V dnešnom Java Android tutoriálu sa budeme venovať Java kódu druhého Spinner, ktorý sa bude od toho prvého líšiť nielen vzhľadom, ale i spôsobom práce s dátami.
Java kód druhého Spinner
Po príprave všetkého XML kódu druhého Spinner sa vrhneme na jeho Java
kód v súbore MainActivity.java
. Tu doplníme dve premenné:
spinnerCustomItemText
alabelCustomItemText
.
Kód metódy onCreate()
doplníme o inicializáciu nových
premennými a volanie metódy initCustomItemTextSpinner()
, ktorú
budeme deklarovať za okamih. Java kód súboru MainActivity.java
bude teraz vyzerať 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(); } // ...
Inicializácia Spinner
Teraz sa pustíme do deklarácie inicializačnú metódy druhého spinnera,
ktorá je volaná v metóde onCreate()
. Metódu
initCustomItemTextSpinner()
pridáme na koniec triedy:
private void initCustomItemTextSpinner() { String[] monthsArray = getResources().getStringArray(R.array.months_array); List list = new ArrayList(Arrays.asList(monthsArray)); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_item, list); 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) { } }); }
Vo vyššie uvedenej metóde najprv vytvárame pole textových reťazcov z
poľa months_array
pripraveného v resources
projektu.
V ďalšom riadku týmto poľom inicializujeme novovytvorenú kolekciu
list
, ktorú následne použijeme ako tretí parameter konstruktoru
objektu typu ArrayAdapter
.
Ponúka sa otázka, prečo máme u druhého spinnera "nalievanie" dát do
adaptéru riešené pomocou kolekcie a nie pomocou poľa, ako v prípade prvého
Spinner. Odpoveď je jednoduchá - Aby sme si ukázali aj iný postup a iný
konštruktor triedy
ArrayAdapter
, ktorá má celkom šesť konstruktoru. Tiež
tým, že máme objekt s položkami definovaný v osobitnej premenné a nie
priamo v parametri konstruktoru adaptéra (ako u prvého Spinner), môžeme k
tomuto zoznamu položiek priamo pristupovať pri volanie metódy
onItemSelected()
pri voľbe položky Spinner.
Ďalej vytvárame už známy ArrayAdapter
, prostredníctvom
ktorého naplníme Spinner
dátami. Ako už bolo naznačené, ako
zdroj údajov použijeme vopred pripravenú kolekciu v premennej
list
. Preto tu použijeme iný konštruktor triedy
ArrayAdapter
. Pre porovnanie si ukážeme konštruktor použitý v
prvom Spinner a hneď pod ním konštruktor, ktorý používame teraz:
// 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, list);
Konštruktor druhého Spinner tiež prijíma tri parametre:
- Zhodne s prvým konštruktor je prvým parametrom aktuálny kontext a
- druhým parametrom ID layoutu zvolenej položky. Prvý
spinner používa defaultný vzhľad, zatiaľ čo druhému Spinner tu
nastavujeme vzhľad definovaný v nami vytvorenom XML návrhu v súbore
spinner_selected_item.xml
. - A v treťom parametri máme odlišnosť týchto dvoch konštruktor - u toho
prvého tu máme dátový typ poľa, zatiaľ čo v druhom
konstruktoru máme kolekciu
List<String>
.
V Java kóde metódy pokračujeme už známym volaním metódy
setDropDownViewResource()
na objekte adaptéra, čím Spinner
nastavíme vzhľad položiek rozbaleného menu. Tu, opäť na rozdiel od prvého
Spinner, použijeme referenciu na nami vytvorený XML súbor s návrhom vzhľadu
spinner_selected_item.xml
. Ďalším riadkom Spinner nastavujeme
vytvorený adaptér volaním metódy setAdapter()
.
Pri druhom Spinner definujeme akciu po zvolení jednej z položiek menu
rovnako ako u prvého Spinner ai tu bude zvolený text zobrazený v príslušnom
TextView
pod Spinner. V nasledujúcej ukážke kódu si ukážeme
ďalšie dve možné varianty získanie dát zo zvolenej položky v prepísané
metóde onItemSelected()
. Využijeme toho, že máme zoznam
položiek uložený v zvláštnej premennej list
mimo adaptér, ako
bolo spomenuté vyššie:
labelCustomItemText.setText(list.get((int) id).toString());
alebo:
labelCustomItemText.setText(list.get(position).toString());
Požadovanú hodnotu získame priamo z premennej list
. Správny
index tejto položky získame buď pomocou premennej id
(nutná
typová konverzia z typu long
na typ int
) a alebo
pomocou premennej position
. Tieto dve premenné získame z
parametrov prepísané metódy onItemSelected()
.
Týmto sme dokončili druhú časť ukážkové aplikácie s druhým Spinner
a už vieme upravovať vzhľad TextView
jeho položiek. Projekt s
prvými dvoma Spinner je k stiahnutiu pod lekcií.
V budúcej lekcii, Spinner - Príprava pre vytvorenie obrázkových položiek , si pripravíme XML a vlastné Java triedu pre Spinner s obrázkami položiek.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 9x (1.47 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Java