IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 3 - Android Intenty a aktivity - SumActivity - Java kód

V minulé lekci, Android Intenty a aktivity - SumActivity - Součet čísel, jsme si připravili GUI aktivity pro součet 2 čísel.

V Java tutoriálu si napíšeme kód Android aktivity SumActivity, používající explicitní intent pro otevření druhé aktivity s obousměrnou výměnou dat mezi nimi. Než začneme psát Java kód SumActivity, vytvoříme rozhraní pro deklarace všech konstant ukázkové aplikace Activities.

V aplikaci máme totiž několik aktivit a nechceme každé definovat konstanty zvlášť. Některé budou určitě potřebovat ty samé. Proto je definujeme centrálně v jednom rozhraní.

Rozhraní pro konstanty

Ve struktuře projektu klikneme pravým tlačítkem na složku (viz. obrázek) a v menu přes New na Java Class:

Android Intenty a aktivity

V otevřeném okně New Java Class do jediného políčka napíšeme AppConstants. Pod políčkem vybereme možnost Interface a potvrdíme klávesou Enter :

Android Intenty a aktivity

Bude vytvořen soubor AppConstants.java:

public interface AppConstants {

}

Do tohoto souboru budeme postupně přidávat konstanty, použité v projektu.

Konstanta LOG_TAG

Hned přidáme konstantu pro tag zpráv Logcatu:

public interface AppConstants {
    String LOG_TAG = "Activities_log_tag";
}

Takto můžeme pak snadno poznat naše logy.

Přístup ke konstantám

Přístup ke konstantám je možný dvěma způsoby. První způsob je přímo, například voláním:

String tag = AppConstants.LOG_TAG;

Nebo může třída, ve které konstantu potřebujeme, implementovat rozhraní AppConstants, čímž získá přístup ke všem jeho konstantám:

public class MyClass implements AppConstants {
    String tag = LOG_TAG;
}

Aktivita SumActivity.java

Vraťme se zpět k aktivitě SumActivity. Nyní upravíme její Java kód na následující:

public class SumActivity extends AppCompatActivity {
    EditText etNumber1, etNumber2;      // Políčko pro zadání čísel k součtu
    Button btnSend;                     // Tlačítko pro odeslní čísel do SumResultActivity
    TextView labelResult;               // Label pro zobrazení vráceného součtu zadaných čísel

    int number1, number2;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.sum_activity);
        setTitle(R.string.sum_activity_title);

        etNumber1 = findViewById(R.id.etNumber1);
        etNumber2 = findViewById(R.id.etNumber2);
        labelResult = findViewById(R.id.labelResult);
        btnSend = findViewById(R.id.btnSend);

        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    number1 = Integer.parseInt(etNumber1.getText().toString());
                    number2 = Integer.parseInt(etNumber2.getText().toString());
                    sendData();
                } catch (NumberFormatException e) {
                    showErrorToast();
                } catch (NullPointerException e) {
                    showErrorToast();
                }
            }
        });
    }

    private void showErrorToast() {
        Toast.makeText(this, R.string.info_incorrect_entry, Toast.LENGTH_LONG).show();
    }
}

Pojďme si jej vysvětlit:

Kliknutí na tlačítko

V ActivityMain.java jsme události kliknutí nastavili příslušnými parametry tlačítek v XML a deklarací obslužné metody v Java kódu. Zde to děláme pro změnu pouze Java kódem, přesněji přiřazením OnClickListener komponentám, na kterých budeme kliknutí očekávat. Nastavení listeneru zde provádíme inline anonymní třídou. Na tomto přístupu není nic špatného, ale má nevýhodu ve větším množství Java kódu a v nemožnosti kód znovu použít.

Kliknutím na tlačítko Odeslat k výpočtu zadaná čísla odesíláme do aktivity SumResultActivity, jejímž úkolem je čísla sečíst a výsledek odeslat zpět do aktivity SumActivity. Zadání uživatele v políčkách EditText převádíme z typu String na typ int voláním metody parseInt() třídy Integer.

Během konverze může, v případě, že zadaný text obsahuje znak, který není číslicí, dojít k výjimce NumberFormatException. To je první ze dvou důvodů, proč je tato část kódu "zabalena" do bloku try - catch. Druhým důvodem je fakt, že řádek etNumberOne.getText().toString() může vyvolat výjimku NullPointerException. Zmíněné případné výjimky tedy odchytáváme a můžeme na ně reagovat, aniž by došlo k pádu aplikace.

Otevření aktivity pro součet zadaných čísel

Po úspěšné konverzi vstupu voláme metodu sendData(). Přidejme si ji do třídy:

private void sendData() {

}

Metodu zatím necháme prázdnou. Po vytvoření aktivity SumResultActivity (pro samotný součet čísel) kód metody sendData() doplníme.

Úprava Java kódu hlavní aktivity

Nyní, když máme hotovou aktivitu SumActivity, doplníme v MainActivity kus kódu do první větve konstrukce switch v metodě click(). Tímto bude první tlačítko s textem Součet čísel ukázkové aplikace funkční. Metoda click() bude nyní vypadat takto:

public void click(View view) {
    switch (view.getId()) {
        case R.id.btnSumActivity:
            Intent intentSumActivity = new Intent(MainActivity.this, SumActivity.class);
            startActivity(intentSumActivity);
            break;
        case R.id.btnMapActivity:
            break;
        case R.id.btnPhoneActivity:
            break;
        case R.id.btnPhotoActivity:
            break;
        case R.id.btnShareActivity:
            break;
        case R.id.btnITnetwork:
            Intent webIntent = new Intent(Intent.ACTION_VIEW);
            webIntent.setData(Uri.parse("https://www.itnetwork.cz/"));

            if (webIntent.resolveActivity(getPackageManager()) != null) {
                startActivity(webIntent);
            }
            break;
    }
}

V doplněné první větvi přepínače switch, v prvním řádku, vytváříme explicitní intent pro otevření aktivity SumActivity. V druhém řádku tuto aktivitu, voláním metody startActivity(), otevíráme. Voláním metody startActivity() otevíráme aktivitu, která nebude po svém ukončení odesílat žádná data. Výše popsaný nový způsob získávání dat ze zavřené aktivity se tedy netýká tohoto případu.

Připomeňme si, že metoda click() je námi deklarovaná metoda a v XML návrhu hlavní aktivity je všem tlačítkům nastavena jako obsluha události kliknutí takto: android:onClick="click".

V následujícím kvízu, Kvíz - Nastavení vzhledu aktivity a intenty v Androidu, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.


 

Předchozí článek
Android Intenty a aktivity - SumActivity - Součet čísel
Všechny články v sekci
Android Intenty a aktivity
Přeskočit článek
(nedoporučujeme)
Kvíz - Nastavení vzhledu aktivity a intenty v Androidu
Článek pro vás napsal Pavel
Avatar
Uživatelské hodnocení:
3 hlasů
Autor se věnuje programování v Javě, hlavně pro Android. Mezi jeho další zájmy patří Arduino, Minecraft.
Aktivity