Aplikacja zaczyna przyjmować dane od użytkownika.
Spójrzcie na zadania mobilne z INF.04: zawsze ten sam szkielet — użytkownik coś wybiera i wpisuje, aplikacja liczy i pokazuje wynik.
pole tekstowe — liczby, imiona, ilości
JEDNA opcja z kilku (rozmiar, wariant)
wiele opcji naraz (dodatki, zgody)
klik zbiera dane, liczy, pokazuje wynik
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
number użytkownik nawet nie MOŻE wpisać liter. Inne warianty: text, phone, textEmailAddress, numberDecimal.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 } }
pole.text to NIE String (to Editable). Zawsze .toString() zanim cokolwiek policzymy. Zapomnisz — czerwony błąd.inputType="number"TextView na wynikToast, bez liczeniaval m = wzrost / 100.0 val bmi = waga / (m * m) wynik.text = "BMI: %.1f".format(bmi)
when: poniżej 18.5 „niedowaga”, 18.5–24.9 „norma”, wyżej „nadwaga”TextViewPrzyciski 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.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ł"
when i szablony stringów z lekcji Kotlina — tu w akcji. Formularz to zawsze: zbierz wartości → policz → pokaż.cena to var, a nie val?RadioGroup): mała 20 / średnia 30 / duża 40 złCheckBox): ser +3, pieczarki +4, szynka +5EditText, number), poprawna: 1–10Toast i BRAK liczeniaTextView: „Do zapłaty: … zł”Toast z podsumowaniem zamówienia| Objaw | Co robisz |
|---|---|
text.toIntOrNull() nie działa | brakuje .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ęciu | Logcat: pierwsza czerwona linia z MainActivity — tam numer linii |
pole.text.toString(), potem toIntOrNull() — walidacja zamiast crasha.
RadioGroup = jedna opcja (checkedRadioButtonId + when), CheckBox = wiele (isChecked).
ogranicza klawiaturę, ale sprawdzenia w kodzie nie zastępuje.