12. díl - Šibenice pro Android - Dokončení

Java Android Šibenice pro Android - Dokončení

V minulém tutoriálu o programování aplikací pro Android jsme dokončili hlavní aktivitu hry. V dnešním dílu dodáme aktivity pro konec hry a zobrazení skóre, čímž aplikace dokončíme.

EndGameActivity

Přesuňme se k aktivitě konce hry a rovnou připravme několik instančních proměnných. Budou to proměnné pro Score, informace o tom, zda v předchozí aktivitě hráč vyhrál nebo prohrál, hádané slovo a pro uložení score proměnná JmenoHrace.

public class EndGameActivity extends Activity {

    int ZaverecneScore;
    int VyhraNeboProhra;
    String JmenoHrace="";
    String UhadnuteSlovo="";

}

Tradičně dodejme jako první událost onCreate(). Hned po vykreslené layoutu a nastavení zákazu změn orientace se načtou hodnoty z buněk po přechodu za pomocí getIntent(). Zavolají se metody ZobrazScore() a NactiAnimaci().

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_end_game);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

        ZaverecneScore = getIntent().getIntExtra("ID_PROMENNE",0);
        UhadnuteSlovo = getIntent().getStringExtra("SLOVO").toUpperCase();
        VyhraNeboProhra = getIntent().getIntExtra("VYHRA_PROHRA",2);

        ZobrazScore();
        NactiAnimaci();

}

Na konci hry budeme chtít zobrazit závěrečnou animaci. Podle toho, zda hráč vyhrál nebo prohrál se do AnimationDrawable načtou určité snímky pro animaci a spustí se určitá hudba pomocí Objektu MediaPlayer.

V případě, že se z nějakého důvodu nepodaří získat hodnotu výhry nebo prohry (0,1) se zobrazí toast s textem „error“.

private void NactiAnimaci(){
        AnimationDrawable Anim = new AnimationDrawable();
        ImageView obr = (ImageView) findViewById(R.id.ZaverecnaPlocha);
        if (VyhraNeboProhra == 0){
                MediaPlayer mp = MediaPlayer.create(this, R.raw.loosegame);
                mp.start();

                Anim.addFrame(getResources().getDrawable(R.drawable.end1),1500);
                Anim.addFrame(getResources().getDrawable(R.drawable.end2),1500);
                Anim.addFrame(getResources().getDrawable(R.drawable.end3),1500);
                obr.setBackgroundDrawable(Anim);
                Anim.start();
        }
        else if (VyhraNeboProhra == 1){
                MediaPlayer mp = MediaPlayer.create(this, R.raw.wingame);
                mp.start();

                Anim.addFrame(getResources().getDrawable(R.drawable.v1),1000);
                Anim.addFrame(getResources().getDrawable(R.drawable.v2),1000);
                Anim.addFrame(getResources().getDrawable(R.drawable.v3),1000);
                Anim.addFrame(getResources().getDrawable(R.drawable.v4),1000);
                Anim.addFrame(getResources().getDrawable(R.drawable.v5),1000);
                Anim.addFrame(getResources().getDrawable(R.drawable.v6),1000);
                Anim.addFrame(getResources().getDrawable(R.drawable.v7),1000);
                obr.setBackgroundDrawable(Anim);
                Anim.start();
        }
        else{
                Toast.makeText(getApplicationContext(), "Někde je chyba",
                        Toast.LENGTH_LONG).show();
        }
}

V metodě ZobrazScore() zobrazíme uhádnuté slovo a hráčovo skóre:

public void ZobrazScore(){
        TextView PHs=(TextView) findViewById(R.id.Slovo);
        PHs.setText(UhadnuteSlovo);

        TextView TWs = (TextView) findViewById(R.id.Score);
        TWs.setText(String.valueOf(ZaverecneScore));
}

Přidáme uložení výsledků. Metoda UlozDoPameti() vytvoří/otevře SharedPreferences "VYSLEDKY", uloží současné výsledky a přidá k nim nový. Aby se vše uložilo, je třeba vytvořit SharedPreferen­ces.Editor (preeditor). Pomocí preeditoru složíme staré a nové score, následně potvrdíme preeditor metodou commit(), aby došlo ke změnám.

private void UlozDoPameti(){
        SharedPreferences preferences = getSharedPreferences("VYSLEDKY", MODE_PRIVATE);
        String SoucasneSkore = preferences.getString("VYSLEDKY", "");

        SharedPreferences.Editor preeditor = preferences.edit();

        preeditor.putString("VYSLEDKY", SoucasneSkore+JmenoHrace + ": " + ZaverecneScore + "\n");
        preeditor.commit();
        finish();
}

Obslužme tlačítko Uložit. Po kliknutí na něj se zobrazí dialog. Po odkliknutí "ano" se volá metoda UlozDoPameti(). Parametr View v je opět proto, aby metoda byla viditelná z xml souboru.

public void UlozScore(View v){
        EditText ET = (EditText) findViewById(R.id.ETl);
        JmenoHrace = ET.getText().toString();
        if (JmenoHrace.contains("\n")==false && JmenoHrace.length()>=3){
        AlertDialog.Builder NasDialog = new AlertDialog.Builder(this);
                // Vytvoření AlertDialog builderu
                NasDialog.setCancelable(true);
                /* setCancelable určuje, zda je možné dialog „zavřít“ zmáčknutím plochy kolem dialogu. Pokud je nastaveno false, uživatel MUSÍ vybrat některou z možností dialogu, jinak se nezavře. */
                NasDialog.setMessage("Uložit výsledky hráče:"+JmenoHrace+" ?");
                 /* setMessage nastavuje text, který se v dialogu zobrazí */
                NasDialog.setPositiveButton("Ano",
                                new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int id) {
                                                UlozDoPameti();
                                        }
                                });
                NasDialog.setNegativeButton("Ne",
                                new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int id) {
                                                Toast.makeText(getApplicationContext(), "Neuloženo",
                                                                Toast.LENGTH_LONG).show();
                                                dialog.cancel();
                                        }
                                });

                AlertDialog SpusteniDialogu = NasDialog.create();
                SpusteniDialogu.show();

        }
        else {
                Toast.makeText(getApplicationContext(), "Jméno musí mít alespoň 3 znaky !",
                                Toast.LENGTH_LONG).show();
        }
}

Nakonec přidáme ukončení aktivity:

public void Ukonci (View v){
        finish();
}

ShowScoreActivity

Nakonec přidejme aktivitu pro zobrazení skóre. V onCreate() po klasických úkonech jako vykreslení layoutu a zakázání změn orientace načteme obsah SharedPreferences "VYSLEDKY" a vypíšeme ho do TextView.

public class ShowScoreActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_score);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

        TextView textview = (TextView) findViewById(R.id.VypisHracu);

        SharedPreferences preferences = getSharedPreferences("VYSLEDKY", MODE_PRIVATE);

        String Vysl = preferences.getString("VYSLEDKY", "");

        textview.setText(Vysl);
    }
}

Obslužme tlačítka. Nejprve metodu na tlačítku pro smazání obsahu SharedPreferences. Po potvrzení AlertDialogu se nastaví obsah SharedPreferences "VYSLEDKY" na prázdný obsah.

public void SmazaniPameti(View v){
        AlertDialog.Builder NasDialog = new AlertDialog.Builder(this);
        NasDialog.setCancelable(true);
        NasDialog.setMessage("Opravdu chcete smazat veškeré zápisy dosažených bodů?");
        NasDialog.setPositiveButton("Ano",
                        new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                        SharedPreferences preferences = getSharedPreferences("VYSLEDKY", MODE_PRIVATE);
                                        SharedPreferences.Editor preeditor = preferences.edit();
                                        preeditor.putString("VYSLEDKY", "");
                                        preeditor.commit();
                                        finish();
                                }
                        });
        NasDialog.setNegativeButton("Ne",
                        new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                }
                        });

        AlertDialog SpusteniDialogu = NasDialog.create();
        SpusteniDialogu.show();

}

Projekt zakončíme obsluhou tlačítka návratu do hlavního menu.

public void VratSe(View v){
        finish();
}

Hru šibenice máme hotovou, projekt naleznete níže ke stažení s kompletními zdrojovými kódy. V sérii byly použity zdroje z http://soundbible.com a http://developer.android.com/. Příště započneme tvorbu další aplikaci pro Android, bude to poznámkový blok, ve kterém budeme mimo jiné pracovat i s databází, fragmenty a uživatelským oprávněním.


 

Stáhnout

Staženo 180x (27.24 MB)
Aplikace je včetně zdrojových kódů v jazyce Android Java

 

  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 (4 hlasů) :
55555


 



 

 

Komentáře

Avatar
Atrament
Člen
Avatar
Atrament:

Zdravím,
články celkem pěkné, ale měl bych jednu výhradu - jelikož jde o Javu a ne o C#, nemohl bys dodržovat javovské základní jmenné konvence? Především že názvy instancí a názvy metod začínají malým písmenem. Může se to zdát jako detail, ale je to neskutečně matoucí pro někoho, kdo je zvyklý číst 'čistý' javovský kód, protože tyto konvence umožňují na první pohled rozlišit určité situace. Když máš instanci pojmenovanou s velkým písmenem na začátku, a voláš na ni metodu, a vypadá to nějak takto:

Promenna.setNeco(25);

tak co já vidím na první pohled, je že tam máš někde třídu Promenna a v ní statickou metodu setNeco(), ačkoliv skutečnost je úplně jiná.

Obvzlášť veselé čtení jsou soubory kde se mísí tebou nesprávně pojmenované metody a instance a ty generované idečkem a tudíž správně pojmenované. A někde jsem tu dokonce viděl dvě tebou pojmenované instance, hned vedle sebe a jedna začínala malým písmenem a druhá velkým :) To už mi hlava nepobrala vůbec :)

 
Odpovědět  +1 20. ledna 13:34
Avatar
Jiří Hlavík
Redaktor
Avatar
Jiří Hlavík:

Ahoj Atramente ;). Díky za poznámku, jakmile si najdu čas, rád se na to podívám a upravím to, ovšem nemůžu zaručit kdy to bude, mám teď hodně a hodně práce... ;)..
Skutečnost je taková, že jsem tyto články vytvářel před cca rokem +- a to byla doba kdy jsem s Androidem začínal, před tím jsem právě psal jen v C# a po pravdě mě nenapadlo, že by někdo řešil věci jako pojmenovávání, malé velké písmena atd. Po pravdě jsem tomu nikdy nevěnoval velkou pozornost ;).

 
Odpovědět 20. ledna 22:15
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 2 zpráv z 2.