Geek tričko zdarma Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde

Lekce 5 - Android programování - Implementace Java kódu kalkulačky

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Android programování - První aplikace, návrh kalkulačky, jsme se věnovali návrhu jednoduché kalkulačky. Nyní se pustíme do oživení celé aplikace pomocí Java kódu. Výhodou je, že všechny potřebné knihovny k jednotlivým widgetům nám Android Studio samo přidá v průběhu psaní kódu. Bude nám stačit jedna třída s několika metodami.

Vytvoření třídy

Jako první si vytvoříme třídu a přidáme několik potřebných objektů TextView (pro zobrazování dat).

V kódu nebudu uvádět komentáře, jelikož si metody popisujeme v článku. V archivu ke stažení pod příštím článkem bude kompletní okomentovaný Java kód.

public class calcActivity extends AppCompatActivity {

    private TextView obraz;
    private TextView cislo1;
    private TextView cislo2;
    private TextView operace;
}

onCreate()

V onCreate() provedeme inicializaci objektů TextView (pro zobrazování dat). Parametr savedInstanceState je při prvním spuštění aplikace null. Slouží pro ukládání dat, například při změně orientace:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();
    setContentView(R.layout.activity_main);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

    obraz = findViewById(R.id.obrazovka);
    obraz.setText("0");

    cislo1 = findViewById(R.id.cislo1);
    cislo1.setText("NaN");

    cislo2 = findViewById(R.id.cislo2);
    cislo2.setText("NaN");

    operace = findViewById(R.id.znamenko);

    operace.setText("...");
}

Dále přidáme několik privátních proměnných:

private boolean prosel = false;
private boolean c1Nastaven = false;

private double c1;
private double c2;
private double vys;
private int metoda = 0;
  • Privátní proměnné c1, c2, vys slouží k ukládání čísel.
  • Proměnná metoda slouží pro uchování jakou metodou chce uživatel počítat.
  • boolean proměnné prosel a c1Nastaven jsou pro řídící účely aplikace. Pomocí nich ošetřujeme možné problémy se zadáváním čísel a ujištění se, že máme zadáno c1, když chceme počítat dál.

Metody

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Nyní začneme implementovat postupně metody, které jsme si již představili v minulé lekci.

zapisCislo()

Přejděme k metodě zapisCislo(). Logika této metody je popsána v předchozí lekci. Detailní algoritmus se nachází na diagramu.

public void zapisCislo(View sender) {
    Button tlac = (Button) sender;
    float number = Float.parseFloat(tlac.getText().toString());

    int pom = obraz.length();
    if (pom >= 9) {

        if (!prosel) {
            if (number == 0) {
                obraz.setText("0");
                return;
            } else {
                obraz.setText(tlac.getText());
                prosel = true;
            }
        }
        return;
    }
    if (!prosel) {
        if (number != 0) {
            obraz.setText(tlac.getText());
            prosel = true;
        }
    } else {
        obraz.append(tlac.getText());
    }
}

Díky parametru sender dostaneme ID tlačítka, na které uživatel klikl.

zapisCarku()

Dodejme metodu pro zápis desetinné čárky:

public void zapisCarku(View v) {
    if (obraz.getText().length() >= 8) {
        return;
    }
    String test = obraz.getText().toString();
    String hled = ".";
    if (!test.contains(hled)) {
        obraz.append(".");
        prosel = true;
    }
}

Metoda se ukončí, pokud je na obrazovce už více než 8 znaků. Pokud se . na obrazovce nenachází, přidá ji na konec řetězce a nastaví true u řídící proměnné prosel. Parametr nám zajistí viditelnost této metody, abychom k ní mohli přistoupit z XML, tzn. metoda onClick().

vymazVse()

Přidejme metodu, která vynuluje všechny použité proměnné i zobrazovací TextView:

public void vymazVse(View v) {
    prosel = false;
    c1 = 0;
    c2 = 0;
    vys = 0;
    metoda = 5;

    obraz.setText("0");
    cislo1.setText("NaN");
    cislo2.setText("NaN");
    operace.setText("...");
}

vymazJeden()

Další metoda na základě délky řetězce buď smaže poslední znak, anebo nastaví TextView obraz na "0".

public void vymazJeden(View v) {
    int delka = obraz.length();

    if (delka > 1) {
        String puvodnistring = obraz.getText().toString();
        String substring = puvodnistring.substring(0, delka - 1);
        obraz.setText(substring);
    } else if (delka > 0) {
        obraz.setText("0");
        prosel = false;
    }
}

zapor()

Dostáváme se k metodě na tlačítku +/-. Pokud je na obrazovce 0, nestane se nic. Načteme řetězec a zjistíme na jaké pozici je "-". Pokud výsledek není -1, nahradíme znak "-" prázdným řetězcem "". Pokud jsou souřadnice znaménka "-" <= 8, připíšeme "-" na začátek řetězce.

public void zapor(View v) {
    float k = Float.parseFloat(obraz.getText().toString());
    if (k == 0) {
        return;
    }
    String test = obraz.getText().toString();
    String hled = "-";

    if (test.contains(hled)) {
        test = test.replace("-", "");
        obraz.setText(test);
    } else {
        if (test.length() <= 8) {
            test = "-" + test;
            obraz.setText(test);
        }
    }
}

odmocni()

Jako další je na řadě odmocnění. Protože budeme odmocňovat, je třeba vymazat všechny proměnné. Pokud bude výsledek delší než 9 znaků, vytvoříme substring prvních 9 čísel. Pomocí podmínek ošetříme, aby se nezobrazovala nežádoucí čísla:

public void odmocni(View v) {
    double number = Math.sqrt(Double.parseDouble(obraz.getText().toString()));
    vymazVse(v);

    if (number >= 0) {
        String vysledek = (String.valueOf(number));

        if (vysledek.length() >= 9) {
            String substring = vysledek.substring(0, 9);
            if (substring.equals("1.0000000") || substring.equals("0.9999998") || substring.equals("0.9999999")) {
                obraz.setText("1");
                return;
            } else {
                obraz.setText(substring);
                return;
            }
        }
        if (number != 0) {
            Double zbav = Double.parseDouble(vysledek);
            int zbav2 = (int) Math.round(zbav);
            obraz.setText(String.valueOf(zbav2));
        } else {
            obraz.setText("0");
        }
    } else {
        Toast.makeText(this, "Nelze odmocnit záporné číslo!", Toast.LENGTH_LONG).show();
        vymazVse(v);
    }
}

Třídu dokončíme příště v lekci Android programování - Dokončení implementace kalkulačky, kdy přidáme metody pro jednotlivé aritmetické operace a konečně metodu pro vypočítání výsledku. Také naši aplikaci nahrajeme do telefonu a vyzkoušíme :)


 

 

Článek pro vás napsal Jiří Frank
Avatar
Jak se ti líbí článek?
12 hlasů
Autor se věnuje programování v C# a vývoji aplikací pro platformu Android a dalším věcem spojeným s Android OS
Předchozí článek
Android programování - První aplikace, návrh kalkulačky
Všechny články v sekci
Programování Android aplikací v Javě
Miniatura
Následující článek
Android programování - Dokončení implementace kalkulačky
Aktivity (4)

 

 

Komentáře
Zobrazit starší komentáře (17)

Avatar
Libor Šimo (libcosenior):9.10.2018 20:02

Wau, stalo sa mi, že som niečo testoval a určite som nemal niečo košér, ale že mi to zmazalo veľkú časť kódu, to som vážne nečakal. Tiež riešenie. Keď si debil, píš všetko znovu a nauč sa to poriadne. :-D

Odpovědět 9.10.2018 20:02
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):9.10.2018 20:03

Zatiaľ výsledky nič moc, ale zááááábava. :-D

Odpovědět 9.10.2018 20:03
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):9.10.2018 20:05

import android.app.Ac­tivity;

public class MainActivity extends Activity {
....

Odpovědět 9.10.2018 20:05
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):26.10.2018 21:17

Prišiel som na ďalšiu srandu.
V prílohe je kus kódu, ktorý označuje premennú R ako neplatnú. Nedivím sa. Nikde nie je definovaná.
Je zaujímavé, že pred časom mi to fungovalo aj bez definície a deklarácie R.

Odpovědět 26.10.2018 21:17
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Libor Šimo (libcosenior)
Petr Štechmüller:26.10.2018 21:19

Ahoj, R je automaticky generovaná třída. R znamená resources a obsahuje unikátní identifikátory na všechny resourcy přiložené k projektu.

Odpovědět 26.10.2018 21:19
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Libor Šimo (libcosenior):26.10.2018 21:26

Príloha, zabudol som.

Odpovědět 26.10.2018 21:26
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Petr Štechmüller
Libor Šimo (libcosenior):26.10.2018 21:27

Tk potom nechápem, prečo mi ju farbí na červeno ako chybu.

Odpovědět 26.10.2018 21:27
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovědět 26.10.2018 21:29
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Petr Štechmüller
Libor Šimo (libcosenior):28.10.2018 11:23

Bolo to tým, že som v android studiu otvoril projekt, ktorý používal nesprávny layout.

Odpovědět 28.10.2018 11:23
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:15. května 14:53

Konvence v článku byly aktualizovány.

Odpovědět 15. května 14:53
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 27. Zobrazit vše