IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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 a c1Nastaven 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 :)


 

Predchádzajúci článok
Android programovanie - Prvá aplikácia, návrh kalkulačky
Všetky články v sekcii
Programovanie Android aplikácií v Jave
Preskočiť článok
(neodporúčame)
Android programovanie - Dokončenie implementácia kalkulačky
Článok pre vás napísal Jiří Frank
Avatar
Užívateľské hodnotenie:
1 hlasov
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
Aktivity