pole.text.toString()
Pracownia programowania aplikacji mobilnych · zajęcia 2 · klasa IV

Formularze — aplikacja przyjmuje dane

Aplikacja zaczyna przyjmować dane od użytkownika.

Dziś: 2 × (teoria + Wasz kod), na koniec pizzeria jak z arkusza.
Teoria 1

Formularz = serce egzaminu

Spójrzcie na zadania mobilne z INF.04: zawsze ten sam szkielet — użytkownik coś wybiera i wpisuje, aplikacja liczy i pokazuje wynik.

EditText

pole tekstowe — liczby, imiona, ilości

RadioButton

JEDNA opcja z kilku (rozmiar, wariant)

CheckBox

wiele opcji naraz (dodatki, zgody)

Button + logika

klik zbiera dane, liczy, pokazuje wynik

Plan: najpierw pola i liczby (kalkulator BMI), potem wybory (pizzeria z cennikiem — mini-arkusz INF.04).
Teoria 1

EditText — pole tekstowe

Do makiety (wewnątrz LinearLayout), po jednym polu na daną:

<EditText                                  <- pole do wpisywania
    android:id="@+id/poleWaga"             <- imię — po nim znajdzie je kod
    android:layout_width="match_parent"    <- na całą szerokość
    android:layout_height="wrap_content"
    android:hint="Waga w kg"               <- szara podpowiedź w środku
    android:inputType="number" />          <- klawiatura TYLKO z cyframi
inputType to pierwsza linia obrony: przy number użytkownik nawet nie MOŻE wpisać liter. Inne warianty: text, phone, textEmailAddress, numberDecimal.
Szare dopiski ze strzałką to objaśnienia — nie przepisujemy ich do XML.
Teoria 1

Odczyt pola i walidacja w Kotlinie

val poleWaga = findViewById<EditText>(R.id.poleWaga)

przycisk.setOnClickListener {
    val tekst = poleWaga.text.toString()   // zawartość pola JAKO String
    val waga = tekst.toIntOrNull()         // Int albo null — znacie to!

    if (waga == null || waga !in 20..300) {   // walidacja jak w arkuszu
        Toast.makeText(this, "Podaj wagę!",
            Toast.LENGTH_SHORT).show()
    } else {
        wynik.text = "Waga: $waga kg"         // dalej normalne liczenie
    }
}
Pułapka dnia: pole.text to NIE String (to Editable). Zawsze .toString() zanim cokolwiek policzymy. Zapomnisz — czerwony błąd.
Pytanie kontrolne: co się stanie po kliknięciu, gdy pole jest puste? Prześledź linia po linii.
Praktyka 1 · ~40 min

Praktyka 1: kalkulator BMI

1Kalkulator BMI

  • dwa pola: waga (kg), wzrost (cm) — oba inputType="number"
  • przycisk „Oblicz” i TextView na wynik
  • puste/absurdalne dane → Toast, bez liczenia
  • wynik: BMI z jednym miejscem po przecinku
val m = wzrost / 100.0
val bmi = waga / (m * m)
wynik.text =
    "BMI: %.1f".format(bmi)
dzielenie przez 100.0 (nie 100!) daje liczbę z przecinkiem

★Dla szybkich

  • interpretacja przez when: poniżej 18.5 „niedowaga”, 18.5–24.9 „norma”, wyżej „nadwaga”
  • wynik + interpretacja w jednym TextView
Teoria 2

RadioButton — jedna opcja z kilku

Przyciski wkładamy do RadioGroup — pojemnik pilnuje, że zaznaczona jest tylko jedna:

<RadioGroup                                <- pojemnik na opcje
    android:id="@+id/grupaRozmiar"         <- odczytamy go w kodzie
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <RadioButton android:id="@+id/mala"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Mała (20 zł)"
        android:checked="true" />          <- zaznaczona na starcie

    ... tak samo: sredniaR (30 zł) i duza (40 zł) ...
</RadioGroup>
CheckBox wygląda tak samo jak RadioButton — tylko bez pojemnika, bo każdy działa osobno.
Teoria 2

Odczyt wyborów w Kotlinie

val grupa = findViewById<RadioGroup>(R.id.grupaRozmiar)
val chSer = findViewById<CheckBox>(R.id.chSer)

var cena = when (grupa.checkedRadioButtonId) {   // KTÓRE id zaznaczone?
    R.id.mala     -> 20
    R.id.sredniaR -> 30
    else          -> 40                          // duża
}

if (chSer.isChecked) cena += 3        // checkbox: true albo false
if (chSzynka.isChecked) cena += 5     // każdy dodatek osobno

wynik.text = "Do zapłaty: $cena zł"
Rozpoznajecie? when i szablony stringów z lekcji Kotlina — tu w akcji. Formularz to zawsze: zbierz wartości → policz → pokaż.
Pytanie kontrolne: dlaczego cena to var, a nie val?
Praktyka 2 · ~70 min

Praktyka 2: Pizzeria (mini-arkusz)

2Pizzeria — specyfikacja

  • rozmiar (RadioGroup): mała 20 / średnia 30 / duża 40 zł
  • dodatki (CheckBox): ser +3, pieczarki +4, szynka +5
  • ilość pizz (EditText, number), poprawna: 1–10
  • przycisk „Zamów”: cena = (rozmiar + dodatki) × ilość

✓Kryteria jak na egzaminie

  • zła ilość → Toast i BRAK liczenia
  • wynik w TextView: „Do zapłaty: … zł”
  • aplikacja nie pada przy pustym polu
  • czytelny kod: sensowne nazwy id i zmiennych

★Dla szybkich

  • wystylizuj ekran wg specyfikacji kolorów (tło beżowe, przyciski brązowe) — na egzaminie za dokładne kolory są punkty
  • plus Toast z podsumowaniem zamówienia
Awarie

SOS — dzisiejsze pułapki

ObjawCo robisz
text.toIntOrNull() nie działabrakuje .toString() — pole.text.toString().toIntOrNull()
when nie widzi R.id....literówka w id — porównaj z XML co do znaku
cena zawsze za dużą pizzęsprawdź, czy w when są id wszystkich RadioButtonów
apka pada po kliknięciuLogcat: pierwsza czerwona linia z MainActivity — tam numer linii
Zasada bez zmian: najpierw Logcat i sąsiad, potem nauczyciel.
Podsumowanie

Zapamiętaj

EditText

pole.text.toString(), potem toIntOrNull() — walidacja zamiast crasha.

RadioGroup vs CheckBox

RadioGroup = jedna opcja (checkedRadioButtonId + when), CheckBox = wiele (isChecked).

inputType to nie walidacja

ogranicza klawiaturę, ale sprawdzenia w kodzie nie zastępuje.

Schemat egzaminu: zbierz dane → sprawdź → policz → pokaż wynik.
Następne zajęcia: losowość i obrazki — budujemy „Grę w kości” z prawdziwego arkusza INF.04.