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

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

ONEbit hosting 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ém tutoriálu o tvorbě Android aplikací v Javě 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.

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

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

public class calcActivity extends ActionBarActivity {

        TextView Obraz;
        TextView Cislo1;
        TextView Cislo2;
        TextView Operace;

}

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();//skryje vrchní lištu
        setContentView(R.layout.activity_calc);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); //zabrání změnám orientace

        Obraz=(TextView)findViewById(R.id.Obrazovka);
        Obraz.setText("0");

        Cislo1=(TextView)findViewById(R.id.Cislo1);
        Cislo1.setText("NaN");

        Cislo2=(TextView)findViewById(R.id.Cislo2);
        Cislo2.setText("NaN");

        Operace=(TextView)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í záznamu s jakou metodou chce uživatel počítat.
  • Boolean proměnné prosel a C1Nastaven jsou pro řídící účeli 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.

Přejděme k metodě ZapisCislo(). Logika této metody je popsána v předchozím dílu. 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(pom>=9 && prosel==false){
                        if(number==0){
                                Obraz.setText("0");
                                return;
                        }
                        else{
                                Obraz.setText(tlac.getText());
                                prosel = true;
                        }
                }
                return;
        }
        if(prosel == false){

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

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

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.indexOf(hled)<0) {
                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.

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("...");
}

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;
        }
}

Dostáváme se k mětodě 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.indexOf(hled)!=-1) {
                test=test.replace("-","");
                Obraz.setText(test);
                return;
        }
        else{
                if (test.length()<=8) {
                        test="-"+test;
                        Obraz.setText(test);
                }
        }
}

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ě, 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ří Hlavík
Avatar
Jak se ti líbí článek?
11 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
Aktivity (1)

 

 

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

Avatar
d0d0s8.rv
Člen
Avatar
d0d0s8.rv:11.6.2015 11:07

To jsem zkousel a nic :/

 
Odpovědět 11.6.2015 11:07
Avatar
dirtyjobs
Člen
Avatar
Odpovídá na d0d0s8.rv
dirtyjobs:11.6.2015 14:10

Špatná cesta ke zdrojům, několikrát tam musíš změnit cestu, mám dojem, že ten projekt co je ke stažení nelze jen tak zkopírovat a buildnout.

 
Odpovědět 11.6.2015 14:10
Avatar
d0d0s8.rv
Člen
Avatar
Odpovídá na dirtyjobs
d0d0s8.rv:14.6.2015 11:09

Ten jsem ani puvodne nestahoval az kdyz me to furt neslo, ale uz to jede zkousel sem par veci z netu ani si nejsem ted jistej co zabralo jak sem toho zkousel tolik :D ale tusim, ze to zaclo jit po tom co jsem zmenil neco v nastaveni verze Buid tools.

 
Odpovědět 14.6.2015 11:09
Avatar
Blaze
Člen
Avatar
Blaze:26.9.2015 11:44

Som slepy alebo ozaj tu nieje ten archiv so zdrojovym kodom?

 
Odpovědět 26.9.2015 11:44
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na Blaze
Taskkill:26.9.2015 12:53

Archiv je v následující lekci - komplet.

 
Odpovědět  +2 26.9.2015 12:53
Avatar
Drezir
Člen
Avatar
Drezir:28.10.2015 16:18

Asi to bude tím, že metoda onCreate() inicializuje komponenty, takže až po inicializaci můžeš získávat komponenty. Nicméně globální úroveň z toho jde taky udělat tak, že jen deklaruješ objekty a pak k nim přiřadíš hodnotu.

 
Odpovědět 28.10.2015 16:18
Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:1.9.2016 21:48

Blbě se mi ty tvoje tutoriály čtou. Víc se mi líbí styl David Čápka, který je víc step by step.

 
Odpovědět  +6 1.9.2016 21:48
Avatar
Neaktivní uživatel:1.9.2016 22:12

Takový tip - pokud píšeš v Javě, existují jakési obecné konvence, které jakkoliv jsou nepsané by se alespoň pro tutoriály ze kterých se někdo případně učí měly dodržovat. Mezi to patří například jmenné konvence - třídy psát UpperCamelCase, parametry a metody lowerCamelCase, konstanty CONSTANT_CASE. Dále horizontální whitespace - mezi hodnotami u operátorů, mezi složenými závorkami a definicí bloku, mezi klíčovým slovem a závorkami. Kód je špatně odsazený, špatně se čte, má nesmyslné prázdné řádky. Zkus na tomto zapracovat a opravit to. Většina těchto obecných pravidel je přenesených do Googlovského stylu Java kódu (https://google.github.io/…vaguide.html) - zkus se tam inspirovat.

Odpovědět 1.9.2016 22:12
Neaktivní uživatelský účet
Avatar
Jan Praks
Člen
Avatar
Jan Praks:21. července 17:38

Nejak mi nejde zdedit od tridy ActionBarActivity, nevite co muze byt chybou?

 
Odpovědět 21. července 17:38
Avatar
Vít Vohralík:2. září 18:31

Je to celkem nepřehledný hlavně ta minulá lekce mělo by to být víc step by step

 
Odpovědět 2. září 18:31
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 14. Zobrazit vše