5. diel - Android programovanie - Implementácia Java kódu kalkulačky
V minulej lekcii, Android programovanie - Prvá aplikácia, návrh kalkulačky , sme sa venovali návrhu jednoduché kalkulačky. Teraz sa pustíme do oživenia celej aplikácie pomocou Java kódu. Výhodou je, že všetky potrebné knižnice k jednotlivým widgetom nám Android Studio samo pridá v priebehu písania kódu. Bude nám stačiť jedna trieda s niekoľkými metódami.
Vytvorenie triedy
Ako prvý si vytvoríme triedu a pridáme niekoľko potrebných objektov
TextView
(pre zobrazovanie dát).
V kóde nebudem uvádzať komentáre, pretože si metódy opisujeme v článku. V archíve k stiahnutiu pod budúcom článkom 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()
vykonáme inicializáciu objektov
TextView
(pre zobrazovanie dát). Parameter
savedInstanceState
je pri prvom spustení aplikácie
null
. Slúži na ukladanie dát, napríklad pri zmene
orientácie:
@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("..."); }
Ďalej pridáme niekoľko privátnych premenných:
private boolean prosel = false; private boolean c1Nastaven = false; private double c1; private double c2; private double vys; private int metoda = 0;
- Privátne premenné
c1
,c2
,vys
slúži na ukladanie čísel. - Premenná
metoda
slúži pre uchovanie akou metódou chce užívateľ počítať. boolean
premennéprosel
ac1Nastaven
sú pre riadiace účely aplikácie. Pomocou nich ošetrujeme možné problémy so zadávaním čísiel a uistenie sa, že máme zadanéc1
, keď chceme počítať ďalej.
Metódy
Teraz začneme implementovať postupne metódy, ktoré sme si už predstavili v minulej lekcii.
ZapisCislo ()
Prejdime k metóde zapisCislo()
. Logika tejto metódy je
popísaná v predchádzajúcej lekcii. Detailné algoritmus sa nachádza na
diagrame.
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()); } }
Vďaka parametra sender
dostaneme ID tlačidla, na ktoré
užívateľ klikol.
ZapisCarku ()
Dodajme metódu pre zápis desatinnej čiarky:
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; } }
Metóda sa ukončí, pokiaľ je na obrazovke už viac ako 8 znakov. Ak sa
.
na obrazovke nenachádza, pridá ju na koniec reťazca a nastaví
true
u riadiacej premennej prosel
. Parameter nám
zaistí viditeľnosť tejto metódy, aby sme k nej mohli pristúpiť z XML, tzn.
metóda onClick()
.
VymazVse ()
Pridajme metódu, ktorá vynuluje všetky použité premenné aj zobrazovacie
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 ()
Ďalšia metóda na základe dĺžky reťazca buď zmaže posledný znak,
alebo 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; } }
Zápory ()
Dostávame sa k metóde na tlačidle +
/ -
. Ak je
na obrazovke 0
, nestane sa nič. Načítame reťazec a zistíme na
akej pozícii je "-"
. Ak výsledok nie je -1
,
nahradíme znak "-"
prázdnym reťazcom ""
. Ak sú
súradnice znamienka "-"
<= 8
, pripíšeme
"-"
na začiatok reťazca.
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 ()
Ako ďalšie je na rade odmocnění. Pretože budeme odmocňovat, je potrebné vymazať všetky premenné. Ak bude výsledok dlhší ako 9 znakov, vytvoríme substring prvých 9 čísel. Pomocou podmienok ošetríme, aby sa nezobrazovala nežiaduce čí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); } }
Triedu dokončíme nabudúce v lekcii Android programovanie - Dokončenie implementácia kalkulačky , kedy pridáme metódy pre jednotlivé aritmetické operácie a konečne metódu pre vypočítanie výsledku. Tiež naši aplikáciu nahráme do telefónu a vyskúšame