Prošli put smo iz nešto složenije medicinski orijentirane Android aplikacije „izvukli“ dio programskog koda zadužen za spremanje podataka te za njihovo ponovno čitanje kad se za tim ukaže potreba. U današnjem nastavku pokazat ćemo još nekoliko karakterističnih dijelova programskog koda, koje uz manje ili veće promjene možete upotrijebiti u vlastitim projektima.

Prvo jedan sasvim logičan, ali važan savjet. Svaka složenija Android aplikacija, a naročito ako ona koristi različite sistemske module (kao što je to slučaj u ovom primjeru), zahtijeva uključivanje odgovarajućih biblioteka. Ovisno o načinu oblikovanja korisničkog sučelja i pisanju programskog koda, taj je postupak u najvećoj mogućoj mjeri automatiziran. Međutim, ako se tijekom razvoja u aplikaciji odjednom pojavi čitav niz pogrešaka, postoji dosta velika vjerojatnost da nedostaje (zbog izostanka ili slučajnog brisanja) odgovarajuća import naredba. U nastavku slijedi prikaz kako to prilično komplicirano izgleda u ovom slučaju:

Primjer rasporeda kontrola: Jedan od standardnih dijelova aplikacije za prikupljanje podataka o korisniku.

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.sql.Date;

import java.text.DateFormat;

import java.util.Calendar;

import android.R.bool;

import android.R.integer;

import android.R.string;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.PendingIntent;

import android.content.Context;

import android.content.DialogInterface;

import android.content.Intent;

import android.content.res.ColorStateList;

import android.location.Location;

import android.location.LocationManager;

import android.os.Bundle;

import android.os.Message;

import android.os.Messenger;

import android.telephony.SmsManager;

import android.text.TextUtils;

import android.view.View;

import android.view.ViewGroup;

import android.view.ViewGroup.LayoutParams;

import android.widget.Button;

import android.widget.CheckBox;

import android.widget.CheckedTextView;

import android.widget.EditText;

U medicinski orijentiranoj aplikaciji čije dijelove koristimo za demonstraciju programskog koda, zbog relativno velike količine prikupljenih podataka o korisniku aplikacije neprikladne za prikaz na samo jednom zaslonu ograničene rezolucije (uobičajene kod mobilnih telefona opremljenih Android sustavom), koristi se više međusobno povezanih rasporeda kontrola, a na svakom od rasporeda upotrijebljene su različite kontrole kako bi se što jednostavnije i preglednije unijeli relevantni podaci. Kako to zaista izgleda na zaslonu Android uređaja možete provjeriti na temelju priloženih slika uz tekst, a dijelovi odgovarajućeg XML koda navedeni su u nastavku.

<AbsoluteLayout android:id=”@+id/AbsoluteLayout01″ android:layout_width=”fill_parent” android:layout_height=”fill_parent” xmlns:android=”http://schemas.android.com/apk/res/android”>

<Button android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:layout_x=”0px” android:layout_y=”0px” android:id=”@+id/btn2VratiSe” android:onClick=”btn2VratiSeClick” android:text=”&lt;&lt;  Natrag”></Button>

<Button android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:layout_y=”0px” android:text=”Poništi nezgodu” android:minWidth=”150px” android:layout_x=”90px” android:onClick=”btn2PonistiNezgoduClick” android:id=”@+id/btn2PonistiNezgodu”></Button>

<TextView android:layout_height=”wrap_content” android:layout_width=”wrap_content”

android:text=”Prezime i ime:” android:id=”@+id/txtvPrezimeIme” android:layout_y=”50px” android:layout_x=”2px”></TextView>

<EditText android:saveEnabled=”false” android:layout_height=”wrap_content” android:layout_width=”fill_parent”

android:layout_x=”0px” android:id=”@+id/txtPrezimeIme” android:singleLine=”true” android:layout_y=”65px”></EditText>

<AbsoluteLayout android:id=”@+id/AbsoluteLayout01″ android:layout_width=”fill_parent” android:layout_height=”fill_parent” xmlns:android=”http://schemas.android.com/apk/res/android”>

<EditText android:saveEnabled=”false” android:layout_height=”wrap_content” android:layout_width=”wrap_content” android:singleLine=”true” android:layout_y=”65px” android:id=”@+id/txtKrvnaGrupa” android:maxLength=”2″ android:text=”__” android:layout_x=”170px” android:maxWidth=”50px” android:minWidth=”50px”>

<CheckBox android:layout_height=”wrap_content” android:layout_width=”wrap_content” android:id=”@+id/chkSida” android:layout_x=”0px” android:text=”Sida” android:layout_y=”120px”></CheckBox>

<CheckBox android:layout_height=”wrap_content” android:layout_width=”wrap_content” android:layout_x=”85px” android:layout_y=”120px” android:text=”Hepatitis C” android:id=”@+id/chkHepatitisC”></CheckBox>

<CheckBox android:layout_height=”wrap_content” android:layout_width=”wrap_content” android:id=”@+id/chkDonator” android:text=”Donator” android:layout_x=”210px” android:layout_y=”120px”></CheckBox>

U trenutku prelaska s jednog rasporeda kontrola na drugi postojeći sadržaj kontrola iz starog rasporeda kontrola sprema se za kasnije korištenje, a novi raspored kontrola se popunjava prethodno spremljenim sadržajem (ako takav postoji zbog ranijeg korištenja aplikacije). Obje operacije objašnjene su u prethodnom nastavku serijala. Pokažimo sada kako se programskim kodom prelazi s jednog rasporeda kontrola na drugi. Na svakom osnovnom rasporedu postoje dva gumba za kretanje na slijedeću odnosno prethodnu stranicu (razumljivo osim na prvom i zadnjem). Slijedi primjer korištenja na drugom rasporedu kontrola – na njemu postoji gumb za prelazak na prvi, odnosno na treći raspored kontrola.

public void btn3VratiSeClick(View view)

{

try {

SpremiPodatkeCritical2();

} catch (IOException e1) {

e1.printStackTrace();

}

setContentView(R.layout.critical);

try {

VratiPodatkeCritical();

} catch (IOException e) {

e.printStackTrace();

}

}

public void btn3DaljeClick(View view)

{

try {

SpremiPodatkeCritical2();

} catch (IOException e1) {

e1.printStackTrace();

}

setContentView(R.layout.critical3);

try {

VratiPodatkeCritical3();

} catch (IOException e) {

e.printStackTrace();

}

}

Kako eventualne pogreške prilikom kretanja kroz osnovne rasporede kontrola ne bi izazvale rušenje programa, prijenos prikaza s jednog rasproeda kontrola na drugi „zamotan“ je u odgovarajuću strukturu za obradu pogreške.

Osim prikaza podataka na standardnim rasporedima kontrola, vrlo često je u programu potrebno prikazati i odgovarajuće dijaloške okvire o statusnim informacijama, greškama u radu i slično. U nastavku je naveden primjer programskog koda za prikaz dijaloškog okvira s podacima o autorima programa (ako za to ne namjeravate koristiti poseban raspored kontrola zbog veće vizualne dojmljivosti takvog dijela aplikacije).

Primjer rasporeda kontrola: Drugi standardni dio aplikacije.

public void btnPrvaPomocClick(View view)

{

AlertDialog ad = new AlertDialog.Builder(prvaPomoc.this).create();

CharSequence poruka = “Autor programa \n” ;

poruka = poruka + “Crnko Nenad\n\n”;

poruka = poruka + “Stručni medicinski suradnik\n”;

poruka = poruka + “Fusić Snježana\n\n”;

poruka = poruka + “Verzija programa\n”;

poruka = poruka + “25.06.2010 23:00:00″;

ad.setTitle(“O programu…”);

ad.setMessage(poruka);

ad.setButton(“Zatvori”, new DialogInterface.OnClickListener()

{

@Override

public void onClick(DialogInterface arg0, int arg1)

{

}

});

ad.show();

}

U slučaju da vam to negdje zatreba, evo i opće funkcije za otvaranje osnovnog oblika dijaloškog okvira koju uz veće ili manje preinake možete upotrijebiti u vlastitim aplikacija. Ulazni parametri funkcije su poruka koja se prikazuje u okviru dijaloškog okvira te njegovo zaglavlje.

private void MsgBox(String Poruka, String VrstaPoruke)

{

AlertDialog ad = new AlertDialog.Builder(prvaPomoc.this).create();

ad.setTitle(VrstaPoruke);

ad.setMessage(Poruka);

ad.setButton(“Zatvori”, new DialogInterface.OnClickListener()

{

@Override

public void onClick(DialogInterface arg0, int arg1)

{

}

});

ad.show();

}

Navedimo na kraju današnjeg nastavka najsloženiji „komad“ programskog koda zadužen za pripremu i slanje SMS poruke s podacima iz programa u slučaju nezgode. Zbog ograničenja prostora u časopisu ovim dijelom ćemo se nešto detaljnije pozabaviti u slijedećem nastavku serijala.

public void btnPosaljiSMSClick(View view)

{

final Button btnPosaljiSMS = (Button) findViewById(R.id.btnPosaljiSMS);

Calendar Kalendar = Calendar.getInstance ();

CharSequence mTrenutnoVrijeme = Kalendar.getTime().toString();

mGodina = Kalendar.get(Calendar.YEAR);

mMjesec = Kalendar.get(Calendar.MONTH);

mDan = Kalendar.get(Calendar.DAY_OF_MONTH);

mSati = Kalendar.get(Calendar.HOUR_OF_DAY);

mMinute = Kalendar.get(Calendar.MINUTE);

mSekunde = Kalendar.get(Calendar.SECOND );

mTrenutnoVrijeme = Integer.toString(mDan) + “.” +

Integer.toString(mMjesec) + “.” +

Integer.toString(mGodina) + ” ” +

Integer.toString(mSati) + “:” +

Integer.toString(mMinute) + “:” +

Integer.toString(mSekunde);

setContentView(R.layout.critical3);

try {

VratiPodatkeCritical3();

} catch (IOException e1) {

e1.printStackTrace();

}

final CheckBox tp = (CheckBox) findViewById(R.id.chkGPSPozicija);

String pozicija = “”;

if (tp.isChecked())

{

try

{

LocationManager locationManager;

String context = Context.LOCATION_SERVICE;

locationManager = (LocationManager)getSystemService(context);

String provider = LocationManager.GPS_PROVIDER;

Location location = locationManager.getLastKnownLocation(provider);

double lat = location.getLatitude();

double lng = location.getLongitude();

pozicija = ” ” + Double.toString(lat) + ” / ” + Double.toString(lat);

}

catch (Exception  e)

{

e.printStackTrace();

}

}

try

{

final EditText tmp = (EditText) findViewById(R.id.txtSMSPoruka);

String tmps = tmp.getText().toString();

if (tmps.length() == 0)

{

setContentView(R.layout.main);

MsgBox(“Nije definiran tekst SMS poruke!”, “Upozorenje”);

return;

}

final EditText tmpbr = (EditText) findViewById(R.id.txtSMSBroj);

String tmpsbr = tmpbr.getText().toString();

if (tmpsbr.length() == 0)

{

setContentView(R.layout.main);

MsgBox(“Nije definiran broj za slanje SMS poruke!”, “Upozorenje”);

return;

}

setContentView(R.layout.main);

VratiPodatkeMain();

tmps = tmps + pozicija;

SmsManager sm = SmsManager.getDefault();

sm.sendTextMessage(tmpsbr, null, tmps + pozicija, null, null);

}

catch (Exception  e)

{

MsgBox(e.getMessage(),”Greška”);

e.printStackTrace();

}

AlertDialog ad = new AlertDialog.Builder(prvaPomoc.this).create();

CharSequence poruka = “Zabilježeno vrijeme slanja SMS poruke za pomoć\n\n” ;

poruka = poruka + mTrenutnoVrijeme.toString();

ad.setTitle(“Potvrda operacije”);

ad.setMessage(poruka);

ad.setButton(“Zatvori”, new DialogInterface.OnClickListener()

{

@Override

public void onClick(DialogInterface arg0, int arg1)

{

}

});

ad.show();

btnPosaljiSMS.setText(“SMS poruka: ” + mTrenutnoVrijeme);

try {

SpremiPodatkeMain();

} catch (IOException e) {

e.printStackTrace();

}

}