5. díl - Android programování - Implementace Java kódu kalkulačky

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

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


 

  Aktivity (1)

Článek pro vás napsal Jiří Hlavík
Avatar
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

Jak se ti líbí článek?
Celkem (6 hlasů) :
4444 4


 



 

 

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

Avatar
d0d0s8.rv
Člen
Avatar
d0d0s8.rv:

Cau, zacinam podle zdejsich tutotrialu ucit. projel jsem nejaky tutotrialy s javou a neco zkousel. Ale tady mi podle tohodle tutotrialu nejde kalkulacka vytvorit, v kodu:

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

My "R" zcervena a pise: cannot resolve symbol "R"
A pismeno R zcervena i kdyz kody kopiruju primo odsud. Jediny co jsem udelal jinak bylo ze jsem vybral API od verze 4.1. ActionBarActivity jsem mel preskrutnute. Nejsem moc dobrej anglictinar ale na internetu jsem nasel ze ActionBarActivity mam nahradit AppCompatActivity a tim se to vyresilo (i jine chyby) jen cervene R pretrvava. Zkousel jsem podle jednoho navodu jit do File>|Settings>Com­piler a odskrknout (zrusit fajfku) u "Use in-process build" a po té dát "Rebuild Project". Ani to nepomohlo a R.java se nevytvorilo a "R" v mem programu zustalo cervene. V anglictine jsem nasel snad desitky postupu jak to opravit ale jelikoz nejsem moc zbehli v anlictine a vubec zkouset vsechny by trvalo dlouho tak víte nekdo jak to opravit? Android studio jsem nainstaloval ted a zatím s tím mám jen problemy :D (hned nazacatku mi nesel mod Desing, psalo to, ze mam stahnout novejsi Android Studio, vyreseno nastavenim jineho Theme). Kdyby nekdo vedel jak na to byl bych vdecny. Diky moc a omlouvam se za chybejci diakritiku :).

 
Odpovědět 9.6.2015 21:04
Avatar
B42P6
Člen
Avatar
Odpovídá na d0d0s8.rv
B42P6:

Skús Build>Clean Project

Odpovědět 10.6.2015 23:26
'long long long' is too long for GCC
Avatar
d0d0s8.rv
Člen
Avatar
Odpovídá na B42P6
d0d0s8.rv:

To jsem zkousel a nic :/

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

Š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:

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:

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:

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

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

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:

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  +1 1. září 21:48
Avatar
Filip Šohajek
Redaktor
Avatar
Filip Šohajek:

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. září 22:12
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 12. Zobrazit vše