Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

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ří Frank
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 (16)

Avatar
Libor Šimo (libcosenior):8. října 8:02

Díky, vyskúšam to.

Odpovědět 8. října 8:02
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):9. října 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. října 20:02
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):9. října 20:03

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

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

import android.app.Ac­tivity;

public class MainActivity extends Activity {
....

Odpovědět 9. října 20:05
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):26. října 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. října 21:17
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Petr Štechmüller:26. října 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. října 21:19
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Libor Šimo (libcosenior):26. října 21:26

Príloha, zabudol som.

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

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

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

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

Odpovědět 28. října 11:23
Aj tisícmíľová cesta musí začať jednoduchým krokom.
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 26. Zobrazit vše