it vezbe android
DESCRIPTION
android aplikacije i kako ih napraviti. Rad u aplikaciji android studioTRANSCRIPT
Informacione tehnolgijeInformacione tehnolgijeAndroid aplikacije
Informacione tehnolgijeInformacione tehnolgijeAndroid SDK. AVD, Hello World aplikacija
Android SDK• Prvi i najvažniji softver koji je potrebno preuzeti je
Android SDK• On sadrži mnoštvo korisnih elemenata: debugger,
biblioteke, emulator, dokumentaciju…biblioteke, emulator, dokumentaciju…• Android SDK koristi Java Development Kit (JDK), pa
ukoliko JDK ne postoji na računaru, potrebno ga je preuzeti sa lokacije http://www.oracle.com/technetwork/java/javase/downloads/index.html i instalirati
• Android SDK se može preuzeti sa http://developer.android.com/sdk/index.html
• Nakon preuzimanja dobija se zip fajl koga je potrebno raspakovati na lokalni disk.
Android SDK Manager• Dostupan je na Window>Android SDK Manager• Upravlja različitim verzijama Android SDK-a, preko njega se
vrši update
Android Virtuelni ureñaji (AVD, Android Virtual Device)
• Dostupan je na Window>Android Virtual Device Manager
• Ovo je instanca emulatora koja omogućava modeliranje realnog uređaja
• Može se napraviti veći broj ovih virtualnih uređaja, koji nam omogućavaju simulaciju rada aplikacija na uređajima različitih karakteristika
Kreiranje AVD
• Potrebno je kliknuti na dugme New, datim ime uređaju, izabrati tip uređaju, izabrati tip uređaja, i izvršiti ostala podešavanja, i kliknuti OK kako bi se napravio novi AVD.
Pokretanje AVD• U Android Virtual Device Manager selektovati
virtuelni uređaj, kliknuti na Start… i zatim na Launch
AVD
• Virtuelni uređaj je pokrenut u skladu sa skladu sa podešavanjima koje smo napravili
Hello World aplikacija
• Daje se postupak pravljanja jedne Android aplikacije• Otići na File>New>Android Application Project
▫ Application Name: HelloWorld▫ Application Name: HelloWorld▫ Project Name: HelloWorld▫ Package Name: zr.vts.it
• Izabrati sve podrazumevane opcije do kraja rada čarobnjaka
• Na narednim slikama je ilustrovan izgled IDE projekta HelloWorld, i postupak pokretanja ove aplikacije
IDE – Hello World projekat
Pokretanje HelloWorld aplikacije
Od Hello World do Pozdrav Svete• Napraviti izmenu kao na slici i ponovo pokrenuti
AVD
Anatomija Android aplikacije• Postoje sledeći folderi:
▫ src – Sadrži .java izvorne datoteke, u ovom slučaju MainActivity.java koja sadrži kod za funkcionisanje aplikacije
▫ gen – Sadrži R.java datoteku koja referencira sve resurse ▫ gen – Sadrži R.java datoteku koja referencira sve resurse projekta. Ne treba je modifikovati.
▫ Android 4.2.2. – sadrži android.jar koja sadrži sve biblioteke klasa neophodne za jednu Android aplikaciju
▫ assets – sredstva koja koristi aplikacija▫ bin – ovde se generiše između ostalih .apk fajl koja
predstavlja instalacionu verziju aplikacije▫ res – sadrži sve resurse koji se koriste u aplikaciji▫ AndroidManifest.xml – manifest datoteke, koji sadrži
privilegije, filtre… koji važe za aplikaciju
AndroidManifest.xml• U ovoj datotecu su definisani između ostalog:
▫ Paket aplikacije: package="zr.vts.it“▫ Kod verzije aplikacije: android:versionCode="1"▫ Kod verzije aplikacije: android:versionCode="1"▫ Naziv verzije aplikacije: android:versionName="1.0"▫ Minimalna Android verzija:
android:minSdkVersion="8“▫ Ikonica: android:icon="@drawable/ic_launcher“▫ Naziv aplikacije: android:label="@string/app_name"
Informacione tehnolgijeInformacione tehnolgijeDizajniranje korisničkog interfejsapomoću pogleda
Pogledi
• Anstdroid pruža mogućnost za rad sa različitim pogledima, gde između ostalog spadaju:▫ Basic pogledi – TextView, EditText i Button… ▫ Basic pogledi – TextView, EditText i Button…
Prikaz i unos teksta i dugme…▫ Picker pogledi – TimePicker, DatePicker.
Omogućavaju selektovanje stavki iz liste.▫ List pogledi – ListView, SpinnerView. Prikaz dužih
lista stavki.
Osnovni pogledi• Osnovni pogledi se jednostavno koriste pri
projektovanju korisničkog interfejsa Androidaplikacije:▫ TextView – prikaz teksta▫ TextView – prikaz teksta▫ EditText - unos ili izmena teksta▫ Button – dugme, može se pritisnuti▫ ImageButton – dugme koje ima i sliku▫ CheckBox – taster sa 2 stanja: uključeno i isključeno▫ ToggleButton – slično kao CheckBox ali drugačiji
prikaz ▫ RadioButton▫ RadioGroup
TextView
• TextView se koristi pri prikazivanju teksta korisnicima
• Osobina android:text služi za podešavanje teksta• Osobina android:text služi za podešavanje teksta• Primer:<TextView
android:id="@+id/txtTekst"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text= "Ovo je TextView" />
EditText
• Omogućava editovanje teksta• android:id omogućava jedinstvenu identifikaciju
ove komponenteove komponente• Primer:<EditText android:id="@+id/txtName"
android:layout_width="fill_parent" android:layout_height="wrap_content" />
Button• Predstavlja taster koji je moguće pritisnuti.• Vrednost osobine android:onClick je naziv funkcije koja se izvršava
kada se klikne na dugme.• Primer:<Button android:id="@+id/btnSave"<Button android:id="@+id/btnSave"
android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Snimi" android:onClick="btnSaved_clicked"/>
• U tom slučaju potrebno je obraditi klik događaj u odgovarajućem java dokumentu.
• Primer:public void btnSaved_clicked(View view){Toast.makeText(getBaseContext(), "Snimanje...",
Toast.LENGTH_LONG).show(); }
ImageButton
• Slično kao u kod Button, ali postoji slika• Osobina android:src omogućava izbor slike• Primer:• Primer:<ImageButton android:id="@+id/btnImg1"
android:layout_width="fill_parent"android:layout_height="wrap_content"android:src="@drawable/ic_launcher" />
CheckBox
• Tip tastera koji sadrži dva stanja: selektovano i deselektovano
• Primer:• Primer:<CheckBox android:id="@+id/chkAutosave"
android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Autosave" />
ToggleButton
• Prikazuje selektovana/deselektovana stanja korišćenjem svetlosnog indikatora
• Primer:• Primer:<ToggleButton android:id="@+id/toggle1"
android:layout_width="wrap_content"android:layout_height="wrap_content" />
Radio Group i Radio Button• RadioGroup grupiše više Radio Button-a, pri čemu samo jedan
Radio Button može biti seletovan u jednom momentu u okviru RadioGroup
• Primer:<RadioGroup android:id="@+id/rdbGp1"
android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ><RadioButton android:id="@+id/rdb1"
android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Opcija 1" />
<RadioButton android:id="@+id/rdb2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Opcija 2" />
</RadioGroup>
Osnovni pogledi
Picker pogledi
• Često se vrši selektovanje datuma i vremena u Android aplikacijama. Za ovu namenu koriste se:se:▫ TimePicker – selekcija vremena▫ DatePicker – selekcija datuma
TimePicker pogled
• TimePicker omogućava selekciju vremena.• Primer:<TimePicker android:id="@+id/timePicker1"<TimePicker android:id="@+id/timePicker1"
android:layout_width="wrap_content"android:layout_height="wrap_content" />
Kako videti trenutno vreme? Unetinavedeni kod u odgovarajući Java fajl
package vts.zr.vts_it_vezbe;
import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.TimePicker;import android.widget.Toast;import android.widget.Toast;
public class DateTimePicker extends Activity {TimePicker timePicker;
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.datetimepicker);
timePicker = (TimePicker)findViewById(R.id.timePicker1);
timePicker.setIs24HourView(true);
}public void onClick(View view){Toast.makeText(getBaseContext(), “Vreme: "+ timePicker.getCurrentHour() +":" + timePicker.getCurrentMinute(), Toast.LENGTH_LONG).show();}}
DatePicker pogled• DatePicker pogled omogućava selekciju datuma• Primer:<DatePicker android:id="@+id/datePicker"
android:layout_width="wrap_content"android:layout_height="wrap_content" />android:layout_height="wrap_content" />
Kako videti trenutni datum?package vts.zr.vts_it_vezbe;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.DatePicker;import android.widget.Toast;public class DateTimePicker extends Activity {DatePicker datePicker; DatePicker datePicker; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.datetimepicker);datePicker = (DatePicker)findViewById(R.id.datePicker1);}public void onClick(View view){Toast.makeText(getBaseContext(), "Datum:" + (datePicker.getMonth() +
1) +"/" + datePicker.getDayOfMonth() + /" + datePicker.getYear(),
Toast.LENGTH_LONG).show();}}
List pogledi
• List pogledi omogućavaju prikaz dužih lista stavki. Za ovu namenu koriste se:▫ ListView▫ ListView▫ SpinnerView
ListView pogled
• ListView pogledomogućava rad sa dužim listama i dužim listama i selekciju stavki iz ove liste
• Primer:<ListView
android:id="@+id/android:list"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
ListView pogled – java kodpackage vts.zr.vts_it_vezbe;
import android.app.ListActivity;import android.os.Bundle;import android.view.View;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;
public class ListViewPicker extends ListActivity {String[] studProgrami = {String[] studProgrami = {
"Inženjerski menadžment","Tehnološko inženjerstvo","Mašinsko inženjerstvo","Tekstilna konfekcija i dizajn"
};protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
studProgrami));}
public void onListItemClick(ListView parent, View v, int position, long id){
Toast.makeText(this, "Vaš izbor: " + studProgrami[position], Toast.LENGTH_SHORT).show();}
}
SpinnerView pogled
• Spinner View pogledomogućava rad sa dužim listama i dužim listama i selekciju stavki iz ove liste• Primer:<Spinner
android:id="@+id/spinner1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:drawSelectorOnTop="true" />
SpinnerView pogled – java kodpackage vts.zr.vts_it_vezbe;
import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.Spinner;
public class SpinnerViewPicker extends Activity{
String[] studProgrami = {"Inženjerski menadžment","Inženjerski menadžment","Tehnološko inženjerstvo","Mašinsko inženjerstvo","Tekstilna konfekcija i dizajn"
};
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.spinnerviewpicker);
Spinner s1 = (Spinner)findViewById(R.id.spinner1);ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_single_choice, studProgrami);s1.setAdapter(adapter);
}}
Informacione tehnolgijeInformacione tehnolgijeAktivnosti i namere
Aktivnost• Aktivnost je prozor koji sadrži korisnički interfejs u
aplikaciji• Glavni cilj aktivnosti je omogućavanje interakcije sa
korisnikomkorisnikom• Od trenutka kada se aktivnost prikaže na ekranu, do
njenog skrivanja, prolazi se kroz veći broj faza u njenom “životnom ciklusu”
• Razumevanje ovog životnog ciklusa je neophodno za obezbeđenje ispravnog funkcionisanja aplikacije
• U nastavku se opisuje postupak kreiranja nove aktivnosti.
activity101activity.xml• U direktorijumu res/layout treba napraviti fajl
activity101activity.xml. U nastavku se daje njegovsadržaj:
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".Activity101Activity" >
<TextViewandroid:id="@+id/textView1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello_world" />
</LinearLayout>
Razumevanje aktivnosti• Da bi se stvorila nova aktivnost neophodno je kreiranje Java klase koja
nasleđuje Activity baznu klasu. Primer:
package vts.zr.vts_it_vezbe;import android.app.Activity;import android.app.Activity;import android.os.Bundle;public class Activity101Activity extends Activity {
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity101activity);
}}• extends Activity znači da će posmatrana klasa biti aktivnost• R.layout.activity101activity ukazuje na konkretnu komponentu
korisničkog interfejsa (xml fajl koji je naveden u prethodnom slajdu)
Deklaracija u AndroidManifest.xml• Svaka aktivnost koja se dodaje mora biti deklarisana u fajlu AndroidManifest.xml. Primer:<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="vts.zr.vts_it_vezbe"android:versionCode="1"android:versionName="1.0" ><uses-sdk
android:minSdkVersion="8” /><application
android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name” > <activity<activity
android:name="vts.zr.vts_it_vezbe.MainActivity"android:label="@string/app_name" ><intent-filter>
<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />
</intent-filter></activity><activity
android:name=".Activity101Activity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.ACTIVITY101ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application></manifest>
• U aktivnosti postoji više događaja koji pokrivaju životni ciklus aktivnosti:▫ onCreate() – poziva se pri
prvom definisanju aktivnosti▫ OnStart() – poziva se kada
aktivnost postane vidljiva korisniku
▫ onResume() – poziva se kada korisnika započne interakciju
Životni ciklus aktivnosti
korisnika započne interakciju▫ onStop() - poziva se kada se
aktivnost privremeno zaustavi
▫ onDestroy() - poziva se pre nego što se aktivnost ukloni sa sistema
▫ onRestart() - poziva se kada se aktivnost prvo zaustavi a zatim ponovo pokrene
Životni ciklus aktivnosti - Primerpackage vts.zr.vts_it_vezbe;
import android.app.Activity;import android.os.Bundle;import android.util.Log;
public class Activity101Activity extends Activity {
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity101activity);
}
public void onStart(){
super.onStart();Log.d("LC", "In the onStart() event");
}}
Način funkcionisanja
• Kada se aktivnost startuje uvek se izvršavaju događaju onStart() i onResume()
• onCreate() - za kreiranje i instanciranje objekata • onCreate() - za kreiranje i instanciranje objekata koji se koriste u aktivnosti
• onResume() – za startovanje onih radnji koje su potrebne kada je aktivnost u prvom planu
• onPause() - za zaustavljanje radnji kada aktivnost nije u prvom planu
• onDestroy() – za oslobađanja resursa koji nisu potrebni kada aktivnost biva uklanjana
Namere (Intent)• Ovo je jedan od jedinstvenih Android koncepata• Namera omogućava da različitim aktivnostima iz
različitih aplikacija da funkcionišu zajedno, pri čemu je obezbeđeno da se zadaci izvršavaju kao da su je obezbeđeno da se zadaci izvršavaju kao da su realizovani i jedinstvenoj aplikaciji
• Kada želimo da sa jedne aktivnosti pređemo na drugu aktivnost koristimo namere
• Mogu se izvršavati i ograđene aplikacije poput▫ Browser▫ Phone▫ Maps…
Kako se koriste namere• Android omogućava aplikacija poziva i svoje
aktivnosti ali i aktivnosti drugih aplikacija.• Primer pozivanja aktivnosti korišćenjem namere:public void onKlik(View view){public void onKlik(View view){startActivity(new Intent(“ime.paketa. DrugaAktivnost”));}• Ukoliko je pozivana aktivnost u istom projektu može
se korisiti i sledeći oblik:public void onKlik(View view){startActivity(new Intent(this, DrugaAktivnost.class));}
Deklaracija u AndroidManifest.xml• Druga aktivnost se mora dodati i u
AndroidManifest.xml. Primer:<activity
android:name=".Activity101Activity"android:label="@string/app_name" >android:label="@string/app_name" ><intent-filter>
<action android:name="android.intent.action.ACTIVITY101ACTIVITY" /><category android:name="android.intent.category.LAUNCHER" />
</intent-filter></activity>
<activityandroid:name=". DrugaAktivnost "android:label="@string/app_name" ><intent-filter>
<action android:name="android.intent.action. DRUGAAKTIVNOST " /><category android:name="android.intent.category.DEFAULT" />
</intent-filter></activity>
Vraćanje aktivnosti iz inicirane aktivnosti
• Ukoliko postoji potreba za vraćanjem neke vrednosti iz inicirane aktivnosti, potrebno je koristiti metod startActivityForResult() u prvoj koristiti metod startActivityForResult() u prvoj aktivnosti.
• Druga aktivnost obezbeđuje vrednost koja se vraća prvoj aktivnosti
Aktivnost koja poziva (i prikazuje vraćenu aktivnost)...int request_Code = 1;
public void onSecondActivity(View view){startActivityForResult(new Intent(this, SecondActivity.class), request_Code);request_Code);
}
public void onActivityResult(int requestCode, int ResultCode, Intent data){if(requestCode == request_Code){
if(ResultCode == RESULT_OK){Toast.makeText(getBaseContext(), data.getData().toString(), Toast.LENGTH_LONG).show();}
}}
...
Pozivana aktivnost(koja vraća rezultat)
…public void btnPotvrdi(View v){Intent data = new Intent();//Definisanje EditText pogledaEditText txtIme =
…<TextView
android:id="@+id/txtIme"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text= "Unesite vaše ime:" />EditText txtIme =
(EditText)findViewById(R.id.etIme);//Definisanje podataka koji se vracajudata.setData(Uri.parse(txtIme.getText().toString()));setResult(RESULT_OK, data);//gasenje ove aktivnostifinish();}…
android:text= "Unesite vaše ime:" />
<EditText android:id="@+id/etIme"android:layout_width="fill_parent" android:layout_height="wrap_content" />
<Button android:id="@+id/btnImePotvrdi"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Potvrdi" android:onClick="btnPotvrdi"/>
…
Slanje podataka u iniciranu aktivnost
• Moguće je da jedna aktivnost pošalje neki podatak u aktivnost koju je inicirala
• U ovoj situaciji je moguće koristiti Intend• U ovoj situaciji je moguće koristiti Intendobjekat
• Postoje dva načina za slanje podataka između aktivnost:▫ Kao ključ-vrednost par▫ Korišćenjem Bundle
Slanje podataka u iniciranu aktivnost - primerGlavna aktivnost
public void onThirdActivity(View view){Intent intent = new Intent(this, ThirdActivity.class);// I. Nacin key/valueintent.putExtra("poruka1", "Pozdrav iz glavne aktivnosti");// II. Način - bundleBundle extras = new Bundle();extras.putString("poruka2", "i još jedan pozdrav"); intent.putExtras(extras);startActivity(intent); // Poziv naredne aktivnosti}}
Pozivana aktivnost
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.thirdactivity);// Pristup nameri koja je prosledjena iz prethodne aktivnostiIntent intent = getIntent();// I. Nacin key/value ispisString p1 = intent.getStringExtra("poruka1"); Toast.makeText(getBaseContext(), p1, Toast.LENGTH_SHORT).show(); // II. Način - bundle ispisBundle bundle = intent.getExtras();String p2 = bundle.getString("poruka2");Toast.makeText(getBaseContext(), p2, Toast.LENGTH_SHORT).show(); }
Izvršavanje ugrañenih aplikacija na osnovu namera• Jedna od ključnih mogućnosti Android aplikacija je
korišćenje mogućnosti za izvršavanje aktivnosti iz nekih drugih aplikacija
• To znači da je moguće izvršavati različite ugrađene • To znači da je moguće izvršavati različite ugrađene aplikacije koje su raspoložive na konkretnom Android uređaju
• Na primer moguće je uspostaviti telefonski poziv, slati mejl ili posetiti web stranicu
• U AndroidManifest.xml je potrebno dodati potrebne dozvole, poput:
<uses-permission android:name="android.permission.CALL_PHONE"/><uses-permission android:name="android.permission.INTERNET"/>
Primeri:• Browser:public void onClickWebBrowser(View view) {
Intent i = new Intent("android.intent.action.VIEW");i.setData(Uri.parse("http://www.vts-zr.edu.rs"));i.setData(Uri.parse("http://www.vts-zr.edu.rs"));startActivity(i);
}
• Telefonski pozivpublic void onClickMakeCalls(View view) {
Intent i = new Intent(Intent.ACTION_CALL);i.setData(Uri.parse("tel:0038123123456"));startActivity(i);
}
Primeri• Elektronska pošta:public void onClickSendEmail(View view){String[] to = {"[email protected]"};
String[] cc = {"[email protected]"};sendEmail(to, cc, "Subject ide ovde", "Poštovani, \n");
}private void sendEmail(String[] emailAddresses, String[] carbonCopies,String subject, String message){{
Intent emailIntent = new Intent(Intent.ACTION_SEND);emailIntent.setData(Uri.parse("mailto:"));String[] to = emailAddresses;String[] cc = carbonCopies;emailIntent.putExtra(Intent.EXTRA_EMAIL, to);emailIntent.putExtra(Intent.EXTRA_CC, cc);emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);emailIntent.putExtra(Intent.EXTRA_TEXT, message);emailIntent.setType("message/rfc822");startActivity(Intent.createChooser(emailIntent, "Email"));
}
Informacione tehnolgijeInformacione tehnolgijeLayout
Uvod
• Osnovna jedinica Android aplikacije je aktivnost• Aktivnost omogućava prikazivanje korisničkog
interfejsa korišćenjem različitih elemenata interfejsa korišćenjem različitih elemenata poput tekstova, dugmadi…
• Korisnički interfejs se tipično definiše u okviru XML fajla (res/layout folder). Ovaj XML fajl se zatim učitava iz Java klase, na primer:protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
Pogledi i grupe pogleda• Aktivnost sadrži:
▫ poglede – element koji ima svoj prikaz na ekranu, poput tastera ili polja sa tekstom i izvodi se iz bazne klase android.view.View
▫ grupe pogleda – obuhvata više pogleda i obezbeđuje da se oni uređuju prema određenom rasporedu ili načinu prikazivanjanačinu prikazivanja
• Android podržava sledeće grupe pogleda, koje se mogu kombinovati u okviru jedne aktivnosti:▫ LinearLayout▫ AbsoluteLayout▫ TableLayout▫ RelativeLayout▫ FrameLayout▫ ScroolView
Zajednički atributi pogleda i grupa pogleda
Atribut Opis
layout_width Definiše širinu za View ili ViewGroup
layout_height Definiše visinu za View ili ViewGroup
layout_marginTop Margina iznad View ili ViewGrouplayout_marginTop Margina iznad View ili ViewGroup
layout_marginBottom Margina ispodView ili ViewGroup
layout_marginLeft Margina levo od View ili ViewGroup
layout_marginRight Margina desno od View ili ViewGroup
layout_gravity Specifikacija kako se pozicionira View
layout_weight Specifikacija dodatnog prostora u rasporedu za View
layout_x X koordinata View ili ViewGroup elementa
layout_y Y koordinata View ili ViewGroup elementa
LinearLayout
• Uređuje poglede u jednu kolonu ili vrstu• Pogledi se slažu
▫ Vertikalno (android:orientation="vertical") ili ▫ Vertikalno (android:orientation="vertical") ili ▫ Horizontalno (android:orientation="horizontal")
Linearl.xml<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".linearl" >
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Pozdrav svete!" />
<Buttonandroid:layout_width="124dp"android:layout_height="wrap_content" android:text="Dugme" />
</LinearLayout>
AbsoluteLayout
• Omogućava tačno određivanje lokacije elemenata. Na primer:android:layout_x=“12px”android:layout_x=“12px”android:layout_x=“350px”
• Zbog određenih problema AbsoluteLayout sa ekranima visoke rezolucije se ne koristi od Android verzije 1.5, te je preporuka njegovo izbegavanje
TableLayout
• Grupiše elemente u vrste i kolone• <TableRow> se koristi za označavanje vrste u
posmatranoj tabeliposmatranoj tabeli• Svaka vrsta može da sadrži jedan ili više pogleda,
a svaki pogled formira ćeliju• Širina svake kolone je određena najvećom
širinom svake ćelije u koloni
tablel.xml<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><TableRow>
<TextViewandroid:text="Ime:"android:width ="120dp"/>
<EditText<EditTextandroid:id="@+id/txtIme"android:width="200dp" />
</TableRow><TableRow>
<TextViewandroid:text="Šifra:"/>
<EditTextandroid:id="@+id/txtSifra" android:password="true" />
</TableRow></TableLayout>
RelativeLayout
• Ovaj raspored omogućava da se odredi način na koji se izvedeni element prikazuje u odnosu na osnovne elementeosnovne elemente
• Mogu se koristiti sledeći atributi:▫ android:layout_alignParentTop▫ android:layout_alignParentLeft▫ android:layout_alignLeft▫ android:layout_alignRight▫ android:layout_below▫ android:layout_centerHorizontal
relativel.xml<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent" ><TextView
android:id="@+id/lblKomentari"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Komentari"android:text="Komentari"android:layout_alignParentTop="true"android:layout_alignParentLeft="true" />
<EditTextandroid:id="@+id/txtComments"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp"android:layout_toRightOf="@+id/lblKomentari"android:text="abc"android:layout_centerHorizontal="true" />
</RelativeLayout>
FrameLayout
• Ovaj raspored se može koristiti za prikazivanje jednog pogledajednog pogleda
• Pogledi koji se dodaju u FrameLayout se uvek postavljaju u odnosu na gornji levi ugao rasporeda
• Ukoliko se definiše još jedan pogled u ovom rasporedu dolazi do preklapanja
framel.xml<RelativeLayout
android:id="@+id/RLayout"android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="http://schemas.android.com/apk/res/android"><TextView
android:id="@+id/lblComments"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello, Android!"android:layout_alignParentTop="true"android:layout_alignParentLeft="true"/>
<FrameLayout<FrameLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/lblComments"android:layout_below="@+id/lblComments"android:layout_centerHorizontal="true"><ImageView
android:src = "@drawable/ic_launcher"android:layout_width="wrap_content"android:layout_height="wrap_content" />
<Buttonandroid:layout_width="124dp"android:layout_height="wrap_content"android:text="Print Picture" />
</FrameLayout></RelativeLayout>
ScroolView
• Ovo je specijalni tip FrameLayoutprikaza
• Omogućava korisnicima da pristupaju • Omogućava korisnicima da pristupaju različitim pogledima u listi pogleda koji zauzimaju više prostora nego što to omogućava fizički displej
• ScroolView može da sadrži samo jedan izvedeni pogled ili grupu pogleda, koji je najčešće LinearLayout tipa
scrooll.xml<ScrollView
android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="http://schemas.android.com/apk/res/android" > <LinearLayout
android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical"android:focusable="true" android:focusableInTouchMode="true" >android:focusableInTouchMode="true" ><Button
android:id="@+id/button1"android:layout_width="fill_parent"android:layout_height="150px"android:text="Dugme 1" />
<Buttonandroid:id="@+id/button2"android:layout_width="fill_parent"android:layout_height="150px"android:text="Dugme 2" />
</LinearLayout> </ScrollView>
Informacione tehnolgijeInformacione tehnolgijeToast, Notification, Dialog
Toast
• Klasa Toast služi za prikaz teksta u prozoru koji se projavi na nekoliko sekundi i zatim biva uklonjen.uklonjen.
• Primer:Toast.makeText(getBaseContext(), "Pozdrav
svima", Toast.LENGTH_LONG).show();
Notification
• Toast klasa može da prikazuje obaveštenjakorisnicima, ali ima nedostatak da nije prezistentna – prikazuje poruku korisnicima samo nekoliko sekundi i zatim se uklanjaprezistentna – prikazuje poruku korisnicima samo nekoliko sekundi i zatim se uklanja
• Kod prikazivanja značajnih informacija može se desiti da korisnik u tom trenutku ne gleda na ekran i previdi tu informaciju
• Za prikaz značajnih poruka treba koristiti mnogo perzistentniji metod, poput prikaza poruke u statusnoj liniji
notificationview.xml<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent" >
<TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Kolokvijum iz Internet tehnologija je zakazan za 24.04.2014. godine. Materijal za pripremuse nalazi na web sajtu." />
</LinearLayout>
NotificationView.javapackage vts.zr.vts_it_vezbe;import android.app.Activity;import android.app.NotificationManager;import android.os.Bundle;public class NotificationView extends Activitypublic class NotificationView extends Activity{
@Overridepublic void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);setContentView(R.layout.notificationview);NotificationManager nm = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);nm.cancel(getIntent().getExtras().getInt("notificationID"));
}}
AndroidManifest.xml…<uses-permission android:name="android.permission.VIBRATE"/>…<activity
android:name=".NotificationView"android:name=".NotificationView"android:label="@string/app_name" ><intent-filter>
<action android:name="android.intent.action.NOTIFICATIONVIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter></activity>
…
Poziv notifikacijeint notificationID = 1;@SuppressWarnings("deprecation")public void onNotification(View v){
Intent i = new Intent(this, NotificationView.class);i.putExtra("notificationID", notificationID);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0);NotificationManager nm = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE); Notification notif = new Notification(
R.drawable.ic_launcher, "Alarm: Kolokvijum iz IT",System.currentTimeMillis());
CharSequence from = "System Alarm";CharSequence message = "Kolokvijum iz Internet tehnologija..."; notif.setLatestEventInfo(this, from, message, pendingIntent);//---100ms pauza, vibracija 250ms, pause 100 ms i vibracija 500msnotif.vibrate = new long[] { 100, 250, 100, 500};nm.notify(notificationID, notif);
}
Dijalog• Dijalog je deo aktivnosti koji se kontroliše putem
sledećih metoda:▫ showDialog(int id_dijaloga)▫ dismissDialog(int id_dijaloga)
• Tipovi dijalog su:▫ AlertDialog▫ ProgressDialog▫ ProgressDialog▫ CustomDialog
• Pri tome je id_dijaloga celobrojna promenjiva koja ima neku vrednost
• Metod showDialog poziva metod koji detaljnije objašnjava kako dijalog treba da izgleda
• Primer pozivanja AlertDialog: public void onAlertDialog(View v){showDialog(DIALOG_ALERT);}
Primer AlertDialogprivate static final int DIALOG_ALERT = 10;@SuppressWarnings("deprecation")protected Dialog onCreateDialog(int id) {switch (id) {case DIALOG_ALERT:
String output11 = "";AlertDialog.Builder builder11 = new AlertDialog.Builder(this);output11+="Pitanje je ovde?";builder11.setMessage(output11);builder11.setCancelable(true);builder11.setPositiveButton("Da", new OkOnClickListener());builder11.setPositiveButton("Da", new OkOnClickListener());builder11.setNegativeButton("Ne", new CancelOnClickListener());AlertDialog dialog11 = builder11.create();dialog11.show();
break;}return super.onCreateDialog(id);
}private final class CancelOnClickListener implements DialogInterface.OnClickListener {public void onClick(DialogInterface dialog, int which) {Toast.makeText(getBaseContext(), "Ne", Toast.LENGTH_LONG).show(); }
}private final class OkOnClickListener implements DialogInterface.OnClickListener {public void onClick(DialogInterface dialog, int which) { Toast.makeText(getBaseContext(), "Da", Toast.LENGTH_LONG).show(); }
}
ProgressDialog
• ProgressDialog se obično izvršava kada kadaaplikacija izvršava zadatke koji dugo traju
Primer ProgressDialogProgressDialog progress;public void onProgressDialog(View v){progress = ProgressDialog.show(this, "Učitavanje","Molimo sačekajte", true);
new Thread(new Runnable() {@Overridepublic void run(){
try {Thread.sleep(5000);} catch (InterruptedException e) {} catch (InterruptedException e) {e.printStackTrace();}
runOnUiThread(new Runnable() {@Overridepublic void run(){
progress.dismiss();}
});}
}).start();}
Informacione tehnolgijeInformacione tehnolgijeSlanje SMS porukaMenijiIkonica
Slanje SMS poruka
• Android aplikacija omogućava slanje SMSporuka
• Slanje SMS poruka je moguće testirati i na • Slanje SMS poruka je moguće testirati i na emulatorima, gde je broj telefona emulatoraneka od vrednosti: “5554”, “5556”, “5558”…
• Pored programskog koda potrebno je u AndriodMainfest.xml dodati dozvolu za slanje SMS poruka:
<uses-permission android:name="android.permission.SEND_SMS"/>
sms.xml<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".sms" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Broj" />
<EditText
android:id="@+id/smsbroj"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Poruka" />
<EditText
android:id="@+id/smsporuka"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Button
android:layout_width="124dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:onClick="onSMS"
android:text="Pošalji" />
</LinearLayout>
Sms.java• Potrebno je dodati sledeće:
public void onSMS(View v){EditText etBroj = (EditText)findViewById(R.id.smsbroj);EditText etPoruka = (EditText)findViewById(R.id.smsporuka);EditText etPoruka = (EditText)findViewById(R.id.smsporuka);String phoneNumber = etBroj.getText().toString();String message = etPoruka.getText().toString();sendSMS(phoneNumber, message);}
private void sendSMS(String phoneNumber, String message){SmsManager sms = SmsManager.getDefault();sms.sendTextMessage(phoneNumber, null, message, null, null);}
Meniji• Meni sa opcijama se prikazuje uvek
kada korisnik pritisne meni taster• U zavisnosti od verzije Android
operativnog sistema meni se može operativnog sistema meni se može nalaziti na drugačijim pozicijama i izgledati drugačije
• Iz stavki menija se mogu vršiti razne aktivnosti od kojih su neke:▫ Preusmeravanja na web lokaciju▫ Odlazak na drugu aktivnost▫ Prikaz Toast poruke…
res/menu/main.xml<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/mnuSajtSkole"android:title="Sajt škole" />
<item android:id="@+id/mnuSMS"<item android:id="@+id/mnuSMS"android:title="Slanje SMS" />
<item android:id="@+id/mnuToast"android:title="Toast" />
</menu>
MainActivity.java…public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {
case R.id.mnuSajtSkole:Intent i1 = new Intent("android.intent.action.VIEW");i1.setData(Uri.parse("http://www.vts-zr.edu.rs"));i1.setData(Uri.parse("http://www.vts-zr.edu.rs"));startActivity(i1); return true;
case R.id.mnuSMS:startActivity(new Intent(this, Sms.class));return true;
case R.id.mnuToast:Toast.makeText(getBaseContext(), "Poruka iz menija",Toast.LENGTH_SHORT).show();return true;
default:return super.onOptionsItemSelected(item);
}}…
Ikonica• Najjednostavniji
način za izmenu ikonice“ic_launcher.png” je editovanje postojeće ikonice koja postoji u više veličinaviše veličina
• Potrebno je izmeniti sve verzije ikonicekako bi na svim veličinama ekrana izgledale isto
Informacione tehnolgijeInformacione tehnolgijeLBS (engl. Location-based services)
LBS (engl. Location-based services)
• LBS omogućava korišćenje lokacijskih servisa na Andorid uređaju
• Preduslovi:• Preduslovi:▫ Potrebno je posedovati gmail nalog▫ Napraviti nov projekat na Google APIs console.
Posle toga mu je moguće pristupati na https://console.developers.google.com/
Kreiranje projekta• Na ovoj stranici je
potrebno napraviti novi projekatnapraviti novi projekat
• To se vrši klikom na dugme “Createproject…”
• Posle toga je potrebno pristati na ugovor
Ugovor
Uključivanje funkcionalnosti mape
Pravljenje ključa (Public API access)
SHA1 Fingerprint (U Eclipse na Window->Preferences->Android->Build)
Unos SHA1 + namspace = API key
API key• API key(u ovom slučaju AIzaSyBy7yf3DMSwvVR-StLfCSEl7Khcuf-lBa0) je vrednost koja nam je potrebna za uspešno povezivanje aplikacije i servisa
U projekat je potrebno dodati referencu
AndroidManifest.xml…
<permission android:name="zr.vts.tokvts.permission.MAPS_RECEIVE" android:protectionLevel="signature" android:required="false"/>
<uses-permission android:name="zr.vts.tokvts.permission.MAPS_RECEIVE" android:required="false"/>
<uses-permission android:name="android.permission.INTERNET" android:required="false"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:required="false"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" android:required="false"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:required="false"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:required="false"/>
<uses-permission android:name="android.permission.CALL_PHONE" android:required="false"/>
…
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyBy7yf3DMSwvVR-StLfCSEl7Khcuf-lBa0" />
maps.xml<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".maps" >
<fragment android:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent"class="com.google.android.gms.maps.SupportMapFragment"/>
</RelativeLayout>
Maps.javapackage vts.zr.vts_it_vezbe;
import com.google.android.gms.maps.CameraUpdateFactory;import com.google.android.gms.maps.GoogleMap;import com.google.android.gms.maps.SupportMapFragment;import com.google.android.gms.maps.model.BitmapDescriptorFactory;import com.google.android.gms.maps.model.LatLng;import com.google.android.gms.maps.model.MarkerOptions;import android.os.Bundle;import android.app.ProgressDialog;import android.content.Intent;import android.support.v4.app.FragmentActivity;import android.view.Menu;import android.view.MenuItem;import android.widget.Toast;
public class Maps extends FragmentActivity {public class Maps extends FragmentActivity {private GoogleMap gmap;ProgressDialog progDailog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.maps);initMap();}
private void initMap(){try {SupportMapFragment mf = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);gmap = mf.getMap();gmap.setMyLocationEnabled(true);gmap.setMapType(GoogleMap.MAP_TYPE_NORMAL);} catch (Exception e) {Toast.makeText(getBaseContext(), "initMap error", Toast.LENGTH_SHORT).show();e.printStackTrace();}}}
Primer dodavanja markera – Maps.java• Pozvatu funkciju u onCreate:addMarkersToMap();• U nastavku odati sledeći kod:private void addMarkersToMap(){LatLng vtszr = new LatLng(45.377691,20.382857);try {gmap.addMarker(new MarkerOptions().title("Visoka tehnička škola strukovnih studija u Zrenjaninu").snippet("Đorđa Stratimirovića 23, 23000 Zrenjanin")
.position(vtszr)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE))
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));} catch (Exception e) {Toast.makeText(getBaseContext(), "Neuspešno učitavanje markera",
Toast.LENGTH_SHORT).show();e.printStackTrace();}try {gmap.moveCamera(CameraUpdateFactory.newLatLngZoom(vtszr, 15));gmap.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);} catch (Exception e) {Toast.makeText(getBaseContext(), "Neuspešno zumiranje",
Toast.LENGTH_SHORT).show();e.printStackTrace();}}
Informacione tehnolgijeInformacione tehnolgijeObjavljivanje Android aplikacije
Izvoz projekta• Kada je
aplikacija završena i iztestirana završena i iztestirana potrebno je uraditi njen izvoz u verziju za objavljivanje
• Desni klik > Export
Izvoz projekta
Ukoliko nemamo keystore možemo napraviti jedan
• Potrebno je da unesemo putanju za keystore i da unesemo šifru dva putaunesemo šifru dva puta
• Šifru je neophodno zapamtiti za kasniju upotrebu
• Zatim je potrebno napraviti i ključ
Lokacija odredišnog fajla• Na kraju je potrebno odrediti lokaciju i naziv odredišnog fajla• Posle ovoga je fajl spreman za objvaljivanje na GooglePlay
prodavnici
Literatura
• Prezentacija je u skladu sa knjigom: Wei-MengLee, Android 4 razvoj aplikacija, Kompjuter biblioteka, 2012, ISBN broj: 978-86-7310-488-1. na sledeći način:biblioteka, 2012, ISBN broj: 978-86-7310-488-1. na sledeći način:▫ Android SDK. AVDHello World aplikacija , strane
1-33▫ Dizajniranje korisničkog interfejsa pomoću
pogleda, strana 159-202▫ Aktivnosti i namere, strana 35-68 i 85-97▫ Layout, strana 105-123