Przejdź do głównej treści
INF.04-02-25.01-SGStyczeń 2025 · 24 kroki · ok. 70 min · 35 kryteriów z klucza

Rozwiązanie krok po kroku: Obsługa urządzeń domowych (Java + Android)

Rozwiązujemy arkusz z urządzeniami domowymi w wersji Java + Android Studio: w konsoli klasa bazowa urządzenia z metodą wyświetlającą komunikat i dwie klasy potomne - pralka, która przyjmuje tylko programy 1-12, i odkurzacz, który włącza się i wyłącza tylko wtedy, gdy zmienia stan; w aplikacji mobilnej ekran „Urządzenia Domowe” z obrazami pralki i odkurzacza z archiwum pliki4.zip, polem numeru prania i przyciskiem, który przełącza odkurzacz. Do tego nagłówek metody według wzoru z arkusza, zrzuty i dokument egzamin.

Kroki idą zdanie po zdaniu za treścią arkusza - każdy zaczyna się poleceniem z arkusza, a kod pokazuje dokładnie te linie, które je spełniają. Najpierw piszemy najprostszą wersję, której wymaga klucz, a w etapie „Dobre praktyki” poprawiamy to, czego klucz nie sprawdza.

Co widać w podglądzie. Wyniki programu konsolowego pochodzą z prawdziwego uruchomienia kodu z danego kroku (JDK 21) dla danych z obrazów 1 i 2 arkusza. Ekran telefonu to symulacja w przeglądarce zbudowana z pliku XML danego kroku, z obrazami z pliki4.zip; jej zachowanie odpowiada kodowi Javy z kroku - wpisz numer prania, kliknij „Zatwierdź” i „Włącz”. Każdy stan aplikacji zbudowaliśmy też w Android Studio (Gradle) i sprawdziliśmy na emulatorze Pixel 8.

Arkusz pozwala też na C++, C# albo Pythona w konsoli i na .NET MAUI w części mobilnej - ten wariant to jedna z możliwych dróg.

Jak liczą się punkty. Klucz ma 35 kryteriów (R.1.1 - R.4.8), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 27 punktów - można stracić 8 kryteriów i nadal zdać. Przy każdym kroku jest napisane, które kryteria spełnia; egzaminator ocenia spełnienie kryteriów z klucza, nie zgodność z tym kodem.

  1. Etap 1: Przygotowanie

    Krok 1 · po tym etapie masz 0 z 35 kryteriów (pkt)

    Krok 1: Folder zdającego, podfoldery i obrazy z pliki4.zip

    ok. 2 min
    Polecenie z arkusza

    Utwórz folder i nazwij go numerem zdającego. W folderze utwórz podfoldery: konsolowa, mobilna, dokumentacja. Do wykonania zadania należy wykorzystać obrazy zawarte w archiwum pliki4.zip zabezpieczonym hasłem: Int3rn3tOfThingS

    Na pulpicie zakładamy folder o nazwie z numerem PESEL, a w nim konsolowa, mobilna i dokumentacja - w tym arkuszu folder konsoli nazywa się konsolowa, nie konsola. Archiwum pliki4.zip rozpakowujemy hasłem z arkusza (wielkość liter ma znaczenie): pralka.jpg i odkurzacz.jpg, oba 300 × 300 pikseli.

  2. Etap 2: Aplikacja konsolowa

    Kroki 2-9 · po tym etapie masz 18 z 35 kryteriów (pkt)

    Krok 2: Projekt konsola w Javie

    ok. 3 min
    Polecenie z arkusza

    Napisz program implementujący klasę i dwie klasy potomne, który obsługuje działanie urządzeń domowych. Program wykonywany w konsoli. Zastosowany obiektowy język programowania zgodny z zainstalowanym na stanowisku egzaminacyjnym: C++ lub C#, lub Java, lub Python.

    Wybieramy Javę - tę samą, w której napiszemy aplikację mobilną. W IntelliJ IDEA: New Project → Java, nazwa konsola. Każda z trzech klas trafi do osobnego pliku - w Javie klasa publiczna leży w pliku o swojej nazwie.

    konsola/src/Main.java Java nowy plik
    public class Main {
        public static void main(String[] args) {
        }
    }
  3. Krok 3: Klasa bazowa Device i metoda showMessage

    Kryteria: ,

    R.2.2 Klasa bazowa implementuje metodę o zasięgu public, która wyświetla treść komunikatu. Komunikat jest argumentem metody. Metoda nie zwraca wartości

    R.1.3 Użyte polskie lub angielskie, znaczące nazewnictwo klas, metod, obiektów

    ok. 2 min
    Polecenie z arkusza

    Program zawiera klasę bazową reprezentującą urządzenie oraz dwie klasy potomne reprezentujące pralkę oraz odkurzacz. Wymaganie do klasy bazowej: implementuje jedną ogólnodostępną metodę, która wyświetla treść komunikatu. Komunikat jest argumentem metody. Metoda nie zwraca wartości.

    Klasa bazowa Device (urządzenie) ma jedną metodę public (ogólnodostępną), void (nic nie zwraca), z parametrem String message - komunikat do wypisania (R.2.2, R.1.3). Klasy potomne odziedziczą ją i będą wypisywać przez nią swoje komunikaty.

    konsola/src/Device.java Java nowy plik
    public class Device {
        public void showMessage(String message) {
            System.out.println(message);
        }
    }
  4. Krok 4: Klasa WashingMachine: prywatny numer programu i setProgram

    Kryteria: , , ,

    R.2.3 Klasa pralki definiuje pole numeru programu typu całkowitego o zakresie private, inicjowane wartością 0 oraz klasa odkurzacza definiuje pole stanu odkurzacza typu logicznego o zasięgu private, inicjowane wartością fałsz. (W języku Python, dla pola typu private, dwa podkreślniki przed nazwą)

    R.2.4 Klasa implementuje metodę ustawienia numeru programu o zakresie public. Argumentem metody jest numer programu. Gdy numer programu jest liczbą z przedziału od 1 do 12 metoda ustawia na tą wartość pole numeru programu. W przeciwnym wypadku pole jest ustawione na wartość 0. Metoda zwraca wartość pola numeru programu

    R.1.4 Użyte polskie lub angielskie, znaczące nazewnictwo pól i zmiennych. Wyjątkami od reguły są zmienne: bufor, tmp, iteratory pętli itp. Kryterium nie jest spełnione tylko wtedy, gdy nazwy zmiennych nic nie znaczą, np.: x, fun, foo, tab, tablica

    R.1.5 Zastosowane typy zmiennych pasujące do problemu (np. typ boolowski jako stan, typ liczb całkowitych jako program pralki, typ tekstowy dla komunikatu ) W przypadku języka Python typ wynika z przypisanych danych

    ok. 4 min
    Polecenie z arkusza

    Wymagania do klasy reprezentującej pralkę: definiuje pole przechowujące numer programu prania, który jest liczbą całkowitą. Pole inicjowane jest wartością 0. Instancje klasy nie mają dostępu do pola, pole nie jest widoczne w klasach dziedziczących po klasie pralki. Implementuje ogólnodostępną metodę do ustawienia numeru programu prania. Argumentem metody jest numer programu. Gdy jest on liczbą z przedziału od 1 do 12, metoda ustawia pole określające numer programu na tą wartość. W przeciwnym wypadku pole jest ustawione na wartość 0. Metoda zwraca wartość pola numeru programu.

    extends Device - pralka jest urządzeniem i dziedziczy showMessage (R.2.1).

    • Pole private int programNumber = 0: niewidoczne z zewnątrz i w klasach potomnych - to właśnie znaczy private (R.2.3, R.1.5).
    • setProgram sprawdza przedział warunkiem number >= 1 && number <= 12 - oba końce należą do przedziału. W przeciwnym razie ustawia 0, a na końcu zwraca wartość pola - typ zwracany int (R.2.4).

    Program główny pozna po wyniku, czy numer został przyjęty: 0 oznacza niepoprawny.

    Typowe błędy

    protected int programNumber - pole jest wtedy widoczne w klasach potomnych pralki, a arkusz tego zabrania (R.2.3).

    konsola/src/WashingMachine.java Java nowy plik
    public class WashingMachine extends Device {
        private int programNumber = 0;
    
        public int setProgram(int number) {
            if (number >= 1 && number <= 12) {
                programNumber = number;
            } else {
                programNumber = 0;
            }
            return programNumber;
        }
    }
  5. Krok 5: Klasa VacuumCleaner: stan i metoda on()

    Kryteria: , ,

    R.2.3 Klasa pralki definiuje pole numeru programu typu całkowitego o zakresie private, inicjowane wartością 0 oraz klasa odkurzacza definiuje pole stanu odkurzacza typu logicznego o zasięgu private, inicjowane wartością fałsz. (W języku Python, dla pola typu private, dwa podkreślniki przed nazwą)

    R.2.5 Klasa odkurzacza implementuje przynajmniej jedną metodę o zakresie public: on()lub off(). Metoda nie zwraca wartości i jest bezargumentowa. Ustawiany jest odpowiedni stan odkurzacza

    R.2.6 Metody on() lub off() wywołują metodę do wyświetlenia komunikatu lub wyświetlają komunikat o włączeniu lub wyłączeniu odkurzacza, tylko wtedy, gdy jego stan uległ zmianie

    ok. 3 min
    Polecenie z arkusza

    Wymagania do klasy reprezentującej odkurzacz: definiuje pole reprezentujące stan odkurzacza, które jest typu logicznego, inicjowane wartością false. Pole dostępne tylko w tej klasie, niedostępne w klasach potomnych. Implementuje ogólnodostępną bezargumentową metodę on(), która włącza odkurzacz. Metoda nie zwraca wartości. Włączenie polega na ustawieniu pola stanu na wartość true oraz wywołaniu metody klasy bazowej z komunikatem „Odkurzacz włączono”. Zmiana stanu i komunikat mogą być wykonane tylko i wyłącznie, gdy odkurzacz jest wyłączony.

    Pole private boolean isOn = false - false to wyłączony (R.2.3). Metoda on(): public void, bez parametrów (R.2.5).

    Najważniejszy jest warunek if (!isOn): stan zmieniamy i komunikat wypisujemy tylko wtedy, gdy odkurzacz był wyłączony (R.2.6). Drugie wywołanie on() na włączonym odkurzaczu nic nie zrobi. showMessage to metoda odziedziczona z Device - wywołujemy ją wprost.

    Typowe błędy

    on() bez warunku - przy trzech wywołaniach komunikat „Odkurzacz włączono” pojawia się trzy razy (R.2.10).

    konsola/src/VacuumCleaner.java Java nowy plik
    public class VacuumCleaner extends Device {
        private boolean isOn = false;
    
        public void on() {
            if (!isOn) {
                isOn = true;
                showMessage("Odkurzacz włączono");
            }
        }
    }
  6. Krok 6: Metoda off(): tylko gdy odkurzacz jest włączony

    Kryteria: , , ,

    R.2.5 Klasa odkurzacza implementuje przynajmniej jedną metodę o zakresie public: on()lub off(). Metoda nie zwraca wartości i jest bezargumentowa. Ustawiany jest odpowiedni stan odkurzacza

    R.2.6 Metody on() lub off() wywołują metodę do wyświetlenia komunikatu lub wyświetlają komunikat o włączeniu lub wyłączeniu odkurzacza, tylko wtedy, gdy jego stan uległ zmianie

    R.1.1 Kod źródłowy zapisany w sposób czytelny: instrukcje w osobnych liniach, stosowane spacje pomiędzy operatorami, konsekwentnie stosowana wybrana konwencja dla nawiasów klamrowych

    R.1.2 Kod zapisany z wcięciami dla zagnieżdżeń bloków

    ok. 2 min
    Polecenie z arkusza

    Implementuje ogólnodostępną bezargumentową metodę off(), która wyłącza odkurzacz. Metoda nie zwraca wartości. Wyłączenie polega na ustawieniu pola stanu na wartość false oraz wywołaniu metody klasy bazowej z komunikatem „Odkurzacz wyłączono”. Zmiana stanu i komunikat mogą być wykonane tylko i wyłącznie, gdy odkurzacz jest włączony.

    Lustrzane odbicie on(): warunek if (isOn) - wyłączamy i wypisujemy komunikat tylko wtedy, gdy odkurzacz pracuje (R.2.5, R.2.6).

    konsola/src/VacuumCleaner.java Java zmienione: 7 linii
    public class VacuumCleaner extends Device {
        private boolean isOn = false;
    
        public void on() {
            if (!isOn) {
                isOn = true;
                showMessage("Odkurzacz włączono");
            }
        }
    
        public void off() {
            if (isOn) {
                isOn = false;
                showMessage("Odkurzacz wyłączono");
            }
        }
    }
  7. Krok 7: Program główny: dwa obiekty i test pralki

    Kryteria: , ,

    R.2.1 Program składa się z programu głównego oraz trzech klas, jednej bazowej i dwóch dziedziczących po niej. W programie głównym są powoływane obiekty obu klas potomnych oraz wywołano na ich rzecz co najmniej jedną metodę

    R.2.8 Program pyta o numer prania i wczytuje liczbę. Dla liczb 1..12 wyświetlony jest komunikat o ustawieniu programu, dla pozostałych o niepoprawnym numerze programu

    R.1.7 Program podejmuje komunikację z użytkownikiem, wyświetlane komunikaty są znaczące

    ok. 3 min
    Polecenie z arkusza

    Wymagania do programu głównego: należy zainicjować dwa obiekty typu pralka i odkurzacz. Na obiekcie typu pralka należy przetestować ustawienie programu prania z wartościami poprawnymi i niepoprawnymi. Powinny być wyświetlone odpowiednie komunikaty, patrz obrazy 1 i 2.

    Tworzymy po jednym obiekcie każdej klasy potomnej (R.2.1). Numer prania wczytujemy z klawiatury i przekazujemy do setProgram. Wynik różny od 0 oznacza, że program został przyjęty (R.2.8). Wszystkie komunikaty wypisujemy odziedziczoną metodą showMessage - tak jak na obrazach 1 i 2 (R.1.7).

    Podgląd to dwa prawdziwe uruchomienia z danymi z obrazów: 11 (poprawny) i 44 (niepoprawny).

    konsola/src/Main.java Java zmienione: 13 linii
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            WashingMachine washingMachine = new WashingMachine();
            VacuumCleaner vacuumCleaner = new VacuumCleaner();
    
            Scanner scanner = new Scanner(System.in);
            washingMachine.showMessage("Podaj numer prania 1..12");
            int number = scanner.nextInt();
            if (washingMachine.setProgram(number) != 0) {
                washingMachine.showMessage("Program został ustawiony");
            } else {
                washingMachine.showMessage("Podano niepoprawny numer programu");
            }
        }
    }
    Wynik programu po tym kroku
    > java Main
    Podaj numer prania 1..12
    11
    Program został ustawiony
    
    > java Main
    Podaj numer prania 1..12
    44
    Podano niepoprawny numer programu
  8. Krok 8: Program główny: trzy razy on(), wyładowanie, off()

    Kryteria: ,

    R.2.9 Program wyświetla komunikat o wyładowaniu odkurzacza

    R.2.10 Niezależnie od następujących po sobie kilku wywołaniach metody on() tylko raz wyświetlany jest komunikat o włączeniu odkurzacza lub w przypadku metody off() o wyłączeniu odkurzacza

    ok. 2 min
    Polecenie z arkusza

    Na obiekcie typu odkurzacz należy: wywołać metodę on() trzykrotnie; mimo trzykrotnego wywołania tylko raz wyświetla się komunikat – patrz obraz 1. Wywołać metodę klasy bazowej z treścią: „Odkurzacz wyładował się”. Wywołać metodę off().

    Trzy wywołania on() - komunikat pojawia się raz, bo za drugim i trzecim razem odkurzacz jest już włączony (R.2.10). Komunikat o wyładowaniu wypisujemy metodą klasy bazowej wywołaną na obiekcie odkurzacza (R.2.9), na końcu off(). Wynik jest identyczny z obrazem 1 i obrazem 2.

    konsola/src/Main.java Java zmienione: 6 linii
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            WashingMachine washingMachine = new WashingMachine();
            VacuumCleaner vacuumCleaner = new VacuumCleaner();
    
            Scanner scanner = new Scanner(System.in);
            washingMachine.showMessage("Podaj numer prania 1..12");
            int number = scanner.nextInt();
            if (washingMachine.setProgram(number) != 0) {
                washingMachine.showMessage("Program został ustawiony");
            } else {
                washingMachine.showMessage("Podano niepoprawny numer programu");
            }
    
            vacuumCleaner.on();
            vacuumCleaner.on();
            vacuumCleaner.on();
            vacuumCleaner.showMessage("Odkurzacz wyładował się");
            vacuumCleaner.off();
        }
    }
    Wynik programu po tym kroku
    > java Main
    Podaj numer prania 1..12
    11
    Program został ustawiony
    Odkurzacz włączono
    Odkurzacz wyładował się
    Odkurzacz wyłączono
    
    > java Main
    Podaj numer prania 1..12
    44
    Podano niepoprawny numer programu
    Odkurzacz włączono
    Odkurzacz wyładował się
    Odkurzacz wyłączono
  9. Krok 9: Folder konsolowa: archiwum, źródła i zrzuty

    Kryteria: , ,

    R.1.6 Podjęta próba uruchomienia kodu, co udokumentowano zrzutem ekranowym przedstawiającym uruchomiony program lub jego kompilację

    R.2.7 Program uruchamia się w konsoli, co jest udokumentowane zrzutem ekranu

    R.4.6 Zapisany przynajmniej jeden zrzut ekranu z uruchomienia lub kompilacji aplikacji konsolowej, na zrzucie widoczne jest środowisko, w którym powstała aplikacja

    ok. 3 min
    Polecenie z arkusza

    Kod aplikacji przygotuj do nagrania na płytę. W podfolderze konsolowa powinno znaleźć się archiwum całego projektu o nazwie konsola.zip, skopiowany z projektu plik z kodem źródłowym programu oraz plik wykonywalny, jeżeli istnieje. Aplikacja konsolowa – dowolna liczba zrzutów nazwanych konsola1, konsola2, ...

    Dwa zrzuty całego ekranu z IntelliJ (widoczny pasek zadań): numer poprawny i niepoprawny - konsola1, konsola2 w folderze dokumentacja (R.1.6, R.2.7, R.4.6). Folder projektu pakujemy do konsola.zip (po dopisaniu komentarza z części III), obok kopiujemy cztery pliki .java.

    Wynik programu bez zmian - taki jak po kroku 8.

  10. Etap 3: Aplikacja mobilna

    Kroki 10-19 · po tym etapie masz 29 z 35 kryteriów (pkt)

    Krok 10: Nowy projekt Domowe i obrazy w drawable

    ok. 3 min
    Polecenie z arkusza

    Za pomocą środowiska programistycznego dostępnego na stanowisku egzaminacyjnym wykonaj aplikację mobilną do obsługi urządzeń domowych.

    New Project → szablon Empty Views Activity (z widokami w XML). Nazwa Domowe, pakiet com.example.domowe, język Java. Pliki pralka.jpg i odkurzacz.jpg kopiujemy do app/src/main/res/drawable - w XML będą dostępne jako @drawable/pralka i @drawable/odkurzacz (nazwy zasobów: małe litery, bez polskich znaków i myślników).

    Domowe/app/src/main/java/com/example/domowe/MainActivity.java Java nowy plik
    package com.example.domowe;
    
    import android.os.Bundle;
    
    import androidx.activity.EdgeToEdge;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.graphics.Insets;
    import androidx.core.view.ViewCompat;
    import androidx.core.view.WindowInsetsCompat;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            EdgeToEdge.enable(this);
            setContentView(R.layout.activity_main);
            ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
                Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                return insets;
            });
        }
    }
    Domowe/app/src/main/res/layout/activity_main.xml XML nowy plik
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  11. Krok 11: Pionowy LinearLayout w kolorze LightBlue

    Kryteria:

    R.3.1 Zastosowany język znaczników XML/XAML lub inny do opisu interfejsu użytkownika oraz zastosowany układ rozkładów liniowych wertykalnych i horyzontalnych (LinearLayout lub StackLayout, lub VerticalStackLayout i HorizontalStackLayout, lub inne o tej idei ) tak, aby układ ten był zgodny z obrazem 3 arkusza egzaminacyjnego (oceniane są tylko znaczniki rozkładu )

    ok. 2 min
    Polecenie z arkusza

    Interfejs użytkownika zapisany za pomocą języka znaczników wspieranego w danym środowisku (np. XAML, XML). Zastosowane rozkłady liniowe (Linear / Stack lub inny o tej idei), aby można było uzyskać widok taki jak na obrazach 3 i 4. Kolory tła: dla głównego rozkładu lub strony: LightBlue (#ADD8E6).

    W widoku Code zamieniamy ConstraintLayout na pionowy LinearLayout (R.3.1) z tłem #ADD8E6 (R.3.3) i zostawiamy android:id="@+id/main" (używa go kod szablonu).

    Plan układu z obrazów 3 i 4: pod dwoma napisami dwa poziome wiersze - po lewej obraz, po prawej pionowa kolumna z nazwą urządzenia, polem albo przyciskiem i napisami stanu.

    Domowe/app/src/main/res/layout/activity_main.xml XML zmienione: 4 linie
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ADD8E6"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  12. Krok 12: Napisy „Urządzenia Domowe” i „Autor:” na środku

    Kryteria: , ,

    R.3.2 Umieszczone: 2 etykiety „Urządzenia Domowe” i "autor: " z numerem zdającego, obrazy pralka.jpg i odkurzacz.jpg , napisy "Pralka", "Odkurzacz", pole edycyjne z podpowiedzią (placeholder lub hint ) i możliwością wpisania jedynie liczb, przyciski "Zatwierdź" i "Włącz" oraz pozostałe 3 napisy z opisem stanu urządzeń

    R.3.4 Zastosowana czcionka powiększona dla napisów "Urządzenia Domowe", "Pralka", "Odkurzacz", wyśrodkowane pierwsze dwa napisy oraz nadana wysokość 150 dla przynajmniej jednego obrazu

    R.3.5 Ustawione marginesy: 5 dla pierwszych dwóch napisów, 10 dla przycisków oraz dla obrazów lewy, prawy i dolny 20, górny 0

    ok. 3 min
    Polecenie z arkusza

    Napis (etykieta) o treści: „Urządzenia Domowe”. Napis o treści: „Autor: ”, dalej wstawiony numer zdającego. Marginesy zewnętrzne: dla pierwszych dwóch napisów 5. Tekst zapisany powiększoną czcionką dla napisów „Urządzenia Domowe”, „Pralka”, „Odkurzacz”. Pierwsze dwa napisy na stronie są wyśrodkowane.

    Oba napisy zajmują całą szerokość, a gravity="center" ustawia tekst na środku (R.3.4). Margines zewnętrzny layout_margin="5dp" (R.3.5). Tytuł ma powiększoną czcionkę 30sp (R.3.4).

    Na egzaminie po „Autor: ” wpisujemy numer PESEL - tu stoi Bartosz Bryniarski (R.3.2).

    Domowe/app/src/main/res/layout/activity_main.xml XML zmienione: 15 linii
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ADD8E6"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Urządzenia Domowe"
            android:textSize="30sp" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Autor: Bartosz Bryniarski" />
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  13. Krok 13: Wiersz pralki: obraz o wysokości 150

    Kryteria: , , ,

    R.3.1 Zastosowany język znaczników XML/XAML lub inny do opisu interfejsu użytkownika oraz zastosowany układ rozkładów liniowych wertykalnych i horyzontalnych (LinearLayout lub StackLayout, lub VerticalStackLayout i HorizontalStackLayout, lub inne o tej idei ) tak, aby układ ten był zgodny z obrazem 3 arkusza egzaminacyjnego (oceniane są tylko znaczniki rozkładu )

    R.3.2 Umieszczone: 2 etykiety „Urządzenia Domowe” i "autor: " z numerem zdającego, obrazy pralka.jpg i odkurzacz.jpg , napisy "Pralka", "Odkurzacz", pole edycyjne z podpowiedzią (placeholder lub hint ) i możliwością wpisania jedynie liczb, przyciski "Zatwierdź" i "Włącz" oraz pozostałe 3 napisy z opisem stanu urządzeń

    R.3.4 Zastosowana czcionka powiększona dla napisów "Urządzenia Domowe", "Pralka", "Odkurzacz", wyśrodkowane pierwsze dwa napisy oraz nadana wysokość 150 dla przynajmniej jednego obrazu

    R.3.5 Ustawione marginesy: 5 dla pierwszych dwóch napisów, 10 dla przycisków oraz dla obrazów lewy, prawy i dolny 20, górny 0

    ok. 3 min
    Polecenie z arkusza

    Rozkład dotyczący pralki: obraz pralka.jpg. Marginesy zewnętrzne: dla obrazów marginesy lewy, prawy i dolny 20, górny 0. Obrazy mają wysokość 150.

    Poziomy LinearLayout to wiersz pralki (R.3.1). Obraz ma wysokość 150dp (R.3.4) i marginesy 20dp z lewej, prawej i od dołu, 0 od góry (R.3.5).

    Szerokość wrap_content z adjustViewBounds="true" - kontrolka przyjmuje szerokość wynikającą z proporcji obrazu: obraz kwadratowy o wysokości 150dp ma szerokość 150dp. Bez adjustViewBounds szerokość wzięłaby się z rozmiaru pliku i obraz zostałby wyśrodkowany w szerszej ramce.

    Domowe/app/src/main/res/layout/activity_main.xml XML zmienione: 18 linii
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ADD8E6"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Urządzenia Domowe"
            android:textSize="30sp" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Autor: Bartosz Bryniarski" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="150dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="0dp"
                android:layout_marginEnd="20dp"
                android:layout_marginBottom="20dp"
                android:adjustViewBounds="true"
                android:contentDescription="Pralka"
                android:src="@drawable/pralka" />
    
        </LinearLayout>
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  14. Krok 14: Kolumna pralki: napis i pole tylko na liczby

    Kryteria: , ,

    R.3.2 Umieszczone: 2 etykiety „Urządzenia Domowe” i "autor: " z numerem zdającego, obrazy pralka.jpg i odkurzacz.jpg , napisy "Pralka", "Odkurzacz", pole edycyjne z podpowiedzią (placeholder lub hint ) i możliwością wpisania jedynie liczb, przyciski "Zatwierdź" i "Włącz" oraz pozostałe 3 napisy z opisem stanu urządzeń

    R.3.3 Zastosowane kolory tła: dla głównego rozkładu lub strony: LightBlue (#ADD8E6), dla pola edycyjnego: SkyBlue (#87CEEB), dla przycisków: RoyalBlue (#4169E1) oraz kolor czcionki i kolor podpowiedzi Navy (#000080) dla pola edycyjnego (w MAUI nazwy kolorów obowiązkowo wielką literą )

    R.3.4 Zastosowana czcionka powiększona dla napisów "Urządzenia Domowe", "Pralka", "Odkurzacz", wyśrodkowane pierwsze dwa napisy oraz nadana wysokość 150 dla przynajmniej jednego obrazu

    ok. 3 min
    Polecenie z arkusza

    Napis o treści: „Pralka”. Pole edycyjne z podpowiedzią o treści: „Podaj nr prania 1..12” umożliwiające wpisywanie jedynie liczb. Kolory tła: dla pola edycyjnego: SkyBlue (#87CEEB). Kolor czcionki wpisanego tekstu oraz czcionki podpowiedzi dla pola edycyjnego: Navy (#000080).

    Obok obrazu zagnieżdżona pionowa kolumna; layout_width="0dp" z layout_weight="1" - zajmie całą szerokość, jaka zostanie obok obrazu. W niej:

    • „Pralka” powiększoną czcionką 24sp (R.3.4),
    • pole z podpowiedzią i android:inputType="number" - klawiatura pokaże same cyfry, liter nie da się wpisać (R.3.2),
    • tło pola #87CEEB, kolor tekstu textColor i kolor podpowiedzi textColorHint - oba #000080 (R.3.3). To dwa osobne atrybuty: samo textColor podpowiedzi nie zmienia.

    Tło ustawione kolorem zastępuje domyślne podkreślenie pola - zostaje jednolity błękitny prostokąt, jak na obrazie 4.

    Typowe błędy

    Brak textColorHint - podpowiedź zostaje szara, choć arkusz wymaga koloru Navy (R.3.3).

    Domowe/app/src/main/res/layout/activity_main.xml XML zmienione: 24 linie
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ADD8E6"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Urządzenia Domowe"
            android:textSize="30sp" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Autor: Bartosz Bryniarski" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="150dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="0dp"
                android:layout_marginEnd="20dp"
                android:layout_marginBottom="20dp"
                android:adjustViewBounds="true"
                android:contentDescription="Pralka"
                android:src="@drawable/pralka" />
    
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Pralka"
                    android:textSize="24sp" />
    
                <EditText
                    android:id="@+id/washInput"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="#87CEEB"
                    android:hint="Podaj nr prania 1..12"
                    android:inputType="number"
                    android:textColor="#000080"
                    android:textColorHint="#000080" />
    
            </LinearLayout>
    
        </LinearLayout>
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  15. Krok 15: Przycisk „Zatwierdź” i napis numeru prania

    Kryteria: , ,

    R.3.2 Umieszczone: 2 etykiety „Urządzenia Domowe” i "autor: " z numerem zdającego, obrazy pralka.jpg i odkurzacz.jpg , napisy "Pralka", "Odkurzacz", pole edycyjne z podpowiedzią (placeholder lub hint ) i możliwością wpisania jedynie liczb, przyciski "Zatwierdź" i "Włącz" oraz pozostałe 3 napisy z opisem stanu urządzeń

    R.3.3 Zastosowane kolory tła: dla głównego rozkładu lub strony: LightBlue (#ADD8E6), dla pola edycyjnego: SkyBlue (#87CEEB), dla przycisków: RoyalBlue (#4169E1) oraz kolor czcionki i kolor podpowiedzi Navy (#000080) dla pola edycyjnego (w MAUI nazwy kolorów obowiązkowo wielką literą )

    R.3.5 Ustawione marginesy: 5 dla pierwszych dwóch napisów, 10 dla przycisków oraz dla obrazów lewy, prawy i dolny 20, górny 0

    ok. 2 min
    Polecenie z arkusza

    Przycisk o treści: „Zatwierdź”. Napis o treści: „Numer prania: nie podano”. Kolory tła: dla przycisków: RoyalBlue (#4169E1). Marginesy zewnętrzne: dla przycisków 10.

    Przycisk z tłem #4169E1 przez backgroundTint (w Material 3 zwykłe background przycisk ignoruje) i marginesem 10dp ze wszystkich stron (R.3.3, R.3.5). Pod nim napis washText - kod zmieni go po zatwierdzeniu numeru.

    Domowe/app/src/main/res/layout/activity_main.xml XML zmienione: 14 linii
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ADD8E6"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Urządzenia Domowe"
            android:textSize="30sp" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Autor: Bartosz Bryniarski" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="150dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="0dp"
                android:layout_marginEnd="20dp"
                android:layout_marginBottom="20dp"
                android:adjustViewBounds="true"
                android:contentDescription="Pralka"
                android:src="@drawable/pralka" />
    
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Pralka"
                    android:textSize="24sp" />
    
                <EditText
                    android:id="@+id/washInput"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="#87CEEB"
                    android:hint="Podaj nr prania 1..12"
                    android:inputType="number"
                    android:textColor="#000080"
                    android:textColorHint="#000080" />
    
                <Button
                    android:id="@+id/washButton"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dp"
                    android:backgroundTint="#4169E1"
                    android:text="Zatwierdź" />
    
                <TextView
                    android:id="@+id/washText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Numer prania: nie podano" />
    
            </LinearLayout>
    
        </LinearLayout>
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  16. Krok 16: Wiersz odkurzacza: obraz, napis, „Włącz” i dwa napisy stanu

    Kryteria: ,

    R.3.1 Zastosowany język znaczników XML/XAML lub inny do opisu interfejsu użytkownika oraz zastosowany układ rozkładów liniowych wertykalnych i horyzontalnych (LinearLayout lub StackLayout, lub VerticalStackLayout i HorizontalStackLayout, lub inne o tej idei ) tak, aby układ ten był zgodny z obrazem 3 arkusza egzaminacyjnego (oceniane są tylko znaczniki rozkładu )

    R.3.2 Umieszczone: 2 etykiety „Urządzenia Domowe” i "autor: " z numerem zdającego, obrazy pralka.jpg i odkurzacz.jpg , napisy "Pralka", "Odkurzacz", pole edycyjne z podpowiedzią (placeholder lub hint ) i możliwością wpisania jedynie liczb, przyciski "Zatwierdź" i "Włącz" oraz pozostałe 3 napisy z opisem stanu urządzeń

    ok. 3 min
    Polecenie z arkusza

    Rozkład dotyczący odkurzacza: obraz odkurzacz.jpg. Napis o treści: „Odkurzacz”. Przycisk o treści: „Włącz”. Napis o treści: „Odkurzacz wyłączony”. Napis o treści: „Status: naładowany”. Rozmieszczenie elementów zgodne z obrazami 3 i 4.

    Drugi poziomy wiersz ma tę samą budowę co wiersz pralki (R.3.1): obraz 150dp z tymi samymi marginesami, kolumna z napisem 24sp, przyciskiem w kolorze RoyalBlue z marginesem 10dp i dwoma napisami. Napis stanu ma identyfikator vacuumStateText, a przycisk vacuumButton - kod zmieni oba (R.3.2). Ekran ma wszystkie elementy z obrazu 4.

    Domowe/app/src/main/res/layout/activity_main.xml XML zmienione: 51 linii
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ADD8E6"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Urządzenia Domowe"
            android:textSize="30sp" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Autor: Bartosz Bryniarski" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="150dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="0dp"
                android:layout_marginEnd="20dp"
                android:layout_marginBottom="20dp"
                android:adjustViewBounds="true"
                android:contentDescription="Pralka"
                android:src="@drawable/pralka" />
    
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Pralka"
                    android:textSize="24sp" />
    
                <EditText
                    android:id="@+id/washInput"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="#87CEEB"
                    android:hint="Podaj nr prania 1..12"
                    android:inputType="number"
                    android:textColor="#000080"
                    android:textColorHint="#000080" />
    
                <Button
                    android:id="@+id/washButton"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dp"
                    android:backgroundTint="#4169E1"
                    android:text="Zatwierdź" />
    
                <TextView
                    android:id="@+id/washText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Numer prania: nie podano" />
    
            </LinearLayout>
    
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="150dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="0dp"
                android:layout_marginEnd="20dp"
                android:layout_marginBottom="20dp"
                android:adjustViewBounds="true"
                android:contentDescription="Odkurzacz"
                android:src="@drawable/odkurzacz" />
    
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Odkurzacz"
                    android:textSize="24sp" />
    
                <Button
                    android:id="@+id/vacuumButton"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dp"
                    android:backgroundTint="#4169E1"
                    android:text="Włącz" />
    
                <TextView
                    android:id="@+id/vacuumStateText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Odkurzacz wyłączony" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Status: naładowany" />
    
            </LinearLayout>
    
        </LinearLayout>
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  17. Krok 17: „Zatwierdź”: numer prania z przedziału 1-12

    Kryteria: , ,

    R.3.6 Program obsługuje przynajmniej jedno zdarzenie kliknięcia przycisku w sposób właściwy dla danego środowiska programistycznego. Co najmniej jeden przycisk jest powiązany ze zdarzeniem

    R.3.7 Program pobiera wartości z co najmniej jednej konktrolki w sposób właściwy dla danego środowiska programistycznego

    R.3.8 Po wciśnięciu przycisku „Zatwierdź” pobierana jest liczba z pola edycyjnego, jeśli jest ona z przedziału od 1 do 12 to zmieniany jest napis poniżej na: „Numer prania: <numer>”, gdzie <numer> oznacza wartość podaną w polu edycyjnym (w uruchomionej aplikacji lub na zrzucie oraz obowiązkowo w kodzie )

    ok. 4 min
    Polecenie z arkusza

    Po wciśnięciu przycisku „Zatwierdź” pobierana jest liczba z pola edycyjnego, jeśli jest ona z przedziału od 1 do 12 to zmieniany jest napis poniżej na: „Numer prania: <numer>”, gdzie <numer> oznacza wartość podaną w polu edycyjnym (obraz 5).

    Metodę confirmWash wiążemy z przyciskiem atrybutem android:onClick (R.3.6). Tekst z pola pobieramy getText().toString() (R.3.7) i zamieniamy na liczbę Integer.parseInt. Przy pustym polu parseInt("") rzuciłby wyjątek i zatrzymał aplikację - stąd warunek !text.isEmpty(). Napis zmieniamy tylko dla liczb 1-12 (R.3.8); dla innych zostaje poprzedni.

    Wpisz w podglądzie 4 i kliknij „Zatwierdź” - jak na obrazie 5. Potem spróbuj 44.

    Typowe błędy

    Integer.parseInt bez sprawdzenia pustego pola - kliknięcie „Zatwierdź” przed wpisaniem liczby zatrzymuje aplikację z NumberFormatException.

    Domowe/app/src/main/java/com/example/domowe/MainActivity.java Java zmienione: 19 linii
    package com.example.domowe;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.TextView;
    
    import androidx.activity.EdgeToEdge;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.graphics.Insets;
    import androidx.core.view.ViewCompat;
    import androidx.core.view.WindowInsetsCompat;
    
    public class MainActivity extends AppCompatActivity {
    
        private EditText washInput;
        private TextView washText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            EdgeToEdge.enable(this);
            setContentView(R.layout.activity_main);
            ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
                Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                return insets;
            });
    
            washInput = findViewById(R.id.washInput);
            washText = findViewById(R.id.washText);
        }
    
        public void confirmWash(View view) {
            String text = washInput.getText().toString();
            if (!text.isEmpty()) {
                int number = Integer.parseInt(text);
                if (number >= 1 && number <= 12) {
                    washText.setText("Numer prania: " + number);
                }
            }
        }
    }
    Domowe/app/src/main/res/layout/activity_main.xml XML zmienione: 1 linia
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ADD8E6"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Urządzenia Domowe"
            android:textSize="30sp" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Autor: Bartosz Bryniarski" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="150dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="0dp"
                android:layout_marginEnd="20dp"
                android:layout_marginBottom="20dp"
                android:adjustViewBounds="true"
                android:contentDescription="Pralka"
                android:src="@drawable/pralka" />
    
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Pralka"
                    android:textSize="24sp" />
    
                <EditText
                    android:id="@+id/washInput"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="#87CEEB"
                    android:hint="Podaj nr prania 1..12"
                    android:inputType="number"
                    android:textColor="#000080"
                    android:textColorHint="#000080" />
    
                <Button
                    android:id="@+id/washButton"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dp"
                    android:backgroundTint="#4169E1"
                    android:onClick="confirmWash"
                    android:text="Zatwierdź" />
    
                <TextView
                    android:id="@+id/washText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Numer prania: nie podano" />
    
            </LinearLayout>
    
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="150dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="0dp"
                android:layout_marginEnd="20dp"
                android:layout_marginBottom="20dp"
                android:adjustViewBounds="true"
                android:contentDescription="Odkurzacz"
                android:src="@drawable/odkurzacz" />
    
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Odkurzacz"
                    android:textSize="24sp" />
    
                <Button
                    android:id="@+id/vacuumButton"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dp"
                    android:backgroundTint="#4169E1"
                    android:text="Włącz" />
    
                <TextView
                    android:id="@+id/vacuumStateText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Odkurzacz wyłączony" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Status: naładowany" />
    
            </LinearLayout>
    
        </LinearLayout>
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  18. Krok 18: „Włącz” / „Wyłącz”: przełączanie odkurzacza

    Kryteria: ,

    R.3.9 Po wciśnięciu przycisku „Włącz”, zmienia się podpis przycisku na „Wyłącz” oraz treść napisu poniżej na: „Odkurzacz włączony”. Jeżeli kolejny raz zostanie wciśnięty przycisk, napisy wracają do stanu początkowego („Włącz” oraz „Odkurzacz wyłączony”) (w uruchomionej aplikacji lub na zrzucie oraz obowiązkowo w kodzie )

    R.3.6 Program obsługuje przynajmniej jedno zdarzenie kliknięcia przycisku w sposób właściwy dla danego środowiska programistycznego. Co najmniej jeden przycisk jest powiązany ze zdarzeniem

    ok. 3 min
    Polecenie z arkusza

    Po wciśnięciu przycisku „Włącz”, zmienia się podpis przycisku na „Wyłącz” oraz treść napisu poniżej na: „Odkurzacz włączony”. Jeżeli kolejny raz zostanie wciśnięty przycisk, napisy wracają do stanu początkowego („Włącz” oraz „Odkurzacz wyłączony”) (obraz 6).

    Stan odkurzacza pamiętamy w polu boolean vacuumOn. Każde kliknięcie odwraca go: vacuumOn = !vacuumOn, a potem ustawia oba napisy według nowego stanu - podpis przycisku i opis pod nim (R.3.9). Metoda jest związana z przyciskiem przez android:onClick (R.3.6).

    Kliknij w podglądzie dwa razy - jak na obrazie 6 i z powrotem.

    Domowe/app/src/main/java/com/example/domowe/MainActivity.java Java zmienione: 17 linii
    package com.example.domowe;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    import androidx.activity.EdgeToEdge;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.graphics.Insets;
    import androidx.core.view.ViewCompat;
    import androidx.core.view.WindowInsetsCompat;
    
    public class MainActivity extends AppCompatActivity {
    
        private EditText washInput;
        private TextView washText;
        private Button vacuumButton;
        private TextView vacuumStateText;
        private boolean vacuumOn = false;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            EdgeToEdge.enable(this);
            setContentView(R.layout.activity_main);
            ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
                Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                return insets;
            });
    
            washInput = findViewById(R.id.washInput);
            washText = findViewById(R.id.washText);
            vacuumButton = findViewById(R.id.vacuumButton);
            vacuumStateText = findViewById(R.id.vacuumStateText);
        }
    
        public void confirmWash(View view) {
            String text = washInput.getText().toString();
            if (!text.isEmpty()) {
                int number = Integer.parseInt(text);
                if (number >= 1 && number <= 12) {
                    washText.setText("Numer prania: " + number);
                }
            }
        }
    
        public void toggleVacuum(View view) {
            vacuumOn = !vacuumOn;
            if (vacuumOn) {
                vacuumButton.setText("Wyłącz");
                vacuumStateText.setText("Odkurzacz włączony");
            } else {
                vacuumButton.setText("Włącz");
                vacuumStateText.setText("Odkurzacz wyłączony");
            }
        }
    }
    Domowe/app/src/main/res/layout/activity_main.xml XML zmienione: 1 linia
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ADD8E6"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Urządzenia Domowe"
            android:textSize="30sp" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Autor: Bartosz Bryniarski" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="150dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="0dp"
                android:layout_marginEnd="20dp"
                android:layout_marginBottom="20dp"
                android:adjustViewBounds="true"
                android:contentDescription="Pralka"
                android:src="@drawable/pralka" />
    
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Pralka"
                    android:textSize="24sp" />
    
                <EditText
                    android:id="@+id/washInput"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="#87CEEB"
                    android:hint="Podaj nr prania 1..12"
                    android:inputType="number"
                    android:textColor="#000080"
                    android:textColorHint="#000080" />
    
                <Button
                    android:id="@+id/washButton"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dp"
                    android:backgroundTint="#4169E1"
                    android:onClick="confirmWash"
                    android:text="Zatwierdź" />
    
                <TextView
                    android:id="@+id/washText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Numer prania: nie podano" />
    
            </LinearLayout>
    
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="150dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="0dp"
                android:layout_marginEnd="20dp"
                android:layout_marginBottom="20dp"
                android:adjustViewBounds="true"
                android:contentDescription="Odkurzacz"
                android:src="@drawable/odkurzacz" />
    
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Odkurzacz"
                    android:textSize="24sp" />
    
                <Button
                    android:id="@+id/vacuumButton"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dp"
                    android:backgroundTint="#4169E1"
                    android:onClick="toggleVacuum"
                    android:text="Włącz" />
    
                <TextView
                    android:id="@+id/vacuumStateText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Odkurzacz wyłączony" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Status: naładowany" />
    
            </LinearLayout>
    
        </LinearLayout>
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  19. Krok 19: Uruchomienie w emulatorze, zrzuty i folder mobilna

    Kryteria: ,

    R.3.10 Aplikacja uruchamia się w emulatorze, co jest udokumentowane zrzutem ekranu, jej układ jest zgodny z obrazem 3 w arkuszu egzaminacyjnym

    R.4.7 Zapisany przynajmniej jeden zrzut ekranu z uruchomienia lub kompilacji aplikacji mobilnej, na zrzucie widoczne jest środowisko, w którym powstała aplikacja

    ok. 4 min
    Polecenie z arkusza

    Aplikacja mobilna – dowolna liczba zrzutów nazwanych mobile1, mobile2, ... (np. stan początkowy, po wciśnięciu przycisku Zatwierdź”, po wciśnięciu przycisku „Włącz”, następnie „Wyłącz”). W podfolderze mobilna powinno znaleźć się archiwum całego projektu o nazwie mobilna.zip, skopiowane z projektu plik (lub pliki) z kodem źródłowym interfejsu użytkownika (XAML lub XML) oraz plik źródłowy kodu skojarzonego z interfejsem użytkownika.

    Uruchamiamy aplikację w emulatorze. Zrzuty całego ekranu z Android Studio do folderu dokumentacja: mobile1 - stan początkowy, mobile2 - po „Zatwierdź”, mobile3 - po „Włącz”, mobile4 - po „Wyłącz” (R.3.10, R.4.7). W folderze mobilna: mobilna.zip, activity_main.xml, MainActivity.java.

    Ekran telefonu bez zmian - taki jak po kroku 18.

  20. Etap 4: Dokumentacja

    Kroki 20-21 · po tym etapie masz 35 z 35 kryteriów (pkt)

    Krok 20: Nagłówek metody showMessage według listingu 1

    Kryteria: , , , ,

    R.4.1 Dla metody klasy bazowej z aplikacji konsolowej zapisany nagłówek w postaci komentarza zgodny z Listingiem 1 z arkusza egzaminacyjnego (nie liczymy gwiazdek ), komentarz może być wieloliniowy lub kilka jednoliniowych lub Docstrings (potrójny cudzysłów ) - w tym przypadku opis znajduje się pod nazwą metody

    R.4.2 W komentarzu podana: nazwa i opis działania metody

    R.4.3 W komentarzu podana: nazwa i opis wszystkich parametrów metody

    R.4.4 W przypadku gdy metoda zwraca wartość, podany w komentarzu opis tej wartości. W przeciwnym przypadku zapisany void, brak itp.

    R.4.5 W komentarzu podany numer zdającego

    ok. 4 min
    Polecenie z arkusza

    W kodzie źródłowym aplikacji konsolowej za pomocą komentarza utwórz nagłówek metody klasy bazowej, według wzoru z listingu 1. Komentarz powinien znaleźć się nad lub pod nazwą metody. W miejscu nawiasów <> należy podać odpowiednie opisy.

    Komentarz wieloliniowy nad metodą showMessage z polami listingu 1 (R.4.1): nazwa i opis działania (R.4.2), parametr message z opisem (R.4.3), typ zwracany - void, metoda nic nie zwraca (R.4.4) - i autor (R.4.5). Na egzaminie w polu autor wpisujemy numer PESEL - tu stoi Bartosz Bryniarski.

    konsola/src/Device.java Java zmienione: 9 linii
    public class Device {
        /*
         ******************************************************
          nazwa:     showMessage
          opis:      wyświetla w konsoli komunikat podany jako argument
          parametry: message - treść komunikatu do wyświetlenia
          zwracany typ i opis: void - metoda nic nie zwraca
          autor:     Bartosz Bryniarski
         ******************************************************
         */
        public void showMessage(String message) {
            System.out.println(message);
        }
    }
    Wynik programu po tym kroku
    > java Main
    Podaj numer prania 1..12
    11
    Program został ustawiony
    Odkurzacz włączono
    Odkurzacz wyładował się
    Odkurzacz wyłączono
  21. Krok 21: Dokument egzamin

    Kryteria:

    R.4.8 Dokumentacja zawiera wykorzystane oprogramowanie: nazwa systemu operacyjnego, środowiska programistycznych, emulator, języki programowania

    ok. 3 min
    Polecenie z arkusza

    W edytorze tekstu pakietu biurowego utwórz plik z dokumentacją i nazwij go egzamin. Dokument powinien zawierać informacje o wykorzystanych w czasie egzaminu narzędziach: nazwę systemu operacyjnego, nazwy środowisk programistycznych, nazwę emulatora dla aplikacji mobilnej, nazwy języków programowania.

    W Wordzie albo Writerze dokument egzamin w folderze dokumentacja: zrzuty, system, środowiska, emulator i języki (R.4.8).

    egzamin.txt Tekst nowy plik
    Zrzuty ekranu: konsola1 - numer poprawny (11); konsola2 - numer niepoprawny (44); mobile1 - stan początkowy; mobile2 - po Zatwierdź; mobile3 - po Włącz; mobile4 - po Wyłącz
    System operacyjny: Windows 11
    Środowiska programistyczne: IntelliJ IDEA (aplikacja konsolowa), Android Studio (aplikacja mobilna)
    Emulator: Pixel 8 (Android 16, API 36) z Android Studio
    Języki programowania: Java (aplikacja konsolowa i mobilna), XML (układ aplikacji mobilnej)

    Wynik programu bez zmian - taki jak po kroku 20.

  22. Etap 5: Dobre praktyki (poza kluczem)

    Kroki 22-23 · po tym etapie masz 35 z 35 kryteriów (pkt)

    Krok 22: Konsola: odporność na tekst zamiast liczby

    ok. 2 min
    Polecenie z arkusza

    Program powinien podejmować zrozumiałą komunikację z użytkownikiem.

    scanner.nextInt() na słowie „cztery” rzuca wyjątek InputMismatchException i kończy program. Pętla while (!scanner.hasNextInt()) pomija takie słowo i prosi ponownie.

    Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.

    konsola/src/Main.java Java zmienione: 4 linie
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            WashingMachine washingMachine = new WashingMachine();
            VacuumCleaner vacuumCleaner = new VacuumCleaner();
    
            Scanner scanner = new Scanner(System.in);
            washingMachine.showMessage("Podaj numer prania 1..12");
            while (!scanner.hasNextInt()) {
                scanner.next();   // pomijamy słowo, które nie jest liczbą całkowitą
                washingMachine.showMessage("To nie jest liczba. Podaj numer prania 1..12");
            }
            int number = scanner.nextInt();
            if (washingMachine.setProgram(number) != 0) {
                washingMachine.showMessage("Program został ustawiony");
            } else {
                washingMachine.showMessage("Podano niepoprawny numer programu");
            }
    
            vacuumCleaner.on();
            vacuumCleaner.on();
            vacuumCleaner.on();
            vacuumCleaner.showMessage("Odkurzacz wyładował się");
            vacuumCleaner.off();
        }
    }
    Wynik programu po tym kroku
    > java Main
    Podaj numer prania 1..12
    cztery
    To nie jest liczba. Podaj numer prania 1..12
    4
    Program został ustawiony
    Odkurzacz włączono
    Odkurzacz wyładował się
    Odkurzacz wyłączono
  23. Krok 23: Android: najwyżej dwie cyfry w polu numeru

    ok. 2 min
    Polecenie z arkusza

    Pole edycyjne z podpowiedzią o treści: „Podaj nr prania 1..12” umożliwiające wpisywanie jedynie liczb.

    inputType="number" wpuszcza tylko cyfry, ale nie ogranicza ich liczby. Jedenaście cyfr przekracza zakres typu int i Integer.parseInt zatrzymuje aplikację wyjątkiem NumberFormatException. Numer prania ma najwyżej dwie cyfry, więc android:maxLength="2" zamyka sprawę bez zmian w kodzie Javy.

    Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.

    Domowe/app/src/main/res/layout/activity_main.xml XML zmienione: 1 linia
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ADD8E6"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Urządzenia Domowe"
            android:textSize="30sp" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:gravity="center"
            android:text="Autor: Bartosz Bryniarski" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="150dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="0dp"
                android:layout_marginEnd="20dp"
                android:layout_marginBottom="20dp"
                android:adjustViewBounds="true"
                android:contentDescription="Pralka"
                android:src="@drawable/pralka" />
    
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Pralka"
                    android:textSize="24sp" />
    
                <EditText
                    android:id="@+id/washInput"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="#87CEEB"
                    android:hint="Podaj nr prania 1..12"
                    android:inputType="number"
                    android:maxLength="2"
                    android:textColor="#000080"
                    android:textColorHint="#000080" />
    
                <Button
                    android:id="@+id/washButton"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dp"
                    android:backgroundTint="#4169E1"
                    android:onClick="confirmWash"
                    android:text="Zatwierdź" />
    
                <TextView
                    android:id="@+id/washText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Numer prania: nie podano" />
    
            </LinearLayout>
    
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="150dp"
                android:layout_marginStart="20dp"
                android:layout_marginTop="0dp"
                android:layout_marginEnd="20dp"
                android:layout_marginBottom="20dp"
                android:adjustViewBounds="true"
                android:contentDescription="Odkurzacz"
                android:src="@drawable/odkurzacz" />
    
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Odkurzacz"
                    android:textSize="24sp" />
    
                <Button
                    android:id="@+id/vacuumButton"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dp"
                    android:backgroundTint="#4169E1"
                    android:onClick="toggleVacuum"
                    android:text="Włącz" />
    
                <TextView
                    android:id="@+id/vacuumStateText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Odkurzacz wyłączony" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Status: naładowany" />
    
            </LinearLayout>
    
        </LinearLayout>
    
    </LinearLayout>
    Ekran telefonu po tym kroku

    Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.

  24. Etap 6: Oddanie pracy

    Krok 24 · po tym etapie masz 35 z 35 kryteriów (pkt)

    Krok 24: Nagranie płyty

    ok. 5 min
    Polecenie z arkusza

    Nagraj płytę z rezultatami pracy. W folderze z numerem zdającego powinny się znajdować podfoldery: dokumentacja, konsolowa, mobilna.

    Sprawdzamy zawartość przed nagraniem:

    • konsolowa: konsola.zip (po dopisaniu komentarza), Device.java, WashingMachine.java, VacuumCleaner.java, Main.java,
    • mobilna: mobilna.zip, activity_main.xml, MainActivity.java,
    • dokumentacja: konsola1, konsola2, mobile1 - mobile4, egzamin.

    Nagrywamy, sprawdzamy odczyt płyty, opisujemy ją numerem zdającego.

    Ekran telefonu bez zmian - taki jak po kroku 23.

Podgląd

To jedno z możliwych rozwiązań. Egzaminator ocenia spełnienie kryteriów z klucza odpowiedzi, a nie zgodność z tym kodem - inna, poprawna droga też daje punkty.

Autor rozwiązania: . Licencja CC BY-NC 4.0 - kopiowanie i przeróbki do celów niekomercyjnych, z podaniem autora i źródła (link do tej strony). Treść arkusza i klucza oceniania pochodzi z CKE.