Šta je novo?

[Android][Tutorial] Mala skola

nnnn

Slavan
Učlanjen(a)
31.10.2006
Poruke
1,377
Poena
349
Pozdrav svima,
posto mnogo volim ovaj forum, a mnogo volim i programiranje i zao mi je sto je ovaj deo foruma zapusten. Povremeno se javi neko ali to u uglavnom slicna pitanja, ili neki zadatak za skolu/faks. Eventualno neko od nas uradi i tema zamre. Hteo bi da pokusam da dignem malo ovaj deo iz mrtvih i planiram seriju tekstova i tutoriala da napisem o raznim stvarima. Prvo sto cu uraditi bice jedan Android tutorial, posto vidim da vlada dosta veliko intresovanje za programiranje na ovoj platformi. Moja ideja je da baziram sve na prakticnim primerima, tako da cemo na kraju ovog tutoriala zajedno napraviti jedan jednostavni digitron :)

Potrebno je neko osnovno znanje iz programiranja da bi ste razumeli ovo.

Part I - Pripremanje razvojnog okruzenja za android, i "Zdravo svete" program :)

Potrebno je skinuti sledece stvari:

Eclipse razvojno okruzenje:
http://www.eclipse.org/downloads/do.../helios/SR1/eclipse-java-helios-SR1-win32.zip
Java Runtime environment:
http://www.java.com/en/download/index.jsp

Android SDK(Software development kit):
http://dl.google.com/android/installer_r11-windows.exe

Predpostavicu da ljudi koje hoce da se bave programiranjem znaju da instaliraju proram :) Instalirajte Javu, pa Eclipse, a Android SDK odpakujte folder koji zelite. Sledeca stavka je da instalirate Eclipse plugin za android, startujte eclipse, izaberite workspace( to je folder gde ce se sadrzati vasi projekti), kada udjete u eclipse, Help > Install New Software, pa add, unesite ime bilo koje npr "Android Plugin" u location upisite
Kod:
https://dl-ssl.google.com/android/eclipse/

Nazad na Available Software trebali bi ste da vidite "Developer Tools" na listi, nadjite tu Android DDMS i Android Development Tools, kliknite next, instalirajte pluginove, resetujte eclipse.

Sledece sto treba da uradite je da u Window > Preferences ->Android podesite lokaciju Android SDK.

Testiranje aplikacija mozete raditi na emulatoru, ili na pravom telefonu. Da bi ste ubacivali aplikaciju direktno u telefon b jednim klikom u Eclipsu, potreban vam je USB driver, njega cete skinuti tako sto ce te u Android SDK folderu, startovati "SDK Manager.exe" i od opcija, stiklirati, USB driver. Posle ga dodajte u windows kao bilo koji drugi driver.

Druga opcija je koriscenje emulatora, emulator je veoma mocna stvarcica, jel mozete da pravite bezbroj uredjaja, sa razilicitim specifikacijama da proverite kako ce vasa aplikacija izgledati na razlicitim ekranima, itd..

Kliknite na malu ikonicu telefona:

45aae16942.jpg


Kao sto vidite ovde imate spisak uredjaja koje ste do sada napravili, kliknite new:

6f9ae77cfb.jpg


Kao sto vidite ovde je sve jednostavno, unesete ime uredjaja, izaberete verziju operativnog sistema, velicinu prostora na kartici, velicinu ekrana, i dole imate da dodajete razne hardverske stavke, koje telefon podrzava ili ne. Ako imate aplikaciju koja radi sa gps-om dodacete gps itd..

Kada ste napravili novi uredjaj, spremni smo za rad. :)

Idite na File -> new -> other, selektujte Android -> Android Project

1b2a693d8f.jpg


Project name -> Ime projekta, neka bude zdravo

Build target, koji operativni sistem cijate.

Aplication name, ime aplikacije same. Package name, ovo su java paketi, svatite pakete nekako kao direktorijume, ali koji cuvaju Java klase.

Create Activity, vise o ovome kasnije.

Popunite kao na slici:
90325c2176.jpg


Finish. Pokusajte da startujete aplikaciju, na zelenu strelicu, pitace vas kako da je startuje, selektujte Android aplication. Ako izbaci gresku da ne moze da nadje gen.R onda idite na project pa clean. Pa opet start, trebali bi ste da dobijete ovako nesto:
c07eb60b30.jpg


Ovo bi bilo to za pocetak, u sledecm odgovoru, cu proci kroz osnove android aplikacije, a posle toga krecemo sa digitronom, naravno ako ima interesovanja.

Komentari su dobrodosli.
 
Poslednja izmena od urednika:
Meni je ovo vrlo zanimljivo, more please :)
Btw, koja je fora sa vendorom, AOSP ili Google Inc, jel se tako razdvajaju free/open source aplikacije od onih koje se plaćaju, ili sam ja pogrešno skontao? :d
 
Super je što si ovo pokrenuo ali ja bih ti predložio da ideš malo bržim tempom.

Objedini u jednom tutorijalu osnove razvojnog okruženja, android aplikacije i tome sl. pa odmah kreni na taj digitron. One koji nešto znaju to neće impresionirati ali treba voditi računa da one koji tek kreću s učenjem ne ubiješ u pojam :).

Digitron je prava stvar za početak.
 
Super je što si ovo pokrenuo ali ja bih ti predložio da ideš malo bržim tempom.

Objedini u jednom tutorijalu osnove razvojnog okruženja, android aplikacije i tome sl. pa odmah kreni na taj digitron. One koji nešto znaju to neće impresionirati ali treba voditi računa da one koji tek kreću s učenjem ne ubiješ u pojam :).

Digitron je prava stvar za početak.

Znam, ali mi je za ovo trebalo duze nego sto sam planirao jel sam nesto sj*bao eclipse slucajno :D pa sam sve skidao ispocetka, itd.. Verovatno cu veceras jos pisati.
 
I ja sam nesto pokusavao sa programiranjem za android i dva puta sam unistio Eclipse :D. Svi su bar po jednom, ceo ovaj postupak podesavanja ispadne zamrseniji nego sto izgleda.

A sto sam prestao... pojma nemam, nekako mi nije bilo primamljivo posto nemam Android telefon i koliko sam shvatio treba brdo XML-a, a u momentu mi se stvarno nije ucio.

Mozda se opet bacim na to, hvala sto si me podsetio :) .

P.S Jel simulator i dalje onako peverzno spor?
 
Podrzavam ideju, za sada se jos malo bavim C# i .net frameworkom (jako mi se svidja sintaksa jezika). Ali planiram kasnije da i malo uplovim u Java vode, a posto mi je nekako glupo da pravim desktop aplikacije u javi, Android platforma mi zvuci idealno.
Ovako na prvo citanje dosta razumljivo izgleda tutorijal, naravno da npr. skontas sve cake IDE-a moras da probas razna podesavanja da cisto ispobas da vidis sta kako radi. Bice od pomoci tutorijal da se neluta okolo.

Btw. za Android platformu aplikacije se prave samo u Javi ,ili moze i nesto u C/C++ posto vidim da spominju i te jezike ?
 
Sto se tice, programiranja, postoji NDI( Native development kit ) U kome mogu da se pisu biblioteke u c/c++ koje se kompajliraju u arm kod. I to moze da sluzi da se odredjene stvari izvrsavaju brze, na primer neki dekoding, ili 3d grafika, itd. Pisem upravo, drugi deo, ako ne zaspim zavrsicu ga veceras.
 
Part II - Osnove android aplikacije

Ovde bi vas zamolio da napravite Android projekat kao u proslom delu.

Obartite paznju na ovu sliku, oznacio sam neke bitne stvari, kao i neke koje necete dirati, ali da znate sta su.

09a717d204.jpg


src - Ovde stoje svi vasi paketi i source codovi(klase), vezba.zdravo je jedan paket, u njemu imamo hello.java fajl, koji je otvoren trenutno. Preporucuje se da sve sto radite grupisete u pakete, koji donekle opisuju ono sto sadrze.

gen - Ovo ovde sve eclipse sam generise iz xml fajlova( o tome malo kasnije ), tu se nalazi klasa R, koja je veoma jednostavna, samo sadrzi odrejen broj promenjivih, koje mozete da citate ( primer SetContentView(R.layout.main ). Tu se nalazi jos dosta stvari koje ce vam trebati.
Primer klase R
Kod:
public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int icon=0x7f020000;
    }
    public static final class id {
        public static final int EditText01=0x7f050000;
        public static final int ImageView01=0x7f050001;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}
Kao sto vidite, ona sadrzi samo promenjive, koje mozemo da citamo, kao sto su app_name, ili nas layout, itd..

Android 1.6 i android.jar - To su android biblioteke, ako to otvorite videcete gomilu paketa i klasa, to sve mozete da koristite, ali morate da uvezete sta vam treba, sa import ( primer import android.app.Activity;)

res - Ovo je veoma bitno, res je skracenica od resource, sto znaci, ovde cete drzati resurse koje cete pozivati iz koda. drawable sadrze grafiku(png uglavnom), sad kada ubacite grafiku u drawable, u R klasi ce se generisati referenca na nju automatski.
layout - Ovde se zadrzi xml fajlovi koji sadrze layout( raspored ) elemenata svakog prozora u vasoj aplikaciji.
values - Ovde upisujete konstante koje mozete da citate iz cele aplikacije.
layout - Izgled jedne stranice aplikacije, vise informacija dole.

AndroidManifest - Ovo je srz vase aplikacije, sadzi sve informacije o njoj, bice kasnije detaljno opisan.


Srz andoid aplikacije cine:

Activity - predstavlja svaki "ekran" koji vasa aplikacija prikaze, svaka "strana" koju prikazete. Aplikacija moze da se sastoji od samo jedne ili mnogo vise njih.

Services - Servis nema vidljiv interfejs, nego se izvrsava u pozadini, neko odredjeno ili beskonacno vreme. Na primer moze da pusta muziku, da skida podatke sa neta. Ili dok vasa aplikacijja radi nesto servis moze da komunicira sa serverom i skida neke podatke. Ovo isto moze da se postigne sa nitima i procesima, razlika je sto ovde vec imate interface i api za komunikaciju i upravljanje, a ovako bi ste morali da napisete svoje.

Broadcast receivers - Broadcast receiver je komponenta koja samo sluzi da prima i reaguje na razna obavestenja.
Ona mogu poteci iz samog sistem, na primer, da je baterija pri kraju, da je korisnik promenio jezik, da se promenila vremenska zona.. itd Ili mogu da poteknu od neke druge aplikacije.

Content providers Content provider sluzi da bi ste stavjali podatke drugim aplikacijama, bilo to baza podataka, fajl..



Sad da se vratimo na manifest fajl.

75dd70671f.jpg


Manifest je u supstini jedan jednostavan xml fajl, samo sto ga eclipse cita i predstavlja u grafickom obliku tako da nam je lakse da manipulisemo sa njim. Tu podesavamo sve paremetre aplikcije, isto tako u manifestu moramo da definisemo svaki Activity koji koristimo. Android aplikacija nema sve dozvole po defaultu, nego svaka mora rucno da joj se dodeli, kao na primer pristup internetu, i to moramo preko manifesta da ubacimo.

Evo kako izlgeda xml naseg programa Zdravo:

Kod:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="vezba.zdravo"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        
     <activity android:name=".hello"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-sdk android:minSdkVersion="4" />

</manifest>

Vidite android:icon="@drawable/icon" ovo znaci da ikonica nase aplikacije je ona koja stoji u drawable i zove se icon.

<activity android:name=".hello" - Nas activity koji smo definisali u stvaranju projekta. ime mu je hello.
Na primer ako bi dodali dozvolu za korsicenje neta dodali bi ovo:

Kod:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
Sve u svemu ovaj xml je dosta jednostavan i kada udjete u stos, postane veoma lako rucno ga menjati i razumeti.


Sad jos malo da posvetim pricu u layoutu, mada detaljno cemo to obraditi sutra, kada budemo poceli digitron da pravimo.

dupli klik na layout->main
dobicete ovo:
168b4d3da7.jpg


Pogledamo sta ovde imamo, sa lve strane imamo layouts, ovo je nacin na koji se slazu komponente na ekranu( detaljno cu opisati drugom priliko par njih) ispod imamo Views, tu imamo razne standardne komponente, dugmice, check boxove, unos teksta, itd..

Sad uvatite, i na view, nadjite "EditTect" pa ga "prevucite" na prozor, i "ImageView" i njega prevucite, dobicete ovo:

1cea584f87.jpg


Pogledajte sada main.xml, klikom na tab( dole )
Kod:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />

<EditText 
	android:text="@+id/EditText01" 
	android:id="@+id/EditText01" 
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content">
</EditText>

<ImageView 
	android:id="@+id/ImageView01" 
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content">
</ImageView>

</LinearLayout>

Izgledao je malo drugacije, EditText i ImageView su bili u jednm redu, jel ih tako generise, ali ovako formatiram zbog preglednosti.

Pogledajmo <EditText, pa android:text="@+id/EditText01", promenimo ovo u android:text="Benchmark", vratite se na Layout tab, i vidite da se promenio teks u dugmetu. Sad obartite paznju android:id="@+id/EditText01" ovo "EditText01" je ID ove komponente na ovom layoutu, njega koristite da pristupate njoj iz koda ( bice kasnije obradjeno )

Da, <TextView android:text="@string/hello" Ovo "@string/hello" znaci da cita konstantu hello iz values.

Sad cemo da dodamo nesto u <ImageView, dodacemo ovo android:src="@drawable/icon" da bi dobili na kraju ovakav main.xml fajl:

Kod:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />

<EditText
	android:text="Benchmark" 
	android:id="@+id/EditText01" 
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content">
</EditText>
<ImageView 
	android:id="@+id/ImageView01" 
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content"
	android:src="@drawable/icon"
	>
</ImageView>
</LinearLayout>

I kada se vratimo na pregled imamo ovo:

95ea6c1c75.jpg


Ovo bi bile neke osnove instalacije i upoznavanja sa razvojnim okruzenjem, u sledecem koraku cemo poceti sa pravom aplikacijom i u realnom radu videti i objasniti mnoge stvari koje su ovde samo nacete.

PS: molio bi moderatora da stavi ovaj odgovor odma iza prvog posta. Hvala
 
PS: molio bi moderatora da stavi ovaj odgovor odma iza prvog posta. Hvala

mislim da to ne moze... a ne moze ni da se ubaci u prvi zbog raznih limita.

aj probacemo nesto da smislimo, ali izgleda da forum nije pogodan medijum za ovakve stvari...

ps. mozda da potrpamo sve druge postove u
tagove? bolje nego da ih brisemo?
 
Nema veze, onda je mozda najbolje, na kraju, izdvojiti sve delove u novu temu a ovu ostaviti. Nek stoji ovako kako jeste za sada.. :)
 
Poslednja izmena:
^^Slazem se, jedan deo gde je cist tutorial, drugi u kome mozemo da komentarisemo :) .
 
Part III - Digitron UI

Krecemo sa digitronom, u ovom delu cemo dizajnirati User interface, kao i napisati osnovnu funkcionalnost njega.

Napravite novi Android 1.6 projekat, Nazovite ga Digitron, paket nek bude vezba.digitron, a acitivity "Glavna"

Idite na main.xml ( res-> layout)

Podesite, na 3.2in HVGA, portrait. Dalje, izbrisite sve sa njega, cak i layout. I onda prevucite "Relative layout" na povrsinu. Dobicete ovo:
aa79be476e.jpg


Da se vratimo na temu layout i relative layout. Layout je "nacin" na koji vi slazete elemente na povrsini. Relative layout se elementi slazu u odnosu na jedan drugi, kroz primer ce biti malo jasnije.

Dodajte jedan "EditText" pa posle njega jedno dugme (Button):
adcdf58865.jpg


Iako sve parametre mozete da postavljate preko Eclipse UI-a(kroz properties) Mi cemo sada da napravimo ovo da lici na nesto kroz xml. Predjite na tab main.xml(dole)

Opet je xml izgenersian totalno nepregledno, dovedite ga u pregledno stanje da izgleda ovako:
Kod:
<RelativeLayout 
android:id="@+id/RelativeLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android">

<EditText 
android:text="@+id/EditText01" 
android:id="@+id/EditText01" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content">
</EditText>

<Button
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:id="@+id/Button01" 
android:layout_below="@+id/EditText01" 
android:text="@+id/Button01">
</Button>

</RelativeLayout>

Sada cemo da izmenimo ovo da lici na digitron( sa jednim dugmetom, ali dobro :) )

Prvo da dovedemo u red malo EditText. Id cemo da mu promenimo, u display, tako sto cemo
Kod:
android:id="@+id/EditText01"
da promenimo u
Kod:
android:id="@+id/display"
android:text="@+id/EditText01" liniju cemo obrisati( jel nam ne treba nista da pise )

Kod:
android:layout_width="wrap_content"
Sta ovo znaci, ovo znaci da sirina ovog elementa ce biti koliki je njen sadrzaj, znaci sta pise u njoj, toliko ce biti, nama treba fiska sirina tako da cemo da stavimo u
Kod:
android:layout_width="300dip" 
i isto to za height
android:layout_height="70dip"

Sada cemo da dodamo neke nove parametre:
Kod:
android:layout_marginLeft="10dip"
android:layout_marginTop="5dip"
android:textSize="60dip"
MarginLeft i MarginTop, znaci koliko ce biti udaljene od levog, odnosno gornjeg elementa. TextSize, nema potrebe da kazem da oznacava velicinu teksta.

Dalje dodajemo malo kozmetike
Kod:
android:editable="false"   // Ovo znaci da ne moze iz programa da se kuca tekst
android:singleLine="true"   // Da je box samo u jednom redu
android:clickable="false"    // da ne mozemo da kliknemo na njega
android:gravity="right"     //DA tekst ide sa desne strane, bas kao na pravom digitronu

android:background="#336600"  //Boja pozadine, u hex formatu ( google -> HTML color codes )

Sada da sredimo nase dugme, njega cemo da prepravimo da izgleda ovako:
Kod:
<Button 
android:id="@+id/unos_9" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"

[B]android:layout_below="@+id/display" [/B]

android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="9">
</Button>

Ovde jedina nova stavka koju imamo je android:layout_below="@+id/display"
Ovo znaci da se dugme nalazi ispod naseg EditTexta ciji smo id stavili "display" a ove margine oznacavuju pomeraj u odnosu na display

Pregled celog main.xml
Kod:
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout 
android:id="@+id/RelativeLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android">

<EditText 
android:id="@+id/display" 

android:layout_width="300dip" 
android:layout_height="70dip" 
android:layout_marginLeft="10dip"
android:layout_marginTop="5dip"
android:textSize="60dip"

android:editable="false" 
android:singleLine="true" 
android:clickable="false" 
android:gravity="right"

android:background="#336600">
</EditText>

<Button 
android:id="@+id/unos_9" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/display" 
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="9">
</Button>

</RelativeLayout>

Vratite se na layout tab i pogledajte kako nam izgleda sada ekran:
ff1df4988e.jpg


Sada cemo da napravimo da klik na gume "9" upisuje 9 na display naseg digitrona.

Otvorite Glavna.java Ona trenutno izgleda ovako:
Kod:
package vezba.digitron;

import android.app.Activity;
import android.os.Bundle;

public class Glavna extends Activity {
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       }
   }

Da pojasnim malo: Klasa glavna je izvedena od Android klase Activity i kao takva se prikazuje na ekranu naseg telefona.
Activity ima 4 stanja
-Activity se trenutno prikazuje na ekranu, znaci aktivna je i izvrsava se.
-Ako je izgubila fokus a jos uvek se vidi. Na primer pop up je iskocio, ili smo neko prozorce otvorili koje nije pun ekran, koje trenutno ima fokus. Ona je pauzirana, ali je u podpunosti aktivna, sto znaci da cuva svoje stanje i ostaje prikacena za window manager, ali u ekstremnim situacijama system moze da je ubije(u slucaju low low memory)
-Ako vise nije vidljiva onda je zaustavljena. Jos uvek cuva sve informacije, ali posto nije vise aktivna desava se da se proces ubije i onda se vracamo na pocetak.
-Activity je pauzirana ili zaustavljena ali je process ubjen i svaka informacija se izgubila, kada zelimo opet da je prikazemo moramo da je restartujemo.
Evo ga jedan dijagram koji pokazuje to bolje nego sto ja mogu da objasnim
activity_lifecycle.png


U kvadratima se nalaze funkcije koje mi mozemo da Override ( napisemo nase funkcije da zauzmu mesto podrazumevanim funkcijama)

Dobro da se vratimo malo na kod:
Kod:
public void onCreate(Bundle savedInstanceState)
Znaci kao sto sam gore pricao ova funkcija se poziva kada se activity kreira, Bundle savedInstanceState je predhodno stanje( ako ga ima)

super.onCreate(savedInstanceState);
Zovemo onCreate za nad klasu( Activity)

setContentView(R.layout.main);
Ovo nam je bitno, znaci mi ovim kazemo da ce nas activity da prikaze onaj main.xml
Njegova referenca se nalazi generisana u R.layout klasi ( pogledajte kako izgleda klasa R )

Sada da dodamo funkcije za nas ekran i nase dugmice.

Na pocetku klase dodacemo:

[CODE]
public class Glavna extends Activity {
	
	private EditText display;
	private Button unos_9;
	
    /** Called when the activity is first created. */
 @Override
...
Kada mu ovo napisete, eclipse ce sam dodati
import android.widget.Button;
import android.widget.EditText;

Ako ne doda, dodajte vi rucno.

Znaci ovde smo definisali dva objekta, jedno dugme i jedan editor teksta. Imajte u vidu da su ovo objekti koji trenutno nemaju nikakve veze sa onima sto smo pravili u main.xml

Sada cemo posle kraja metode onCreate, da napravimo novu metodu nazvacemo je setButtonListeners()
Sta ce ona da radi, pa posto cemo imati dosta dugmica u nasem digitronu, a za svaki mora da pravimo "osluskivac" dogadjaja. Sta je to?
Ukratko to je funkcija koja ce da reaguje da dogadjaje dugmeta, ono sto nama treba je onClick, ili ti da reaguje kada pritisnemo tu.

Ovako cela funkcija izgleda:

Kod:
 private void setButtonListeners()
    {
    	//Inicijalizacija dugmica
    	unos_9=(Button)findViewById(R.id.unos_9);

    	//Dodavanje "osluskivaca" dogadjaja
    	unos_9.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				display.append("9");
       			}  });
     	 
    }

Da pojasnim malo
unos_9=(Button)findViewById(R.id.unos_9);
findViewById je funkcija koja nalazi objekat tipa View( sve sto se prikazuje na ekranu je objekat tog tipa ) po ID-u, a id se cuva u klasi R, njega smo definisali sa onim main.xml, Znaci klasa R je bukvalno veza izmedju xml dela i android dela. I sa ovim redom mi kazemo onom nasem objektu da je on u stvari ono dugme iz main.xml

unos_9.setOnClickListener(new OnClickListener() {....
Ovo je sad malo komplikovanjije da se svari, ali u principu i ne morate da znate u detalje kako radi, ono sto treba da znate je da ovde
public void onClick(View v) pisete ono sto ce vase dugme da radi na click.
Ali da objasnim malo, setOnClickListener dodeljuje osluskivac dogadjaja objektu sa kojim ste ga pozvali. Sad Osluskivac dogadjaja ceka da se nesto desi i kada se to desi on radi sta mu je receno. Posto je to objekat, a nemamo ni jedan da mu dodelimo, moramo da napravimo novi i to je ovo new OnClickListener() mi ovim pravimo "bezimeni" objekat i u njemu pisemo funkciju onClick

display.append("9"); Ovo samo doda na nas display "9";

Ceo kod sada izlgeda ovako:
Kod:
package vezba.digitron;

import android.app.Activity;
import android.os.Bundle;
import android.view.*;
import android.view.View.*;
import android.widget.Button;
import android.widget.EditText;

public class Glavna extends Activity {
	
	private EditText display;
	private Button unos_9;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
         //Inicijalizacija naseg displaya (EditText), i povezivanje sa onim EditText(display) u main.xml
        display=(EditText)findViewById(R.id.display);
        //poziv nase funkcije koja ce da inicijalizuje dugmice i da im dodeli sta da rade
        setButtonListeners();
        }
   
    private void setButtonListeners()
    {
    	//Inicijalizacija dugmica
    	unos_9=(Button)findViewById(R.id.unos_9);
    	
    	//Dodavanje "osluskivaca" dogadjaja
    	unos_9.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
                                //Ovo se izvrsava kada kliknemo na dugme
       				display.append("9");
       			}  });
    	 
    }
}

Sacuvajte sve i pokrenite, ako je sve kako treba kada kliknete na dugme "9" onos eispise na displey-u

a42bed6d11.jpg


U nastavku, cemo da kompletiramo UI sa svim brojevima i funkcijama ( + - CE itd )
Pa onda prelazimo na programiranje digitrona, i onda na fino tuniranje, gde cemo videti kako se pravi menu, i kako se prelazi izmedju Activity-a

Komentari, sugestije i pitanja su dobrodosli.

Samo da napomenem, da ja nemam gotov program uopste, nego ga pravim kako pisem ovo upustvo, tako da je moguce da ce krajni kod da se izmeni.. :)

Nastavak u sledecem postu.
 
Poslednja izmena:
Nastavak onog odozgo, sada cemo da dodamo ostale dugmice u nas digitron. vratite se na main.xml

pa redom dodajemo:
Kod:
<Button 
android:id="@+id/unos_8" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/display" 
android:layout_toRightOf="@+id/unos_9"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="8">
</Button>
Ovde jedinos to iam novo je android:layout_toRightOf="@+id/unos_9"
sto znaci da se dugme broj 8 nalazi desno od dugmeta broj 9. I ja sam upravo svato da sam se sjebao da je 9 trebalo da bude na drugoj strani, ali nema veze, kada napravimo 7, samo cemo da zemenimo ID i rext 7ci i 9tki. 

Sledece sto dodajemo
[CODE]
<Button 
android:id="@+id/unos_7" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/display" 
android:layout_toRightOf="@+id/unos_8"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="7">
</Button>

I sada cemo da im zamenimo mesta i ceo xml ce da izgleda ovako
Kod:
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout 
android:id="@+id/RelativeLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android">

<EditText 
android:id="@+id/display" 

android:layout_width="300dip" 
android:layout_height="70dip" 
android:layout_marginLeft="10dip"
android:layout_marginTop="5dip"
android:textSize="60dip"

android:editable="false" 
android:singleLine="true" 
android:clickable="false" 
android:gravity="right"

android:background="#336600">
</EditText>

<Button 
android:id="@+id/unos_7" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/display" 
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="7">
</Button>

<Button 
android:id="@+id/unos_8" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/display" 
android:layout_toRightOf="@+id/unos_7"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="8">
</Button>

<Button 
android:id="@+id/unos_9" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/display" 
android:layout_toRightOf="@+id/unos_8"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="9">
</Button>

</RelativeLayout>

I tako sada dodajemo polako za sve elemente i na kraju ovako nesto dobijemo:

Kod:
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout 
android:id="@+id/RelativeLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android">

<EditText 
android:id="@+id/display" 

android:layout_width="300dip" 
android:layout_height="70dip" 
android:layout_marginLeft="10dip"
android:layout_marginTop="5dip"
android:textSize="60dip"

android:editable="false" 
android:singleLine="true" 
android:clickable="false" 
android:gravity="right"

android:background="#336600">
</EditText>

<Button 
android:id="@+id/unos_7" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/display" 
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="7">
</Button>

<Button 
android:id="@+id/unos_8" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/display" 
android:layout_toRightOf="@+id/unos_7"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="8">
</Button>

<Button 
android:id="@+id/unos_9" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/display" 
android:layout_toRightOf="@+id/unos_8"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="9">
</Button>

<Button 
android:id="@+id/unos_puta" 
android:layout_width="65dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/display" 
android:layout_toRightOf="@+id/unos_9"
android:layout_marginTop="10dip"
android:layout_marginLeft="5dip"
android:text="x">
</Button>

<Button 
android:id="@+id/unos_4" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/unos_7" 
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="4">
</Button>

<Button 
android:id="@+id/unos_5" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/unos_7" 
android:layout_toRightOf="@+id/unos_4"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="5">
</Button>

<Button 
android:id="@+id/unos_6" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/unos_7" 
android:layout_toRightOf="@+id/unos_5"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="6">
</Button>

<Button 
android:id="@+id/unos_pod" 
android:layout_width="65dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/unos_7" 
android:layout_toRightOf="@+id/unos_6"
android:layout_marginTop="10dip"
android:layout_marginLeft="5dip"
android:text="/">
</Button>

<Button 
android:id="@+id/unos_1" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/unos_4" 
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="1">
</Button>

<Button 
android:id="@+id/unos_2" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/unos_4" 
android:layout_toRightOf="@+id/unos_1"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="2">
</Button>

<Button 
android:id="@+id/unos_3" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/unos_4" 
android:layout_toRightOf="@+id/unos_2"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="3">
</Button>

<Button 
android:id="@+id/unos_plus" 
android:layout_width="65dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/unos_4" 
android:layout_toRightOf="@+id/unos_3"
android:layout_marginTop="10dip"
android:layout_marginLeft="5dip"
android:text="+">
</Button>

<Button 
android:id="@+id/unos_CE" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/unos_1" 
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="CE"
android:textColor="#FF0000">
</Button>

<Button 
android:id="@+id/unos_tacka" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/unos_1" 
android:layout_toRightOf="@+id/unos_CE"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text=".">
</Button>

<Button 
android:id="@+id/unos_0" 
android:layout_width="70dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/unos_1" 
android:layout_toRightOf="@+id/unos_tacka"
android:layout_marginTop="10dip"
android:layout_marginLeft="10dip"
android:text="0">
</Button>

<Button 
android:id="@+id/unos_minus" 
android:layout_width="65dip" 
android:layout_height="70dip" 
android:textSize="40dip"
android:layout_below="@+id/unos_1" 
android:layout_toRightOf="@+id/unos_0"
android:layout_marginTop="10dip"
android:layout_marginLeft="5dip"
android:text="-">
</Button>

<Button 
android:id="@+id/unos_jed" 
android:layout_width="300dip" 
android:layout_height="40dip" 
android:textSize="20dip"
android:textStyle="bold"
android:layout_below="@+id/unos_CE" 
android:layout_marginTop="2dip"
android:layout_marginLeft="10dip"
android:text="=">
</Button>
</RelativeLayout>

I to izgleda ovako:
cf5231e922.jpg


Nije najlepsi digitron niti najfukcionalniji, ali to nam nije ni cilj. Vi se slobodno igrajte sa ovim parametrima, da napravite drugaciji raspored dugmica i izgled.

Sad nam ostaje da im dodamo funkcionalnost, gore sam objasnio kako to izgleda za jedno dugme, sada cu to isto da prekopiram za sve brojeve, napomena, jos uvek nema nikakve funkcionalnosti digitrona, vec samo ispisivanje na displeyu sta se kuca.

Glavna.java
Kod:
package vezba.digitron;

import android.app.Activity;
import android.os.Bundle;
import android.view.*;
import android.view.View.*;
import android.widget.Button;
import android.widget.EditText;

public class Glavna extends Activity {
	
	private EditText display;
	private Button unos_9,unos_8,unos_7,unos_6,unos_5,unos_4,unos_3,unos_2,unos_1,unos_0;
	private Button unos_tacka, unos_jed, unos_CE, unos_puta, unos_plus, unos_pod, unos_minus;

	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        display=(EditText)findViewById(R.id.display);
        
     
       setButtonListeners();
       
}
   
    //Ovde cemo dodavati funkcije digitrona za unos brojeva
    private void clickNumber(int x)
    {
    	//za sada samo dodamo na display
    	display.append(Integer.toString(x));
    }
    private void setButtonListeners()
    {
    	//Inicijalizacija dugmica
    	unos_9=(Button)findViewById(R.id.unos_9);
    	unos_8=(Button)findViewById(R.id.unos_8);
    	unos_7=(Button)findViewById(R.id.unos_7);
    	unos_6=(Button)findViewById(R.id.unos_6);
    	unos_5=(Button)findViewById(R.id.unos_5);
    	unos_4=(Button)findViewById(R.id.unos_4);
    	unos_3=(Button)findViewById(R.id.unos_3);
    	unos_2=(Button)findViewById(R.id.unos_2);
    	unos_1=(Button)findViewById(R.id.unos_1);
    	unos_0=(Button)findViewById(R.id.unos_0);
    	
    	unos_tacka=(Button)findViewById(R.id.unos_tacka);
    	unos_jed=(Button)findViewById(R.id.unos_jed);
    	unos_CE=(Button)findViewById(R.id.unos_CE);
    	unos_puta=(Button)findViewById(R.id.unos_puta);
    	unos_plus=(Button)findViewById(R.id.unos_plus);
    	unos_pod=(Button)findViewById(R.id.unos_pod);
    	unos_minus=(Button)findViewById(R.id.unos_minus);
    	
    	
    	//Dodavanje "osluskivaca" dogadjaja
    	unos_9.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				clickNumber(9);
       			}  });
    	unos_8.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickNumber(8);
        		}  });
    	unos_7.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				clickNumber(7);
       			}  });
    	unos_6.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickNumber(6);
        		}  });
    	unos_5.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				clickNumber(5);
       			}  });
    	unos_4.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickNumber(4);
        		}  });
    	unos_3.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				clickNumber(3);
       			}  });
    	unos_2.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickNumber(2);
        		}  });
    	unos_1.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				clickNumber(1);
       			}  });
    	unos_0.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickNumber(0);
        		}  });
    	
    }
    
}

Jedino sto sam promenio je sto sam napravio funkciju clickNumber i nju zovem za svaki broj kada se klikne, ti ce biti implementacija digitrona sto se tice unosa brojeva.
Ovo je kraj treceg dela ove skolice i provog dela digitrona. Napravili smo funkcionalni UI, sledece je implementacija digitrona.
b68142bcd2.jpg


PS: ako moze moderator da izbrise predhodnu poruku.
 
Poslednja izmena:
Da se izvinim, iskrsle su mi neke obaveze na faksa, zavrsicu tutorial sutra.
 
nnnn, kada god budeš mogao, nikakv problem. :)

Evo, evo ,) Juce sam ceo dan prespavao umoran od jurenja uslova.. Uvatio sam ga na kraju :d Tako da cu veceras da odradim nastavak ovoga.

Inace planiram jos dva dela. Jedan gde cu da napravim funkcionalnost digitrona.
I drugi gde cu da pokazem kako se dodaje menu, i kako se prelazi na drugi activity. :)

A ako ima zaniteresovanog naroda mislio sam da zajedno napisemo client/server aplikaciju, mali programcic za slanje sms-a preko racunara. :)
 
Nemam pojma o programiranju niti će mi ovo trebati ali svaka čast na trudu. Trebalo je vremena za ovo
 
Svaka cast! Citam, pratim! Planiram da pravim neku igricu, ali ne znam tacno sta ce mi sve trebati.. jel imas neka iskustva sa tim? Ili bar savet?

thx, d.
 
Napokon nastavak

Prvo da se izvinim sto mi je trebalo ovoliko, uletela mi je neka frka sa projektom nekim na faksu i nisam imao vremena da disem.

Part IV - Digitron funkcionalnost

U ovom cemo napraviti da nas digitron u stvari radi, nece biti najlepsi niti najfunkcionalniji ali ce da radi, to nam nije ni cilj, vi na osnovu ovoga ako zelite mozete da dodate brdo i brdo funkcija i da napravite pravi mali sience calculator.

Ovako, malo da udjem u neku teoriju kako sam ja napravio ovaj digitron, postoji mnogo nacina ja sam izabrao jedan.

Prvo da podelimo nasu aplikaciju na frontend i backend. Frontend bi bio user interface i klasa Glavna.
Backend ce biti isto klasa ja sam je nazvao Calculator.

Prednost ovakvog pristupa je, sto ja imam celu funkcionalnost uradjenu u mojoj klasi Calculator koja je 99% nezavisna od platforme, tacnije imam samo jednu Android komponentu mada mogao sam i bez nje, ali sam namerno stavio da vam pokazem prosledjivanje reference( vise o ovome malo kasnije). Sta ovo znaci? Pa znaci da vi ovu klasu mozete da iskoriste na primer ako pravite digitron za Blackberry, koji se isto pravi u javi, samo treba frontend da odradite, ili stand alone java aplikaciju, ili web aplet, ili kao deo neke komplikovane aplikacije.. Znaci re-usability, ili mogucnost ponovnog koriscenja.

Pa ajde da krenemo, desni klik na paket vezba.digitron -> new -> class
Nazovite klasu Calculator, finish, dobicete praznu klasu koja izgleda ovako:

Kod:
package vezba.digitron;

public class Calculator {
}

Ajde da vidimo koje promenjive nasa klasa treba da ima, dodacemo u nju:

Kod:
private float broj1,broj2;
Znaci 2 broja, prvi i drugi, u principu digitron uvek barata sa dva broja. Cim dobijete neki rezultat, on zauzima mesto prvog broja.

Kod:
private int state;
Ovo je kljucna stvar u svakom sistemu koji razvijate, njegovo stanje, namerno sam ovako pravio da bi pokazao kako se dosta stvari radi.
Nas sistem ima 5 stanja u kojima u datom trenutku moze da se nalazi, i za svako stanje"

* 0 - Tek startovan ili pritisnuto CE, jos uvek nije unet broj.
* 1 - Unos broja u toku, moze se pritisnuti operacija
* 2 - Pritisnuta operacija, moze se uneti drugi broj
* 3 - u toku je unos drugog broja, moze se pritisnuti operacija ili jednako
* 4 - pritisnuto je jednako, i ako se krene da se kuca broj vracamo se na stanje 1, a ako se pritisne operacija idemo na stanje 2

Nacrtao sam i graf u paintu, ako ce nekome biti tako lakse, moj umetnicki talenat doalzi do izrazaja ovde :d

6ee7d5d523.jpg


Dalje imamo i
Kod:
private int operand;
Jednostavno nasa operacija, definisali smo da svaki broj ozancava posebnu operaciju:
* 1 - Sabiranje
* 2 - Oduzimanje i negacija
* 3 - Mnozenje
* 4 - Deljenje
* 5 - jednako

Dalje sta imamo
Kod:
private EditText myDisplay;
Ovo je EditText android komponenta, kada ovo ukucate, eclipse ce automatksi da importuje potreban paket.

i jos imamo
Kod:
	private boolean dot;
	
	private int negation;

dot je flag koji pokazuje da li smo vec ukucali tacku, da ne bi dobili 43.256.12313.2
negation moze biti 1 i -1, i to koristimo kada unesemo minus pre nego sto unesemo broj.

Ovo su sve clanovi/promenjive nase klase.
Sada idemo na konstruktor:
Kod:
//konstruktor nase klase
	public Calculator(EditText disp)
	{
		state=0;//pocetno stanje
		[B]myDisplay=disp;[/B]
		negation=1;
		dot=false;
	}

Ovo je standardni konstruktor, koji inicijalizuje klasu na neke pocetne vrednosti, ovde imam zanimljivo ovaj (EditText disp) koji prosledjujemo kao parametar poziva. Sta se sada ovde desava, kada mi napravimo objekat ove klase iz glavne klase, i prosledimo mu nas display. U tom objektu se napravi referenca na onaj tamo, i to je bukvalno isti objekat, ovo nam je java lepo omogucila posto ona brine o svemu. I ovo je korisna stvar. Znaci sada myDisplay "pokazuje" na display iz glavnog ekrana, i sve sto uradimo na njemu refrektuje se na glavi ekran.

Sada imamo funckiju koja je najvaznija ovde i koja reaguje kada se pritisne operator:

Kod:
//funckija koja se zove kada se pritisne neki operator (+ - * / =)
	public void pressOp(int n)
	{
		dot=false;
		
		if(state==0 || state== 2)
		{
			if(n==2)// ako nismo poceli da unosimo broj a uneli smo minus, znaci broj je negativan
				negation=-1;
			return;
		}
		// znaci vec imamo neku cifru na ekranu
		String s= myDisplay.getText().toString(); //Vadimo zapis sa ekrana u string
		if (s.equals(null))return; // ako iz nekog razloga nema teksta izadji iz funkcije.
		float broj=Float.valueOf(s.trim()).floatValue();// pretvori string u broj
		
		if(state==1 && n!=5) //ako smo SAMO uneli jedan broj i pritisnuli operand
		{
			broj1=broj*negation; // ako nam je negation 1 nece se menjati akoje -1, samo menja znak
			operand=n;
			myDisplay.setText("");//cistimo ekran
			state=2;// postavljamo sistem u sledece stanje
			negation=1;// vracamo negaciju
		}
		else if(state== 3)
		{
			broj2=broj*negation;
			broj1=getRez(); // Prvi broj sada postaje rezultat operacije, getRez() funckija koja racuna
			myDisplay.setText( Float.toString(broj1));// Setujemo ekran da prikazuje rezultat.
			if(n==5)// ako je pritisnut operater jednako
				state=4;
			else
			{
				state = 2;//idemo na stanje 2 i cekamo opet "drugi" broj
				operand=n;// dobijamo novu operaciju
			}
			negation=1;
		}
		else if(state==4 && n!=5)
		{
			state=2;
			operand=n;
			myDisplay.setText("");//cistimo ekran
		}
	}

Znaci ovo u supstini prati onaj graf, gleda da li smo u stanju koje reaguje na operanda, ako jesmo radi izracunavanja ako treba i prelazi u stanje koje treba

Sledeca funkcija je ona koja reaguje na pritisak broja.
Kod:
//funkcija koja kada pritisnemo neki broj, proverava da li je sistem u nekom od stanja kada se ceka broj. 
	public void pressNum()
	{
		switch(state)
		{
		case 0:state=1;
			break;
		case 2:state=3;
			myDisplay.setText("");
			break;
		case 4:state=1;
			myDisplay.setText("");
			break;
		default:
			break;
		}
	}
Ovde primecujete da ne pravi razliku koji je broj pritisnut, nego samo obraca paznju na stanje sistema i menja ga ako treba.
Napomena: Ovde bi moglo da stoji myDisplay.append(broj) Ali posto smo u proslom delu napisali da se broj na ekran unosi u Glavnoj klasi, neka ostane tako.

Sledeca funkcija ili ti metoda nase klase je presDot() koju zovemo kada pritisnemo tacku i kada pritisnemo CE
Kod:
	public void pressDot()
	{
		/*
		 * Sta je fora sa tackom, moze samo jednom kada se kuca broj da se klikne, 
		 * i moze na pocetku, ako se klikne na pocetku, znaci to je 0.
		 */
		
		if (dot)return; // Ako je tacka pritisnuta, samo izadji iz funkcije.
		
		if(state==0 || state==2)// Stanja kada je ekran prazan, a mi pritisnemo tacku
		{
			myDisplay.setText("0."); // Ako nema nista na ekranu stavi 0.
			state++; //posto iz 0 prelazi u 1, a i 2 u 3
			dot=true; //flag za tacku
		return;
		}
		if(state==1 || state== 3)//ako je vec poceo unos broja, treba samo da se doda tacka
		{	myDisplay.append(".");
			dot=true;
		}
	}

//pritisak CE-a
	public void pressCE()
	{
	  //restart it all
		state=0;
		negation=1;
		dot=false;
		myDisplay.setText("");
	}

I na kraju metoda getRez() koja samo radi jednostavno racunanje od brojeva sa zadatim operatorom.

Kod:
private float getRez()
	{
		//vidimo koji je operand i uradimo zeljenu operaciju
		switch (operand) {
		case 1:
			return broj1+broj2;
		case 2:
			return broj1-broj2;
		case 3:
			return broj1*broj2;
		case 4:
			return broj1/broj2;
		default:
			return 0;			
		}
	}

Ovde verujem da je sve jasno.

Evo ga ceo kod za ovu klasu:

//Calculator.java
Kod:
package vezba.digitron;


import android.widget.EditText;

public class Calculator {

	private float broj1,broj2;
	
	private int state;
	/*State - stanje u kome se nalazi nas digitron
	 * 0 - Tek startovan ili pritisnuto CE, jos uvek nije unet broj.
	 * 1 - Unos broja u toku, moze se pritisnuti operacija
	 * 2 - Pritisnuta operacija, moze se uneti drugi broj
	 * 3 - u toku je unos drugog broja, moze se pritisnuti operacija ili jednako
	 * 4 - pritisnuto je jednako, i ako se krene da se kuca broj vracamo se na stanje 1, a ako se pritisne operacija idemo na stanje 2
	 */
	private int operand;
	/*
	 *  1 - Sabiranje
	 *  2 - Oduzimanje i negacija
	 *  3 - Mnozenje
	 *  4 - Deljenje
	 *  5 - jednako
	 */ 

	
	//Nas ekran iz Glavne klase, prosledjujemo referencu na njega u konstruktoru
	private EditText myDisplay;
	
	// dot ili tacka na engleskom, da li je stavljen zarez, posto moze samo jedan zarez.
	private boolean dot;
	
	//Kada je negativan broj
	private int negation;
	
	
	//konstruktor nase klase
	public Calculator(EditText disp)
	{
		state=0;//pocetno stanje
		myDisplay=disp;//referenca na display iz glavne klase
		negation=1;
		dot=false;
	}
	
	//funckija koja se zove kada se pritisne neki operator (+ - * / =)
	public void pressOp(int n)
	{
		dot=false;
		
		if(state==0 || state== 2)
		{
			if(n==2)// ako nismo poceli da unosimo broj a uneli smo minus, znaci broj je negativan
				negation=-1;
			return;
		}
		// znaci vec imamo neku cifru na ekranu
		String s= myDisplay.getText().toString();  //Vadimo zapis sa ekrana u string
		if (s.equals(null))return; // ako iz nekog razloga nema teksta izadji iz funkcije.
		float broj=Float.valueOf(s.trim()).floatValue();// pretvori string u broj
		
		if(state==1 && n!=5)//ako smo SAMO uneli jedan broj i pritisnuli operand
		{
			broj1=broj*negation; // ako nam je negation 1 nece se menjati akoje -1, samo menja znak
			operand=n;
			myDisplay.setText("");//cistimo ekran
			state=2;// postavljamo sistem u sledece stanje
			negation=1;// vracamo negaciju
		}
		else if(state== 3)
		{
			broj2=broj*negation;
			broj1=getRez(); // Prvi broj sada postaje rezultat operacije
			myDisplay.setText( Float.toString(broj1));// Setujemo ekran da prikazuje rezultat.
			if(n==5)// ako je pritisnut operater jednako
				state=4;
			else
			{
				state = 2;//idemo na stanje 2 i cekamo opet "drugi" broj
				operand=n;// dobijamo novu operaciju
			}
			negation=1;
		}
		else if(state==4 && n!=5)
		{
			state=2;
			operand=n;
			myDisplay.setText("");//cistimo ekran
		}
	}
	
	//funkcija koja kada pritisnemo neki broj, proverava da li je sistem u nekom od stanja kada se ceka broj. 
	public void pressNum()
	{
		switch(state)
		{
		case 0:state=1;
			break;
		case 2:state=3;
			myDisplay.setText("");
			break;
		case 4:state=1;
			myDisplay.setText("");
			break;
		default:
			break;
		}
	}
	
	//pritisak tacke
	public void pressDot()
	{
		/*
		 * Sta je fora sa tackom, moze samo jednom kada se kuca broj da se klikne, 
		 * i moze na pocetku, ako se klikne na pocetku, znaci to je 0.
		 */
		
		if (dot)return; // Ako je tacka pritisnuta, samo izadji iz funkcije.
		
		if(state==0 || state==2)// Stanja kada je ekran prazan, a mi pritisnemo tacku
		{
			myDisplay.setText("0."); // Ako nema nista na ekranu stavi 0.
			state++; //posto iz 0 prelazi u 1, a i 2 u 3
			dot=true; //flag za tacku
		return;
		}
		if(state==1 || state== 3)//ako je vec poceo unos broja, treba samo da se doda tacka
		{	myDisplay.append(".");
			dot=true;
		}
	}
	
	//pritisak CE-a
	public void pressCE()
	{
	  //restart it all
		state=0;
		negation=1;
		dot=false;
		myDisplay.setText("");
	}
	
	private float getRez()
	{
		//vidimo koji je operand i uradimo zeljenu operaciju
		switch (operand) {
		case 1:
			return broj1+broj2;
		case 2:
			return broj1-broj2;
		case 3:
			return broj1*broj2;
		case 4:
			return broj1/broj2;
		default:
			return 0;			
		}
	}
}


Sada treba da se vratimo na Glavnu klasu, u odnosu na prosli deo, nije se nista promenila samo su se dodale neke stvati, 95% je samo copy paste, umnozavanje vec postojeceg. Evo ga kod za sve, posto nema nista novo:

Kod:
package vezba.digitron;

import android.app.Activity;
import android.os.Bundle;
import android.provider.Contacts.PresenceColumns;
import android.view.*;
import android.view.View.*;
import android.widget.Button;
import android.widget.EditText;

public class Glavna extends Activity {
	
	private EditText display;
	private Button unos_9,unos_8,unos_7,unos_6,unos_5,unos_4,unos_3,unos_2,unos_1,unos_0;
	private Button unos_tacka, unos_jed, unos_CE, unos_puta, unos_plus, unos_pod, unos_minus;

	private Calculator myCalc;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //incijalizacija elementa
        display=(EditText)findViewById(R.id.display);
        
        //Pravljenje objekta Calculator( poziva se konstruktor)
        myCalc=new Calculator(display);
     
        //Zovemu funkciju koja ce da "mapira" dogadjaje za sve dugmice
        setButtonListeners();
       
}
   
    //Ovde cemo dodavati funkcije digitrona za unos brojeva
    private void clickNumber(int x)
    {
    	
    	myCalc.pressNum();
    	//za sada samo dodamo na display
    	display.append(Integer.toString(x));
    	
    }
    
    //pritisak operatora
    private void clickOp(int n)
    {
    	myCalc.pressOp(n);
    	
    }
    private void setButtonListeners()
    {
    	//Inicijalizacija dugmica
    	unos_9=(Button)findViewById(R.id.unos_9);
    	unos_8=(Button)findViewById(R.id.unos_8);
    	unos_7=(Button)findViewById(R.id.unos_7);
    	unos_6=(Button)findViewById(R.id.unos_6);
    	unos_5=(Button)findViewById(R.id.unos_5);
    	unos_4=(Button)findViewById(R.id.unos_4);
    	unos_3=(Button)findViewById(R.id.unos_3);
    	unos_2=(Button)findViewById(R.id.unos_2);
    	unos_1=(Button)findViewById(R.id.unos_1);
    	unos_0=(Button)findViewById(R.id.unos_0);
    	
    	unos_tacka=(Button)findViewById(R.id.unos_tacka);
    	unos_jed=(Button)findViewById(R.id.unos_jed);
    	unos_CE=(Button)findViewById(R.id.unos_CE);
    	unos_puta=(Button)findViewById(R.id.unos_puta);
    	unos_plus=(Button)findViewById(R.id.unos_plus);
    	unos_pod=(Button)findViewById(R.id.unos_pod);
    	unos_minus=(Button)findViewById(R.id.unos_minus);
    	
    	
    	//Dodavanje "osluskivaca" dogadjaja
    	unos_9.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				clickNumber(9);
       			}  });
    	unos_8.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickNumber(8);
        		}  });
    	unos_7.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				clickNumber(7);
       			}  });
    	unos_6.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickNumber(6);
        		}  });
    	unos_5.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				clickNumber(5);
       			}  });
    	unos_4.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickNumber(4);
        		}  });
    	unos_3.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				clickNumber(3);
       			}  });
    	unos_2.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickNumber(2);
        		}  });
    	unos_1.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				clickNumber(1);
       			}  });
    	unos_0.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickNumber(0);
        		}  });
    	
        //Za operande
    	unos_plus.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickOp(1);
        		}  });
    	unos_minus.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				clickOp(2);
       			}  });
    	unos_puta.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickOp(3);
        		}  });
    	unos_pod.setOnClickListener(new OnClickListener() {
       		public void onClick(View v) 
       			{
       				clickOp(4);
       			}  });
    	unos_jed.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			clickOp(5);
        		}  });
    	
    	//za tacku
    	unos_tacka.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			myCalc.pressDot();
        		}  });
    	//CS
    	unos_CE.setOnClickListener(new OnClickListener() {
        	public void onClick(View v) 
        		{
        			myCalc.pressCE();
        		}  });
    }
    
}

Ovo bi sada trebalo da vam radi, meni radi.
Digitron sam napisao pre 20 minuta, nisam imao prilike da ga detaljno testiram, ako se nadju neki bugovi prijavite slobodno, isto tako ako neko odradi neko unapredjenje, neka okaci. Svestan sam da mozda neki od vas nisu upoznati sa objektnim programiranjem, tako da planiram da napisem jedan teks bas o njemu, sa nekim primerima iz vise programskih jezika i opisom osnovnih koncepata.

U sledecem delu, nadam se sutra, cemo da dodamo par fancy opcija, opcija za menu( na menu dugme telefona) kao i prelazak na drugi activity( ekran ). Posto su te dve stvari veoma trazena i trebace vam u svakoj malo ozbiljnijoj aplikaciji.
 
Sjajno, ja imam ispit u nedelju, pa cu onda malo da se pozabavim ovime! Da li postoji android i za netbeans?
 
Ovo je prva liga. Jasno i precizno. Nadam se da ce biti nekog nastavka, jer je proslo vec par meseci.
Pozdrav i cestitke autoru teme.
 
Mogao bi nesto jos da odradim, kako se prelazi na novi activity, deljenje podataka izmedju Activity-a, background service.. Aj videcu ovih dana kad nadjem vremena da smislim nesto.
 
Svaka cast majstore :)

Vidite covek i studira i ima vremena da se podeli znanjem i to tako da i mnogi koji smo vec zavsili sa fax-om i radimo ( kao imamo iskustvo nekoliko godina ) mozemo da se naucimo dosta korisnih stvari. Samo napred, hajde ljudi da se udruzimo i nastavimo ovu temu, vezbamo zajedno i naucimo jos stvari vezano za Android.

Ja sam upravo zavrsio sa Digitronom radeci po uputstivima. Nisam imao vremena da se bavim ulepsavanjem i daljim razvojem. Uveo sam par svojih izmena, jedna od njih su dva enuma koji doprinose da se kod lakse cita i da bi se izbeglu trivijalne greske pri daljem razvoju. Enumi definisu stanje i operaciju, to izgleda otprilike ovako:

Kod:
public class Calculator {
	
	public enum EState{
		start,
		fistNumber,
		operationPressed,
		secondNumber,
		calculated;
	}
	
	public enum EOperation {
		plus,
		minus,
		multi,
		div,
		eq;
	}

       ....
}

Imam jedno pitanjce: primetio sam da dolnje dugme "=" ne moze da se smesti tako da je presecano na pola. Kada smanjim visinu ostalih dugmica onda se vidi ceo. Kako i da li moze da se poveca cela radna povrsina?

Pozzz
 
Poslednja izmena:
Sto se tice digitrona, to sam samo uzeo kao primer da pokazem neke osnove, moze to da se resi na bezbroj nacina. Ne moze da se poveca radna velicina, jel si ogranicem fizickim ekranom, mozes da povecas u emulatoru, stavis vecu rezoluciju.
 
Zasto mi snapshot ne radi, svaki put kad opet startujem avd on opet ucitava od pocetka, a lepo sam podesio load/save from snapshot.... Na google-u nista o ovom problemu kao da sam jedini, instalirao sam adt 11 i r12 u eclipsu je sve lepo podeseno i sve radi, samo me nervira sto moram da cekam po par minuta svaki put za testiranje aplikacije.
Molim vas za pomoc, izludjuje me, pao je i reinstall sistema sa win7 x64 presao sam na x86 i nista....
 
Izlazila mi je greska u Eclipsu i AVD manageru kad startujem avd:
Unknown savevm section type 95
Resio sam problem tako sto ne zatvaram uopste emulator, vec startujem aplikaciju u eclipse-u i ona se odmah ucita.
Jednostavno resenje, a ja ne razmisljam....
 
Ne znam za snapshot, ja i ne zatvaram emulator kada ga koristim. Mada najvise testiram na telefonu, mnogo je bolje, brze i lepse izgleda :)
 
Drugari zelim da uplovim u ove vode, ali koliko sada vidim slike su izgubile target pa se ne vide. Da li moze ovaj tutorijal da se odradi bez slika ili su vazne?
 
Ma sta ce ti slike, samo prati sta je napisano i ne mozes pogrijesiti. A ako naidjes na problem slobodno pitaj neko ce ti vec odgovoriti :)
 
Nazad
Vrh Dno