NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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ódu Spinner nastavit a reagovat na událost výběru položky v jeho menu.
  • labelCustomItemText - Proměnná je určena pro referenci komponenty TextView, 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

 

Předchozí článek
Vlastní Android Spinner - TextView položky - XML kód
Všechny články v sekci
Vlastní vzhled Android komponent
Přeskočit článek
(nedoporučujeme)
Vlastní Android Spinner - Příprava obrázkových položek
Článek pro vás napsal Pavel
Avatar
Uživatelské hodnocení:
4 hlasů
Autor se věnuje programování v Javě, hlavně pro Android. Mezi jeho další zájmy patří Arduino, Minecraft.
Aktivity