it vezbe android

Post on 10-Feb-2016

51 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

android aplikacije i kako ih napraviti. Rad u aplikaciji android studio

TRANSCRIPT

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 = {"office@vts-zr.edu.rs"};

String[] cc = {"office@vts-zr.edu.rs"};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

top related