Sunteți pe pagina 1din 132

Android

Android este creat de Google, pentru dispozitivele mobile


(smartphone, tablete, reader). Cuprinde un sistem de operare,
un middleware, aplicaii de baz (client de e-mail, program de
SMS, calendar, hri, browser, agend pentru date de contact).
http://developer.android.com/index.html
Aplicaiile pentru Android sunt scrise folosind limbajul de
programare Java.
Pentru a rula aplicaii scrise pentru Android este nevoie de o
VM main virtual Dalvik. VM ruleaz clasele compilate n
Java i apoi transformate folosind aplicaia dx n fiiere
executabile Dalvik (.dex).

Arhitectura SO Android

Necesiti software
JDK pentru compilarea claselor Java
http://www.oracle.com/technetwork/java/javase/downloads/in
dex.html
Android SDK pentru compilarea n pachete Android
http://developer.android.com/sdk/index.html
Varianta 1: se descarc ADT Bundle care cuprinde:
o Eclipse + ADT plugin
o Android SDK Tools
o Android Platform-tools
o The latest Android platform
o The latest Android system image for the emulator

Varianta 2:
Eclipse mediu de dezvoltare IDE
o Eclipse for Mobile Developers
o Eclipse IDE for Java Developers
o Eclipse Classic
o Eclipse IDE for Java EE Developers
http://www.eclipse.org/downloads/
ADT Plugin for Eclipse
http://developer.android.com/sdk/eclipse-adt.html
API documentaia claselor Android
http://developer.android.com/reference/classes.html

Android SDK (Software Development Kit)


compileaz codul unei aplicaii ntr-un pachet Android, care
este o arhiv cu extensia .apk, care apoi poate fi instalat pe
orice dispozitiv care ruleaz Android.
Include un emulator de dispozitiv mobil virtual AVD
(Android Virtual Device) care ruleaz pe computer.
Emulatorul permite dezvoltarea i testarea aplicaiilor
Android fr a fi nevoie de dispozitivul fizic. Interaciunea
cu emulatorul se realizeaz prin mouse n loc de
touchscreen-ul dispozitivului i taste n loc de butoane.
Android SDK are un manager prin care se pot instala
documentaii i alte pachete.

Din Android SDK Manager se instaleaz o versiune de


Android.

AVD Manager se creeaz un dispozitiv, care apoi se


pornete cu Start.

Eclipse (varianta 2)
Se instaleaz ADT Plugin meniul Help Install New
Software...

Detalii de instalare i configurare:


http://developer.android.com/sdk/eclipse-adt.html
Configurarea se face n Eclipse de la Window >
Preferences..., dac nu a fost fcut automat la pornirea
Eclipse. Trebuie setat directorul unde se afl instalat Android
SDK.
9

10

Crearea unui proiect Android


n Eclipse File New Project Android Project Select
Build Target Android
Project Name - este numele proiectului
Build Target este versiunea de Android SDK n care va fi
compilat proiectul
Application Name numele aplicaiei care va apare pe
dispozitivul mobil
Package Name numele pachetului n care va fi salvat
proiectul. Are aceeai structur ca la Java. Folderul src
conine fiierele surs java. Numele pachetului declarat
iniial trebuie s fie format din cel puin 2 module separate
prin punct.
Create Activity se creeaz automat clasa de baz, subclas
a clasei Activity, care va rula aplicaia. n aceast clas este
11

rescris metoda onCreate(...) unde trebuie fcute toate


iniializrile, inclusiv interfaa grafic.

12

Exemplu
Afieaz un text pe ecranul dispozitivului mobil.
Codul java se afl n fiierul din:
/src/example.helloapp/HelloApplicationActivity.java:
package example.helloapp;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloApplicationActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textLabel = new TextView(this);
13

textLabel.setText("Prima aplicatie\n text afisat intr-o


eticheta");
setContentView(textLabel);
}
}
Textul subliniat este adugat pentru a afia ntr-o etichet un
ir de caractere.
Pachetele necesare pentru a fi importate pot fi introduse
automat de Eclipse prin Ctrl+Shift+O.
Pentru a rula, AVD trebuie s nu fie blocat.

14

Layout-ul se afl n fiierul /res/layout/main.xml. Acest fiier


poate fi vizualizat n Eclipse sub form de layout sau cod xml
(se alege din partea de jos a vizualizrii).
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
</LinearLayout>

15

Android GUI
Pentru crearea unei aplicaii Android cu GUI se folosesc una
din clasele:
View componente conine subclase pentru
implementarea componentelor grafice (widgets) (de
exemplu, butoane, etichete, cmpuri text). O clas
descendent din View descrie o structur de date care
memoreaz proprieti de desenare-vizualizare, layout,
evenimente (tastatur, scroll, touchpad).
ViewGroup containere conine subclase pentru
managementul poziiei componentelor grafice (layout), care
implementeaz arhitecturi diferite cu aspect liniar, relativ
sau tabelar. O astfel de clas hotrte dimensiunea i
aranjarea componentelor grafice descendente din ea.

16

Caracteristicile aplicaiilor GUI pentru Android:


Fiecare aplicaie ruleaz ntr-un proces separat, care este o
instan a Dalvik VM.
Trebuie s aib definit o ierarhie de activiti, n fiierul
AndroidManifest.xml, care se gsete n directorul
proiectului.
Se folosete metoda setContentView() cu referin la nodul
rdcin pentru a aduga o activitate unui layout.
17

Pentru fiecare nou activitate, se apeleaz metoda


setContentView(), pentru ca aceasta s devin activ.
Este important s se urmreasc toate ferestrele instaniate,
deoarece acestea trebuie nchise cu metoda finish().
Toate obiectele de tip View au asociat un ID cu ajutorul
cruia se face referire la componenta grafic respectiv.
Toate ID-urile sunt salvate n fiierul gen/pachet/R.java,
care nu poate fi modificat manual.
Centrul de coordonate este stnga sus.
Unitatea de msur pentru componente este pixel-ul.
Componentele grafice au asociate evenimente, care pot fi
ascultate cu asculttori.
Clasa View are o serie de metode pentru tratarea
evenimentelor:
o onKeyDown(int, KeyEvent) - apsare de tast
18

o onKeyUp(int, KeyEvent) - ridicare de tast


o onTrackballEvent(MotionEvent) - micare TrackBall
o onTouchEvent(MotionEvent) micare
pe
TouchScreen
Aplicaiile GUI pot fi create n dou moduri:
o Cod surs ntr-un fiier Java
o Cod xml n fiiere situate n directorul res al
proiectului. n fiierele xml pot fi setate proprietile
componentelor grafice.
Este ncurajat crearea layout-ului prin cod xml.

19

Layout - introducere
Se definete ntr-un fiier XML.
Elementele din Xml sunt asemntoare cu funcionalitile
claselor Java.
Pentru crearea acestui fiier se poate folosi un vocabular
Xml (de exemplu, cel din Eclipse), dar pot fi folosite i alte
aplicaii IDE pentru crearea layout-ului (exemplu,
DroidDraw).
Layout-ul poate fi creat prin drag-and-drop de componente
grafice n modul layout i modificarea proprietilor n cod
xml. Orice modificare fcut ntr-un mod de vizualizare
(layout sau cod xml) va fi operat n fiier.

20

Exist o serie de aplicaii care permit crearea de wireframe


(schema interfeei grafice: elemente de interfa, navigarea,
cu accent pe funcionalitate i comportament i nu pe stil,
culori, grafic).
App Inventor
http://www.appinventorbeta.com/about/

21

Exemplu
anterior, modificat astfel nct componentele grafice s nu
mai fie create prin cod java, n schimb setate n fiiere xml.
Codul se modific astfel n fiierul
/src/examplu.eticheta/TextViewXmlActivity.java
import android.app.Activity;
import android.os.Bundle;
public class HelloApplicationActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
22

Fiierul res/layout/main.xml va conine urmtorul cod:


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

</LinearLayout>
Fiierul res/values/string.xml va conine codul:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="deAfisat">Prima aplicatie\n\n text afisat intro eticheta \n pe trei randuri</string>
<string name="app_name">HelloApplication</string>
</resources>

24

Fiierul /R.java
Conine o list cu toate resursele folosite n proiect (layout,
id-uri, string-uri).
Aceast clas este generat automat de Eclipse, folosind
aplicaia Ant, atunci cnd se alege comanda build.
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int ic_launcher=0x7f020000;
}
public static final class layout {
public static final int main=0x7f030000;
}
public static final class string {
25

public static final int app_name=0x7f040001;


public static final int hello=0x7f040000;
}
}

26

XML - eXtensible Markup Language


este un limbaj care structureaz, memoreaz, transport date
i nu are ca scop afiarea acestora (cum face Html).
Un fiier xml conine tag-uri (elemente, noduri).
Element: <nume_tag></nume_tag>
Numele unui element trebuie s nceap cu o liter i nu
conine spaii. Dac este format din mai multe cuvinte este
indicat s se foloseasc _
Un element poate conine:
o date sub form de text,
o alte elemente,
o atribute.
Fiecare fiier xml trebuie s aib un nod rdcin, care va fi
printele tuturor celorlalte noduri.

27

Se formeaz un arbore de noduri, care pornete de la nodul


rdcin.
Reguli de creare a unui fiier xml:
o Fiecare nod trebuie s aib un tag de nchidere
(</numeTag>)
o Tag-urile sunt CaseSensitive
o Elementele xml trebuie corect imbricate
o Un element poate s aib atribute (de exemplu, <string
name="hello">, n care name este atributul
elementului string). Un atribut poate fi transformat n
element (de preferat), deoarece un element nu poate
conine valori multivaloare, nu poate implementa o
structur arborescent, nu sunt uor de extins.
o Valorile atributelor trebuie puse n .

28

o Caractere speciale n xml:


&lt ;
<
&gt;
>
&amp; &
&apos; '
&quot; "
o Comentarii: <!-- comentariu -->
o Mai multe caractere spaiu sunt tratate ca i cum ar fi
unul singur
o Linie nou: LF
Tag-urile nu sunt predefinite n limbajul xml. Din acest
motiv n Android s-a definit un vocabular xml pentru a
emula lucrul cu clasele i obiectele.
Xml este descriptiv i nu se poate obine cod executabil
direct din xml.
29

<?xml version="1.0" encoding="utf-8"?> - prima linie


dintr-un fiier xml este o declaraie a versiunii de xml
folosite i tipului de codare (UTF-8 este o codificare de
caractere pe 8bii pentru Unicode codificarea folosit n
Java).
http://developer.android.com/guide/topics/ui/index.html
http://developer.android.com/guide/topics/fundamentals.ht
ml

30

Layout - Xml
Atribute folosite n fiierul layout res/layout/main.xml:
xmlns:android

Declararea spaiului de nume pentru


atributele Android. Toate elementele
rdcin dintr-un layout trebuie s aib
definit acest atribut
android:id
Identificator
unic
pentru
fiecare
component grafic. Acest ID poate fi
folosit pentru a referi componenta grafic
din codul surs sau din alte fiiere xml.
android:layout_ Limea layout-ului. Cnd valoarea este
width
"fill_parent" arat c acea component
poate lua limea ntregului ecran.

31

android:layout_ nlimea layout-ului.


height
android:text
Seteaz textul de afiat n TextView. n
loc de valoare se poate folosi o referire la
o resurs de tip string definit n
fiierul res/values/strings.xml. Folosirea
resurselor
string
ajut
la
internaionalizare.

32

Layout manager de poziionare


FrameLayout poate aeza doar un obiect grafic n colul
din stnga sus i nu se poate alege o alt locaie. Dac se
includ mai multe obiecte grafice acestea se vor suprapune
obturndu-se, doar dac nu sunt create s fie transparente.
Opiunea se gsete n toolbar-ul Layouts.

33

n fiierul res/layout/main.xml:
<
FrameLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="60.0px"
android:text="@string/label1"
android:textColor="@color/blue"
android:background="@color/cyan"/>
<TextView
android:id="@+id/textview2"
34

android:layout_width="wrap_content"
android:layout_height="40px"
android:text="@string/label2"
android:textColor="@color/green"
android:background="@color/yellow"/>
<TextView
android:id="@+id/textview3"
android:layout_width="wrap_content"
android:layout_height="30px"
android:text="@string/label3"
android:textColor="@color/red"
android:background="@color/orange"/>
</FrameLayout>

35

Mai sus am definit trei etichete TextView, cu nlimi i


culori diferite de fundal i de scris.

Culorile sunt definite n fiierul res/values/colors.xml:


<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="black">#ff000000</color>
<color name="blue">#ff0000ff</color>
<color name="cyan">#ff00ffff</color>
<color name="dark_gray">#ff444444</color>
<color name="gray">#ff888888</color>
<color name="green">#ff00ff00</color>
<color name="light_gray">#d3d3d3</color>
<color name="magenta">#ffff00ff</color>
<color name="transparent">#00000000</color>
36

<color name="white">#ffffff</color>
<color name="yellow">#ffff00</color>
<color name="orange">#ffa500</color>
<color name="pink">#ffc0cb</color>
<color name="brown">#a52a2a</color>
<color name="red">#ff0000</color>
</resources>
Dac nu erau definite culorile ca resurse n fiierul
res/values/colors.xml, n fiierul main.xml se putea scrie:
android:background="#ffa500"

37

Pentru
a
putea
funciona
n
fiierul
gen/example.helloapp/R.java se definete automat clasa
pentru culori astfel:
public static final class colors {
//
public static final int blue=0x7f080000;
}
Este suficient s se defineasc variabila final pentru o
culoare pentru a le identifica pe toate sau chiar nici o variabil
final.

38

LinearLayout aliniaz toate componentele pe o singur


direcie vertical sau horizontal respectnd marginile
dintre obiecte, alinierea acestora (gravity: left, center, right,
top, bottom, center_vertical, fill_vertical, center_horizontal,
fill_horizontal, fill) i importana (weight permite s
ocupe spaiul liber rmas la printe, proporional cu
importana sa; implicit este 0). Introduce scroll dac este
nevoie. Opiunea se gsete n toolbar-ul Layouts.

n fiierul res/layout/main.xml:
39

<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/textView1"
android:layout_width="100px"
android:layout_height="60.0px"
android:text="@string/label1"
android:textColor="@color/blue"
android:background="@color/cyan"
android:gravity="right"
android:padding="5px" />
40

<TextView
android:id="@+id/textview2"
android:layout_width="wrap_content"
android:layout_height="40px"
android:text="@string/label2"
android:textColor="@color/green"
android:background="@color/yellow"/>
<TextView
android:id="@+id/textview3"
android:layout_width="wrap_content"
android:layout_height="30px"
android:text="@string/label3"
android:textColor="@color/red"
android:background="@color/orange"/>
</LinearLayout>
41

TableLayout poziioneaz componentele ntr-un tabel (cu


un numr arbitrar de rnduri i coloane) pe rnduri i
coloane, fr liniere (nu se vd borduri la celule). n fiecare
celul a tabelului se poate introduce o component grafic.
Componentele grafice sunt introduse pe rnduri de la stnga
la dreapta. Rndurile se redimensioneaz automat pentru a
cuprinde cea mai lat coloan. Opiunea se gsete n
toolbar-ul Layouts.

42

n fiierul res/layout/main.xml:
<TableLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1">
<TableRow>
<TextView
android:id="@+id/textView1"
android:layout_width="100px"
android:layout_height="60.0px"
android:text="@string/label1"
android:textColor="@color/blue"
android:background="@color/cyan"
android:gravity="right"
android:padding="5px" />
43

</TableRow>
<TableRow>
<TextView
android:id="@+id/textview2"
android:layout_width="wrap_content"
android:layout_height="40px"
android:text="@string/label2"
android:textColor="@color/green"
android:background="@color/yellow"/>
<TextView
android:id="@+id/textview3"
android:layout_width="wrap_content"
android:layout_height="30px"
android:text="@string/label3"
44

android:textColor="@color/red"
android:background="@color/orange"
android:layout_marginLeft="10px"
android:layout_marginTop="10px"
android:layout_marginRight="15px"/>
</TableRow>
</TableLayout>
Dac nu se dorete completarea primei coloane, aceasta se
poate umple cu o etichet fictiv astfel:
<TextView
android:id="@+id/textview5"
android:layout_width="wrap_content"
android:layout_height="40px"/>

45

ListView afieaz o list ntr-o coloan cu scroll.


Elementele listei sunt introduse automat de ListAdapter.

46

ntr-un proiect nou:


Fiierul res/layout/view_items.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp" >
</TextView>

47

Fiierul src/example.listView/ListViewAndroidActivity.java:
package example.listView;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class ListViewAndroidActivity extends ListActivity {
/** Called when the activity is first created. */
@Override
48

public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setListAdapter(new
R.layout.view_items, lista));

ArrayAdapter<String>(this,

ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View
view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(), ((TextView)
view).getText(),
49

Toast.LENGTH_SHORT).show();
}
});
}
static final String[] lista = new String[] {
"element-1",
"element-2","element-3",
"element-5", "element-6",
"element-7", "element-8","element-9",
"element-11", "element-12"
};
}

"element-4",
"element-10",

50

Clasa ListViewAndroidActivity extinde clasa ListActivity


pentru a aduga asculttorul pe list. Metoda
setTextFilterEnabled permite tastarea unui element pentru
filtrare, aa cum se vede n figura a doua de mai sus. Metoda
makeText afieaz vectorul de elemente lista n eticheta
TextView definit n fiierul res/layout/view_items.xml.

51

RelativeLayout se specific poziia relativ a unui obiect


fa de celelalte obiecte (left) sau fa de printe (top).
o android:layout_above
o android:layout_alignBaseline
o android:layout_alignBottom
o android:layout_alignLeft
o android:layout_alignRight
o android:layout_alignTop
o android:layout_below
o android:layout_centerHorizontal
If true, centers
this child horizontally within its parent.
o android:layout_centerInParent
If true, centers this
child horizontally and vertically within its parent.
o android:layout_centerVertical
If true, centers this
child vertically within its parent.
52

o android:layout_toLeftOf
o android:layout_toRightOf
Oiunea se gsete n toolbar-ul Layouts.

n fiierul res/layout/main.xml:
<RelativeLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
53

android:layout_height="wrap_content"
android:padding="10px" >
<TextView
android:id="@+id/textview1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/label1"
android:textColor="@color/blue"
android:background="@color/cyan"
android:gravity="right"
android:padding="5px" />
<TextView
android:id="@+id/textview2"
android:layout_width="wrap_content"
54

android:layout_height="40px"
android:text="@string/label2"
android:textColor="@color/green"
android:background="@color/yellow"
android:layout_below="@id/textview1"
android:layout_alignParentRight="true"
android:layout_marginLeft="10px"
android:layout_marginTop="10px"
android:layout_marginRight="15px"/>
<TextView
android:id="@+id/textview3"
android:layout_width="wrap_content"
android:layout_height="30px"
android:text="@string/label3"
android:textColor="@color/red"
55

android:background="@color/orange"
android:layout_toLeftOf="@id/textview2"
android:layout_alignTop="@id/textview1"/>
</RelativeLayout>

56

Gallery - aliniaz orizontal imagini dintr-o list, folosind


scroll. Poziioneaz componenta selectat n centrul listei.

57

Opiunea se gsete n toolbar-ul Images&Media.


ntr-un proiect nou se creeaz fiierul res/layout/main.xml:
<?xml version="1.0" encoding="utf-8"?>
<Gallery xmlns:android=
"http://schemas.android.com/apk/res/android"
android:id="@+id/gallery"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />

58

Fiierul
src/example.GalleryLayout/GalleryLayoutActivity.java:
package example.galleryLayout;
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.Toast;
59

public class GalleryLayoutActivity extends Activity {


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//creeaza o galerie de imagini prin preluarea din layout
Gallery gallery = (Gallery) findViewById(R.id.gallery);
//seteaza un ascultator pentru gallery
gallery.setAdapter(new ImageAdapter(this));
//ImageAdapter este o clasa definita mai jos
//instanteaza un ascultator de click pe item
60

gallery.setOnItemClickListener(new
OnItemClickListener() {
public void onItemClick(AdapterView parent, View v,
int position, long id) {
Toast.makeText(GalleryLayoutActivity.this,
"Pozitia in lista:" + position,
Toast.LENGTH_LONG).show();
}
});
}
public class ImageAdapter extends BaseAdapter {
int mGalleryItemBackground;
private Context mContext;
private Integer[] mImageIds = {
61

R.drawable.face_angry,
R.drawable.face_crying,
R.drawable.face_happy,
R.drawable.face_puke,
R.drawable.face_straight,
R.drawable.face_thinker,
R.drawable.face_upset
};
public ImageAdapter(Context c) {
mContext = c;
TypedArray attr =
mContext.obtainStyledAttributes(R.styleable.GalleryLayoutAc
tivity);
mGalleryItemBackground = attr.getResourceId(
62

R.styleable.GalleryLayoutActivity_android_galleryItemBackg
round, 0);
attr.recycle();
}
public int getCount() {
return mImageIds.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
63

}
public View getView(int position, View convertView,
ViewGroup parent) {
ImageView imageView = new ImageView(mContext);
imageView.setImageResource(mImageIds[position]);
imageView.setLayoutParams(new
Gallery.LayoutParams(130, 130));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setBackgroundResource(mGalleryItemBackgroun
d);
return imageView;
64

}
}
}
Fiierul res/values/attrs.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="GalleryLayoutActivity">
<attr name="android:galleryItemBackground" />
</declare-styleable>
</resources>
n directorul res/drawable-mdpi se trec imaginile care
urmeaz a fi afiate. Numele imaginilor trebuie s fie formate
doar din litere mici, numere i _

65

Exist n fiecare proiect Eclipse (din Android 1.6) mai multe


directoare drawable, fiecare corespunztor pentru diferite
rezoluii (dpi - dots per inch). Acestea sunt necesare pentru a
crea aplicaii pentru ecrane de dimensiuni i rezoluii diferite.
Rezoluia n dpi este o msur a claritii unei imagini i
exprim cte puncte pot s ncap ntr-un inch (1 inch =
2.54cm). Dimensiunea punctului depinde de fiecare
echipament n parte.

66

n fiierele xml fiierele icon se trec fr extensie, astfel:


<item
android:icon="@drawable/ic_action_edit"
>
Directoarele drawable corespunztoare diferitelor rezoluii
nu sunt specificate n fiierele xml. De exemplu, mai sus nu
se trece:
<item
android:icon="@drawablehdpi/ic_action_edit" >

67

GridLayout este un container care se adaug la alt


manager (de exemplu, LinearLayout) i permite aranjarea
pe mai multe rnduri i coloane de dimensiune variabil, pe
poziii diferite n fiecare celul.

68

ntr-un nou proiect se creeaz prin drag-and-drop un


GridLayout din Toolbar-ul de Layout, 4 etichete TextView
din
Toolbar-ul
FormWidgets,
se
aduce
fiierul
res/values/colors.xml, se seteaz n Properties (n partea de
jos a ferestrei Eclipse, lng Console, Problems, etc.) culorile
de Backgroud i TextColor. Apoi, se aaz cu mouse-ul
componentele grafice n poziiile dorite n GridLayout. Codul
rezultat este urmtorul:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android
"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
69

<GridLayout
android:id="@+id/gridLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.20"
android:alignmentMode="alignMargins"
android:background="@color/gray"
android:columnCount="5">
<TextView
android:id="@+id/textView1"
android:layout_width="110dp"
android:layout_column="0"
android:layout_gravity="left"
android:layout_row="0"
android:background="@color/blue"
70

android:text="@string/label1" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:layout_row="1"
android:background="@color/dark_gray"
android:text="@string/label4" />
<TextView
android:id="@+id/textView2"
android:layout_width="106dp"
android:layout_height="44dp"
android:layout_column="0"
71

android:layout_columnSpan="2"
android:layout_gravity="right"
android:layout_row="3"
android:background="@color/green"
android:text="@string/label2"
android:textColor="@color/black"/>
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_column="1"
android:layout_columnSpan="2"
android:layout_row="4"
android:background="@color/light_gray"
android:text="@string/label3"
android:textColor="@color/brown"/>
72

<Space
android:layout_width="120dp"
android:layout_height="1dp"
android:layout_column="0"
android:layout_row="0" />
<Space
android:layout_width="28dp"
android:layout_height="1dp"
android:layout_column="1"
android:layout_row="0" />
<Space
android:layout_width="10dp"
android:layout_height="1dp"
73

android:layout_column="3"
android:layout_gravity="fill_horizontal"
android:layout_row="0" />
<Space
android:layout_width="1dp"
android:layout_height="35dp"
android:layout_column="0"
android:layout_row="0" />
<Space
android:layout_width="1dp"
android:layout_height="10dp"
android:layout_column="0"
android:layout_row="2" />
74

<Space
android:layout_width="1dp"
android:layout_height="71dp"
android:layout_column="0"
android:layout_row="3" />
<Space
android:layout_width="1dp"
android:layout_height="350dp"
android:layout_column="0"
android:layout_row="4" />
</GridLayout>
</LinearLayout>
75

GridView aranjeaz o gril cu scroll, cu un anumit numr


de rnduri i coloane definite. Se gsete n toolbar-ul
Composite.

76

ScrollView - coloan de componente grafice cu scroll


vertical. Se gsete n toolbar-ul Composite.

77

Spinner - afieaz o singur component dintr-o list ntr-un


cmp de text cu un rnd.

78

TabHost - aranjeaz mai multe ecrane n mai multe tab-uri


Google Map View
Web View

http://developer.android.com/resources/tutorials/views/index.
html
79

Componente grafice de control


Buton cu o stare stabil Button toolbar Form Widgets
Buton cu dou stri stabile ToggleButton toolbar Form
Widgets

Caset de validare CheckBox toolbar Form Widgets


Buton radio RadioButton toolbar Form Widgets
Zon de text toolbar TextFields. Sunt de mai multe tipuri:
zon de text editabil pe unul (PlainText) sau mai multe
80

rnduri (Multiline Text), parola (Password), adres (Postal


Address), dat (Date), timp (Time), nume (Person Name),
email (E-mail), telefon (Phone), numeric (Number),
autocompletare (Autocomplete).

Bar de cutare SeekBar toolbar Form Widgets


81

List ascuns Spinner toolbar Form Widgets

Picker selectare dat, timp toolbar Time&Date

82

Componente grafice pentru ieiri


Eticheta TextView toolbar Form Widgets

Toast (popup) - afieaz un mesaj ntr-un popup disponibil


pentru o perioad scurt de timp deasupra ferestrei
principale care rmne vizibil i interactiv.

83

Evenimente
Sunt generate de subclasele clasei View.
Metodele care trateaz evenimente (asculttoare de
evenimente) trebuie suprascrise n aplicaie.
Cele mai comune metode sunt:
o onClick() este atins componenta grafic sau se d
click pe aceasta.
o onLongClick() se apas mai mult pe componenta
grafic
o onFocusChange() se intr/ies deasupra componente
grafice
o onKey() se apas o tast a dispozitivului
o onTouch() se apas, se elibereaz, se mic cursorul
o onCreateContextMenu() se creeaz meniul
contextual
84

Exemplu ComponenteGrafice

85

res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android
"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TableLayout
android:id="@+id/tableLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TableRow
android:id="@+id/tableRow1"
86

android:layout_width="match_parent"
android:layout_height="wrap_content" >
<!-- zona de text de editat-->
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Introduceti un text" >
</EditText>
</TableRow>
<TableRow
android:id="@+id/tableRow2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
87

<!-- buton-actiune- ia din zona de text de sus si


afiseaza in eticheta de mai jos -->
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ok" />
</TableRow>
<TableRow
android:id="@+id/tableRow3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<!-- eticheta-->
<TextView
88

android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="nimic introdus" />
</TableRow>
<!-- linie de delimitare intre randurile tabelei-->
<View
android:layout_width="fill_parent"
android:layout_height="3dip"
android:background="@color/white"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip" />
<TableRow
89

android:id="@+id/tableRow4"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<!-- casuta de validare - valoarea va fi afisata in
eticheta alaturata -->
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CheckBox" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="nimic checkBox"
90

android:textAppearance="?android:attr/textAppearanceSmal
l" />
</TableRow>
<!-- linie de delimitare intre randurile tabelei-->
<View
android:layout_width="fill_parent"
android:layout_height="3dip"
android:background="@color/white"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip" />
<TableRow
android:id="@+id/tableRow5"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
91

<RadioGroup
android:id="@+id/RadioGroupTips"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="0"
android:layout_span="3"
android:checkedButton="@+id/radioButton1">
<RadioButton
android:id="@+id/radioButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton" />
92

<RadioButton
android:id="@+id/radioButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Grup butoane radio" />
</RadioGroup>
</TableRow>
<!-- linie de delimitare intre randurile tabelei-->
93

<View
android:layout_width="fill_parent"
android:layout_height="3dip"
android:background="@color/white"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip" />
<TableRow
android:id="@+id/tableRow6"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Spinner
android:id="@+id/spinner1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
94

android:prompt="@string/spinner_prompt" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Spinner:"
android:textAppearance="?android:attr/textAppearanceLarg
e" />
</TableRow>
<!-- linie de delimitare intre randurile tabelei-->
<View
android:layout_width="fill_parent"
android:layout_height="3dip"
95

android:background="@color/white"
android:layout_marginTop="5dip"
android:layout_marginBottom="5dip" />
<TableRow
android:id="@+id/tableRow7"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<!-- nu permite introducerea decat a unor numere
-->
<EditText
android:id="@+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="numberDecimal" />
96

<ToggleButton
android:id="@+id/toggleButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</TableRow>
<TableRow
android:id="@+id/tableRow10"
android:layout_width="match_parent"
97

android:layout_height="wrap_content" >
<AnalogClock
android:id="@+id/analogClock1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow>
</TableLayout>
</LinearLayout>

98

res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World,
ComponenteGraficeActivity!</string>
<string name="app_name">ComponenteGrafice</string>
<string name="spinner_prompt">Alege un
element</string>
<string-array name="elements_array">
<item>Element-1</item>
<item>Element-2</item>
<item>Element-3</item>
<item>Element-4</item>
<item>Element-5</item>
</string-array>
</resources>
99

src/example.curs/ComponenteGraficeActivity.java
package example.curs;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Spinner;
import android.widget.TextView;
100

import android.widget.ToggleButton;
public class ComponenteGraficeActivity extends Activity {
private Button button;
private EditText editText1, editText2;
private TextView textView1, textView2, textView3,
textView4, textView5;
private CheckBox checkBox;
private RadioButton radioButton1, radioButton2;
private Spinner spinner1;
private ToggleButton toggleButton1;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
101

//o zona de text, al carei continut e afisat la apasarea


//unui buton intr-o eticheta
button = (Button)this.findViewById(R.id.button1);
editText1 = (EditText)this.findViewById(R.id.editText1);
textView1 =
(TextView)this.findViewById(R.id.textView1);
this.button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
textView1.setText(editText1.getText());
}
});
//o casuta de validare
checkBox =
(CheckBox)this.findViewById(R.id.checkBox1);
checkBox.setOnClickListener(checkBoxListener);
102

textView2 =
(TextView)this.findViewById(R.id.textView2);
//un grup cu 2 butoane radio
radioButton1 =
(RadioButton)this.findViewById(R.id.radioButton1);
radioButton2 =
(RadioButton)this.findViewById(R.id.radioButton2);
radioButton1.setOnClickListener(radioButton1Listener);
radioButton2.setOnClickListener(radioButton2Listener);
textView3 =
(TextView)this.findViewById(R.id.textView3);
//spinner- la selectie se afiseaza valoarea in eticheta
spinner1 = (Spinner)this.findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapterSpinner =
103

ArrayAdapter.createFromResource(
this,
R.array.elements_array,
android.R.layout.simple_spinner_item);
adapterSpinner.setDropDownViewResource(android.R.layout
.simple_spinner_dropdown_item);
spinner1.setAdapter(adapterSpinner);
spinner1.setOnItemSelectedListener(new
MyOnItemSelectedListener());
textView4 =
(TextView)this.findViewById(R.id.textView4);
//zona de text ptr scriere numar afisat la selectia
//butonului cu 2 stari in eticheta alaturata
editText2 = (EditText)this.findViewById(R.id.editText2);
toggleButton1 =
104

(ToggleButton)this.findViewById(R.id.toggleButton1);
textView5 =
(TextView)this.findViewById(R.id.textView5);
toggleButton1.setOnClickListener(toggleButton1Listener);
}
//la click pe casuta de validare se afiseaza intr-o eticheta
selectia
OnClickListener checkBoxListener =
new OnClickListener() {
public void onClick(View v) {
if(checkBox.isChecked())
textView2.setText("bifat");
else
textView2.setText("ne-bifat");
}
105

};
OnClickListener radioButton1Listener =
new OnClickListener() {
public void onClick(View v) {
if(radioButton1.isChecked())
textView3.setText("selectat radioButton1");
}
};
OnClickListener radioButton2Listener =
new OnClickListener() {
public void onClick(View v) {
if(radioButton2.isChecked())
textView3.setText("selectat radioButton2");
}
};
106

public class MyOnItemSelectedListener


OnItemSelectedListener {

implements

public
void
onItemSelected(AdapterView<?>
parent,View view, int position, long id) {
textView4.setText(spinner1.getItemAtPosition(position).toStri
ng());
}
public void onNothingSelected(AdapterView parent) {
// Do nothing.
}
}

107

OnClickListener toggleButton1Listener =
new OnClickListener() {
public void onClick(View v) {
textView5.setText(editText2.getText());
}
};
}

108

ActionBar
afieaz titlul pentru Activity (aplicaia care ruleaza) i
icon-ul aplicaiei n stnga sus,
ActionBar este cuprins n tema folosit pentru Activity
Permite adugarea de butoane importante pentru aplicaie
(localizarea utilizatorului n aplicaie, moduri de navigare,
cutare), un fel de meniu contextual,
Este mprit n:

1. Icon aplicaie
2. View control permite navigarea ntre diferite moduri
de vizualizare (exemplu, meniu drop-down, tab-uri). Dac
109

aplicaia nu are mai multe moduri de vizualizare, atunci


este afiat numele aplicaiei
3. Action buttons cele mai importante butoane cu
aciuni din cadrul aplicaiei. Pot fi mai multe butoane, dar
nu toate sunt vizualizate la un moment dat. Cele
nevizualizate sunt trecute n Action overflow. Poate fi
creata i o bar cu butoane n partea de jos a ecranului.
4. Action overflow aciunile mai rar folosite sunt
trecute aici. Programatorul poate include aici butoane
particulare, care pot apare i la apsarea butonului Menu
al dispozitivului (dac are).

110

ActionBar depinde de versiunea de Android:


o pentru versiuni Android 3.1 sau mai mari ActionBar
este cuprins n tema Holo (sau n una descedent din
aceasta) implicit pentru atributele targetSdkVersion
sau minSdkVersion cu valoarea minim 11 n fiierul
AndroidManifest.xml (din rdcin)
<manifest ... >
<uses-sdk android:minSdkVersion="11" ... />
...
</manifest>
o pentru versiuni Android 2.1 sau mai mic cere
includerea bibliotecii Android Support Library n
aplicaie:
 n fiierul src/com.example.actionbarexample
/ActionBarExample.java:
111

public class MainActivity extends ActionBarActivity { ... }


 n fiierul AndroidManifest.xml :
<activity android:theme="@style/Theme.AppCompat.Light"
... >
ActionBar poate fi personalizat prin res/values/styles.xml,
themes.xml.

112

Adugarea de butoane la ActionBar


se realizeaz n fiiere xml din directorul res/menu/. Se
adaug elemente Item astfel:
<item
android:id="@+id/action_edit"
android:titleCondensed="OK"
android:title="@string/action_edit"
android:menuCategory="secondary"
android:icon="@drawable/ic_ok"
android:orderInCategory="1"
android:showAsAction="always" />
MenuCategory determin prioritatea item-ului. Valoarea
secondary, exprim opiuni secundare introduse de

programator.
Icon determin imaginea asociat item-ului. Imaginea
trebuie s existe n res/drawable.
113

orderInCategory determin ordinea de afiare n


cadrul grupului.
showAsAction determin cnd i cum trebuie s apar.
Valoarea never, nu va fi afiat niciodat. Valoarea
always, va fi afiat ntotdeauna. Valoarea ifRoom, va fi
afiat doar dac este spaiu, altfel este trecut la Action
overflow.
http://developer.android.com/design/downloads/index.htm
l#action-bar-icon-pack se poate face download pentru
icon-uri butoanelor din ActionBar
Pentru a aduga butoane la ActionBar n fiierul principal
java se creeaza metoda:
public boolean onCreateOptionsMenu(Menu menu) {

114

getMenuInflater().inflate(R.menu.action_bar_ex
ample, menu);
return true;
}

Tot n fiierul principal java se creeaz i metoda:


public boolean onOptionsItemSelected(MenuItem
item) {
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.action_edit:
doOnActionEditButton();
return true;
case R.id.action_done:
doOnActionDone();
return true;
115

default:
return super.onOptionsItemSelected(item);
}
}

116

Aplicaie ActionBarExample n ActionBar sunt trecute


trei butoane: Ok (are ca efect preluarea irului de caractere
din zona de text i afiarea acestuia n eticheta de mai jos),
Done i Anything (deschid un mesaj de notificare de tip Toast
n partea de jos a ecranului). n containerul principal este o
zon de text, un buton Ok (care trateaz acelai eveniment ca
i butonul Ok din ActionBar) i o etichet. n primele trei
figuri ale aplicaiei, butonul Anything din ActionBar are
proprietatea android:showAsAction="ifRoom", ceea ce
arat c va fi afiat doar dac este loc. Dac nu este loc, va fi
afiat la selectarea opiunii Menu (fig. 3). Fig.1 arat aciunea
butonului Ok din ActionBar. Fig. 2 arat aciunea butonului
Ok din containerul principal.

117

1.

2.

3.

n fig. 4 butonul Anything din ActionBar are proprietatea


android:showAsAction="always", ceea ce arat c va
fi afiat ntotdeauna. Dac sunt efectuate operaii de editare a
118

zonei de text, atunci ActionBar afieaz implicit butoane de


editare (Cut, Copy, Paste).

4.

5.

6.

119

Fiierul ActionBarExample.java
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class ActionBarExample extends Activity {
private Button button1;
120

private EditText editText1;


private TextView textView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_action_bar_example);
doOnButton1();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if
it is present.
121

getMenuInflater().inflate(R.menu.action_bar_example,
menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.action_edit:
doOnActionEditButton();
return true;
case R.id.action_done:
doOnActionDone();
return true;
case R.id.action_anything:
122

doOnActionAnything();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void doOnButton1(){
button1 = (Button)this.findViewById(R.id.button1);
editText1 = (EditText)this.findViewById(R.id.editText1);
textView1
=
(TextView)this.findViewById(R.id.textView1);
this.button1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
textView1.setText("Button- "+editText1.getText());
}
});
123

}
public void doOnActionEditButton(){
editText1 = (EditText)this.findViewById(R.id.editText1);
textView1
=
(TextView)this.findViewById(R.id.textView1);
textView1.setText("ActionBar- "+editText1.getText());
}
public void doOnActionDone(){
Toast.makeText(this,
"selectat
Done",
Toast.LENGTH_SHORT).show();
}
public void doOnActionAnything(){
Toast.makeText(this,
"selectat
Anything",
Toast.LENGTH_LONG).show();
}
124

Fiierul action_bar_example.xml
<menu
xmlns:android="http://schemas.android.com/apk/res
/android" >
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
<item
android:id="@+id/action_edit"
android:titleCondensed="OK"
125

android:title="@string/action_edit"
android:icon="@drawable/ic_ok"
android:orderInCategory="1"
android:showAsAction="always"
android:menuCategory="secondary"/>
<item
android:id="@+id/action_done"
android:titleCondensed="Done"
android:title="@string/action_done"
android:icon="@drawable/ic_done"
android:orderInCategory="2"
android:showAsAction="always"
android:menuCategory="secondary"/>
<item
android:id="@+id/action_anything"
android:titleCondensed="At"
android:title="@string/action_anything"
126

android:icon="@drawable/ic_anything"
android:orderInCategory="3"
android:showAsAction="always"
android:menuCategory="secondary"/>
</menu>

127

Style
proprieti care definesc modul de vizualizare al unei
componente grafice.
Sunt definite n res/values/styles.xml
Se poate specifica nlimea, bordura, caracteristicile
fontului, culorile de background sau foreground, etc.
Este predefinit cnd se creeaz un nou proiect, dar pot fi
definite de programator.
Theme
Tema aleas pentru ntraga aplicaie
Se definete atunci cnd se creeaz un nou proiect sau se
seteaz n fiierul AndroidManifest.xml

128

Exemplu de folosire a style/theme

1.

2.

129

Pentru exemplul de la ActionBar, n fiierul


AndroidManifest.xml
se
modific
AppTheme
cu
CustomThemeBlue/CustomThemeMagenta
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/CustomThemeBlue" >
<!--android:theme="@style/AppTheme" > -->

Pentru exemplul de la ActionBar n fig.1 se modific n


fiierul res/values/styles.xml
<color name="magenta">#b0b0ff</color>
<style name="CustomThemeBlue"
parent="android:Theme.Light">

130

<item
name="android:windowBackground">@color/magenta</i
tem>
<item
name="android:colorBackground">@color/magenta</it
em>
</style>
<style
name="AppBaseTheme"
parent="android:Theme.Light">

Pentru exemplul de la ActionBar n fig.2 se modific n


fiierul res/values/styles.xml
<color name="blue">#ff0000ff</color>
<style name="CustomThemeBlue"
parent="android:Theme.Holo.Light">

131

<item
name="android:windowBackground">@color/blue</item
>
<item
name="android:colorBackground">@color/blue</item>
</style>
<style name="AppBaseTheme"
parent="android:Theme.Holo.Light">

132