Škola Android programiranja časopisa Vidi
Android programiranje #10: Nekoliko standardnih dijelova aplikacije
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=”<< 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).
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();
}
}
| Print article | This entry was posted by Ivan Kišić on 25/10/2011 at 17:33, and is filed under Škola. Follow any responses to this post through RSS 2.0. Both comments and pings are currently closed. |
Comments are closed.

