Académique Documents
Professionnel Documents
Culture Documents
t allapplicazione.
ad hoc.
Configurazione ambiente
Nuova installazione
Architettura
sottostante.
ma per il simulatore.
un proprio processo .
Fornisce molti servizi ad alto livello che possono
essere utilizzate dalle applicazioni scritte dagli
utenti.
(consigliato)
2. Scaricando il pacchetto .zip sul computer e
poi caricarndo sullIDE
{3
New Software
1. Click su Add in alto a destra della finistra che
si apre.
2. Nella sezione Add Repository della finestra
che appare inserire ADT Plugins per Name
New Software
2. Click su Add in alto a destra della finistra che
si apre.
3. Nella sezione Add Repository cliccare su
Archive.
google.com/android/eclipse/
3. Click su OK.
su OK.
Next.
gle.com/android/eclipse/
4. Nel box Available Software, selezionare
il checkbox Developer Tools e cliccare su
Next
5. Nella prossima finestra sar presente la li-
su Next
viare Eclipse.
Se dovessero comparire dei warning di sicurezza o validit del software basta cliccare su OK.
Configurare un emulatore
avviare Eclipse.
di RAM.
te:
sullicona:
{4
Cliccare su OK.
Configurare un telefono
Quando si implementa unapplicazione consigliato effettuare il deploy ed il test su un dispositivo fisico prima di distribuirla agli utenti. LSDK
{5
{6
il
formato
Usa-
SUBSYSTEM==usb,
ATTR{idVendor}==0bb4,
MODE=0666,
GROUP=plugdev.
Company
Acer
Asus
Dell
Foxconn
Fujitsu
Fujitsu Toshiba
Garmin-Asus
Google
Haier
Hisense
HTC
Huawei
K-Touch
KT Tech
Kyocera
Lenovo
LG
Motorola
MTK
NEC
Nook
Nvidia
OTGV
Pantech
Pegatron
Philips
PMC - Sierra
Qualcomm
SK Telesys
Samsung
Sharp
Sony
Sony Ericsson
Teleepoch
Toshiba
ZTE
USB Vendor ID
0502
0b05
413c
0489
04c5
04c5
091e
18d1
201E
109b
0bb4
12d1
24e3
2116
0482
17ef
1004
22b8
0e8d
0409
2080
0955
2257
10a9
1d4d
0471
04da
05c6
1f53
04e8
04dd
054c
0fce
2340
0930
19d2
HelloWorld
dor ID :
progetto esistente
7. Cliccare su Next.
re:
la versione minima dellSDK Android dalla
quale girer lapplicazione.
{7
Run Configuration
E possibile eseguire lapplicazione su un dispositivo fisico oppure utilizzando lemulatore
messo a disposizione dallSDK di Android. In
entrambi i casi possibile scegliere tra due diverse modalit:
Modalit personalizzata
1. Modalit veloce:
1. Cliccare con il pulsante destro sul nome
del progetto
2. Scegliere Run as --> Android Application
2. Modalit personalizzata:
1. Cliccare con il pulsante destro sul nome
del progetto
2. Scegliere Run as --> Run Configurations
3. Cliccare con il pulsante destro su Android Application
4. Scegliere New
5. Cliccare sul pulsante Browse
6. Scegliere il proprio progetto e cliccare su
OK
7. Scegliere il nome della configurazione e
cliccare su Run
{8
ma di 640dp x 480dp
sources.getXML()
ble:
drawable-hdpi
drawable-lhdpi
drawable-mhdpi
vari dispositivi.
drawable-xhdpi
drawable-xxhdpi
operativo.
{9
#ARGB
#RRGGBB
#AARRGGBB
La definizione la seguente:
vo in posizione vericale
land: indica una risorsa nel caso il dispositivo in posizione orizzontale
E inoltre possibile definire altri qualifier sul lay-
</resources>
10in dove:
arrays.xml
colors.xml
dimens.xml
strings.xml
styles.xml
file:
font dellutente.
<resources>
<array name=country>
pt: Points rappresenta 1/72 di un inch basato sulla dimensione fisica dello schermo
<item>Albania</item>
<item>Algeria</item>
</array>
</resources>
{10
setContentView(R.layout.activity_main);
<resources>
<dimen name=dimension_name>dimension</
<TextView
dimen>
android:layout_width=wrap_content
</resources>
android:layout_height=wrap_content
android:text=@string/hello_world />
Localizzazione
<resources>
<string name=string_name>text_string</
string>
</resources>
<resources>
lingua inglese.
scegliere new-->folder
nish
R.string.hello
dallinterno dellxml: @string/hello
{11
5. Premere su Next
6. Premere su Finish
Nota: notare come nella sezione Chosen Qualifier venga in automatico impostata la lingua it.
In questo modo avremo per ogni cartella values(qualifier) un file strings che dovr contenere
tutti gli elementi tradotti nelle lingua corrispondente.
4. Impostare a Value la voce Resource Type e
inserire strings alla voce File:
Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/corso-su-android-configurazione-guida-allimplementazione-del-primo-progetto
{12
{13
tanti:
Android: il manifest.
dellapplicazione
recente di unaltra
tag fondamentali.
allora
lapplica-
ze):
{14
<action android:name=android.intent.action.MAIN/>
<category android:name=android.intent.category.LAUNCHER/>
Tag <uses-permission>: permessi che lappli- </intent-filter>
lapplicazione.
<uses-permission android:name=android.
permission.INTERNET />)
nellapplicazione.
{15
<application>.
<activity
android:name=com.example.helloworld.MainActivity
android:label=@string/app_name >
<intent-filter>
<action android:name=android.intent.action.MAIN />
<category android:name=android.intent.category.LAUNCHER />
</intent-filter>
</activity>
come in figura:
La classe java che estende Activity deve poi visualizzare lxml associato. Come vedremo Android separa la parte grafica dalla parte logica
utilizzando per la parte visuale dei file in formato
xml cosi da rendere pi gestibile e comprensibile il codice. Come si vede dallestratto di codice
il file xml si chiama main e viene caricato con
listruzione setContentView(R.layout.main);
posizioniamoci sul package com.example.navigatefromactivity e premiamo il tasto dx del mouse, si aprir un menu a tendina in cui andremo
a scegliere new-->class
{16
Verr cos creata unActivity vuota a cui andremo ad aggiungere il metodo onCreate:
package com.example.navigatefromactivity;
import android.app.Activity;
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}
{17
dActivity.class);
startActivity(intent);
condActivity).
<Button
android:id=@+id/idButon
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Vai alla seconda Activity
/>
{18
{19
<Button
android:id=@+id/idFinishButton
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Chiudi
/>
Event Handler
Activity
bisogna
implementare
il
btnGoToSecond.setOnClickListener(new
OnClickListener()
ora verr illustrato come poter passare dei valori tra le Activity, per far questo vengono utilizzati
gli intent passandogli un parametro, utilizzando
la seguente istruzione:
intent.putExtra(EXTRA_PARAMETER, va-
potremmo fare?
il seguente:
Button btnGoToSecond = (Button)findViewById(R.id.idButton);
btnGoToSecond.setOnClickListener(new OnClickListener() {
{20
<LinearLayoutxmlns:android=http://schemas.android.com/apk/res/android
xmlns:tools=http://schemas.android.com/tools
android:layout_width=match_parent
android:layout_height=match_parent
android:paddingBottom=@dimen/activity_vertical_margin
android:paddingLeft=@dimen/activity_horizontal_margin
android:paddingRight=@dimen/activity_horizontal_margin
android:paddingTop=@dimen/activity_vertical_margin
tools:context=.MainActivity
android:orientation=vertical>
<Button
android:id=@+id/idButton
android:layout_width=wrap_content
android:layout_height=wrap_content
<LinearLayout
android:layout_width=wrap_content
android:layout_height=wrap_content
android:orientation=horizontal
>
<TextView
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=@string/labelValue
android:layout_marginRight=10dp
/>
<TextView
android:id = @+id/idTxtResult
android:layout_width=wrap_content
android:layout_height=wrap_content
/>
</LinearLayout>
</LinearLayout>
txtResult = (TextView)findViewById(R.id.idTxtResult);
txtResult.setText( + initValue);
Notare che abbiamo trasformato in String il valore initValue, perch il metodo setText prende
come pramatro una stringa, esiste un metodo
che prende un intero che per rappresenta lid
di una risorsa, quindi se gli passassimo un intero il SO andrebbe a cercare questo valore nella
classe R (che contiene tutti gli id) e non trovandolo genererebbe un errore.
Definiamo il bottone come fatto nel progetto
precedente ma cambiando il modo di invocare
lactivity:
Button btnGoToSecond = (Button)findViewById(R.id.idButton);
btnGoToSecond.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.
class);
intent.putExtra(com.example.navigatefromactivity.
PARAMETER, initValue);
startActivityForResult(intent, REQUEST_CODE);
}
});
metri.
Andiamo ora a vedere come deve essere la
classe java.
putExtra(com.example.navigatefromactivity.
PARAMETER, initValue), che verr recuperato nella seconda Activity. Possiamo notare che
il parametro intero viene passato nello stesso modo come quello di tipo stringa (visto nel
progetto precedente) quello che cambia la
chiamata allActivity dove viene usato il meto-
{21
{22
CODE);
scelto.
segue:
@Override
protected void onActivityResult(int requestCode, int
resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
if (resultCode == RESULT_OK) {
int result = data.getIntExtra(com.example.
navigatefromactivity.PARAMETER_RESULT,
-1);
txtResult.setText( + result);
}
}
}
data.
getIntExtra(com.example.navigatefromactivity.
PARAMETER_RESULT, -1); e poi viene assegnato alla TextView.
Passiamo alla seconda activity.
Il file activity_second.xml risulta essere con un
selezionare onActivityResult(int,int,Intent) e
solo bottone:
premere ok
<?xml version=1.0 encoding=utf-8?>
<LinearLayout xmlns:android=http://schemas.
android.com/apk/res/android
android:layout_width=match_parent
android:layout_height=match_parent
android:orientation=vertical >
<TextView
{23
/>
vity.PARAMETER, -1);
<Button
android:id=@+id/idFinishButton
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=@string/labelClose
/>
</LinearLayout>
incrementato parameter += 1 ;
instanziato un nuovo intent Intent intent =
new Intent();
aggiunto il parametro da restituire: com.
example.navigatefromactivity.PARAMETER_RESULT
settato il risultato da ritornare al chiamante
setResult(RESULT_OK, intent);
fatto il finish dellactivity tramite il metodo fi-
come:
nish();
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button btnGoToSecond = (Button)findViewById(R.
id.idFinishButton);
btnGoToSecond.setOnClickListener(new
OnClickListener() {
@Override
public void onClick(View v) {
int parameter = getIntent().getIntExtra(com.example.
navigatefromactivity.PARAMETER,
-1);
parameter += 1 ;
Intent intent = new Intent();
intent.putExtra(com.example.navigatefromactivity.
PARAMETER_RESULT,
parameter);
setResult(RESULT_OK, intent);
finish();
}
});
}
}
{24
co aumentato.
Allegato
Dimensione
Riassumendo possiamo dire che in questo articolo abbiamo analizzato le Activity ed il loro
ciclo di vita ed abbiamo visto che giocano un
NavigateFromActivityForResult.zip 1003.51 KB
ruolo molto importante nello sviluppo delle applicazioni. Abbiamo visto anche come il sistema
operativo le gestisce e gli stati in cui si possono
trovare. E importante capire il funzionamento
delle Activity perch grazie a queste siamo in
grado di implementare applicazioni complesse.
Le Activity che abbiamo realizzato sono molto
semplici e per crearle abbiamo utilizzato dei Layout che vedremo pi in dettaglio nel prossimo
articolo.
Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/corso-su-android-lavorare-con-le-activity
{25
pre
dichiarare
il
namespace
di
Android:
xmlns:android=http://schemas.android.com/
apk/res/android
mespace.
ti:
android:layout_width e android:layout_
abbastanza veloce.
droid;
widgets.
orizzontale o verticale
android:id indica lid che viene utilizzato per
Una volta associato il bottone, pu essere utilizzato nel codice, come visto nellesempio per intercettare levento del click da parte dellutente.
Android mette a disposizione vari tipi di layout
tra cui si pu scegliere per realizzare linterfaccia grafica della nostra applicazione. Andremo a
vedere i seguenti layout:
LinearLayout;
RelativeLayout;
In questo modo non verr n creata automaticamente unActivity n aggiornato il file AndroidManifest ma li andremo a definire noi.
TableLayout;
ListView;
GridLayout.
LinearLayout
te:
tale o verticale. Questo layout lo abbiamo utilizzato nel progetto delle Activity. Creiamo un nuovo progetto che chiameremo LayoutProject, il
cui layout principale conterr dei bottoni allineati
in verticale ed alla pressione di questi andremo
a visualizzare vari altri tipi di layout.
Dal Menu cliccare su File-->New-->Android
Application Project
Sulla schermata inserire il nome del progetto
e premere Finish.
{26
Premere Finish
di Android.
ranno.
Nel file string.xml definiamo 5 label che verranno usate per i bottoni:
<string name=labelRelativeLayout>Relative Layout</string>
<string name=labelTableLayout>Table Layout</string>
<string name=labelListView>List view</string>
<string name=labelGridLayout>Grid Layout</string>
tella values
selezionare New-->Android XML File
nella finestra che si apre nel campo Resource Type selezionare la voce Values
nel campo File scrivere il nome del file color.xml
tra i tag resouces definiamo il colore che
useremo per il testo del bottone <color nam
e=textButtonColor>#FF000000</color>
premere Finish
{27
Abbiamo cos definito la dimensione che useremo per dare lo spazio ai bottoni.
Andiamo ora ad inserire 5 bottoni nel
LinearLayout creato, ad ogni bottone verr
associata unActivity con un layout diverso.
Lxml risulta essere:
<Button
android:id
= @+id/idList
android:layout_width = match_parent
android:layout_height = wrap_content
android:gravity
= center
android:text
= @string/labelListView
android:textColor = @color/textButtonColor
android:layout_marginTop= @dimen/marginTopButton
/>
{28
<Button
android:id
= @+id/idGrid
android:layout_width = match_parent
android:layout_height = wrap_content
android:gravity
= center
android:text
= @string/labelGridLayout
android:textColor = @color/textButtonColor
android:layout_marginTop= @dimen/marginTopButton
/>
</LinearLayout>
Recuperiamo i bottoni:
btnGoToRelative = (Button)findViewById(R.id.idRelative);
attributi utilizzati:
android:id: id che useremo per associare il
btnGoToRelative.setOnClickListener(this);
schermo
android:layout_height=wrap_content:
il
margine
@Override
public void onClick(View v) {
if (v == btnGoToRelative){
Log.d(TAG,Button RelativeLayout pressed);
}else if (v == btnGoToTable){
Log.d(TAG,Button TableLayout pressed);
}else if (v == btnGoToListView){
Log.d(TAG,Button ListView pressed);
}else if (v == btnGoToGrid){
Log.d(TAG,Button GridLayout pressed);
}
}
setContentView(R.layout.linear_layout_
activity);
{29
Sotto il nome dellActivity viene inserito un Intent-Filter (come visto nel secondo articolo),
quindi:
selezionare Intent-Filter
{30
RelativeLayout
Il RelativeLayout visualizza le view in posizioni
relative. Le view vengono posizionate a destra
di, sotto di etc. Per capire come funziona faccia Selezionare come action android.intent.action.MAIN
Selzionare di nuovo Intent-Filter e premere
Add
Selezionare Category
Selezionare come categoria android.intent.
category.LAUNCHER
{31
{32
android:layout_height
= wrap_content
android:layout_below
= @id/idDescription
android:layout_alignParentLeft = true
android:layout_toLeftOf
= @+id/idSurname
android:hint
= @string/hintName/>
<EditText
android:id
= @id/idSurname
android:layout_width
= 150dp
android:layout_height
= wrap_content
android:layout_below
= @id/idDescription
android:layout_alignParentRight = true
android:hint
= @string/hintSurname/>
<Button
android:layout_width
= 96dp
android:layout_height
= wrap_content
android:layout_below
= @id/Surname
android:layout_alignParentRight = true
android:text
= @string/labelBtnOk />
</RelativeLayout>
@id/idDescription,
posizioniamolo
TableLayout
Come dice il nome, TableLayout, permette di disporre i componenti in modo tabellare.
Iniziamo con il creare un nuovo file XML, premiamo con il tasto destro sulla cartella layout->New-->Android XM File
Selezionare TableLayout
Premere Finish
Verr creato il file con tag principale TableLayout. Prima di aggiungere elementi dobbiamo
precisare che ogni riga di questo layout viene indicata utilizzando il tag <TableRow> ,
quindi per una tabella con pi righe avremo pi
tag.
Modifichiamo il codice nel seguente modo:
<?xml version=1.0 encoding=utf-8?>
<TableLayout xmlns:android=http://schemas.android.com/
apk/res/android
android:layout_width=match_parent
android:layout_height=match_parent
android:stretchColumns=*>
<TableRow >
<TextView
{33
= 1
Mentre con la terza riga abbiamo utilizzato lattributo android:layout_span= 2 che permette di
posizionare il componente nelle 2 celle. Da notare lattributo android:stretchColumns=*,
@Override
public void onClick(View v) {
Intent intent = null;
if (v == btnGoToRelative){
Log.d(TAG,Button RelativeLayout pressed);
intent = new Intent(LinearLayoutActivity.this, RelativeLayoutActivity.class);
startActivity(intent);
}else if (v == btnGoToTable){
Log.d(TAG,Button TableLayout pressed);
intent = new Intent(LinearLayoutActivity.this, TableLayoutActivity.class);
startActivity(intent);
}else if (v == btnGoToListView){
Log.d(TAG,Button ListView pressed);
}else if (v == btnGoToGrid){
Log.d(TAG,Button GridLayout pressed);
}
{34
{35
premere Finish
vity:
<activity android:name=TableLayoutActivity></activity>
ListView
Visualizza una lista di items scrollabili. Gli items
sono inseriti automaticamente utilizzando un
adapter che prende i dati da un array o da un
database e trasformano ogni risultato in una
view da inserire nella lista. Faremo due esempi uno con un adaper standard ed uno con un
adapter custom.
Come per gli altri layout posizioniamoci sulla cartella layout e premiamo il tast destro del
dapterActivity);
stra aperta
recuperiamo
setContentView(R.layout.listview_layout_activi-
vity
selezioniamo ListView nella sezione RootElement
il
layout
da
utilizzare
ty);
recuperiamo loggetto ListView ed assegnamogli ladapter passandogli larray definito nel file
string.xml.
Aggiungere linvocazione alla classe nel metodo onClick della classe LinearLayoutActivity:
@Override
public void onClick(View v) {
Intent intent = null;
if (v == btnGoToRelative){
Log.d(TAG,Button RelativeLayout pressed);
intent = new Intent(LinearLayoutActivity.this, RelativeLayoutActivity.class);
startActivity(intent);
}else if (v == btnGoToTable){
Log.d(TAG,Button TableLayout pressed);
intent = new Intent(LinearLayoutActivity.this, TableLayoutActivity.class);
startActivity(intent);
}else if (v == btnGoToListView){
Log.d(TAG,Button ListView pressed);
intent = new Intent(LinearLayoutActivity.this, ListViewArrayAdapterActivity.class);
startActivity(intent);
}else if (v == btnGoToGrid){
Log.d(TAG,Button GridLayout pressed);
}
}
Effettuare il run del progetto, sulla lista premendo sul bottone listView va sulla schermata con
la lista appena creata:
{36
= @+id/idImage
android:layout_width = wrap_content
android:src
= @drawable/ic_launcher
android:layout_height = wrap_content
android:layout_gravity = center
/>
<TextView
android:id
= @+id/idText
android:layout_width = match_parent
android:layout_height = wrap_content
/>
</LinearLayout>
selezionare New-->Package
adapter
premere il tasto destro del mouse sul package
selezionare New-->Class
BaseAdapter
premere Finish
text_item_list_custom.xml
<?xml version=1.0 encoding=utf-8?>
<LinearLayout
xmlns:android
= http://schemas.android.com/
apk/res/android
android:layout_width
= match_parent
android:layout_height
= wrap_content
android:orientation
= horizontal
android:layout_marginTop = 10dp
android:paddingBottom
= 10dp
android:paddingTop
= 10dp
android:paddingLeft
= 5dp
android:layout_gravity = center
>
<ImageView
{37
Implementiamo il costruttore
@Override
public Object getItem(int position) {
return items[position];
}
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
ViewValues values = null;
if (convertView == null) {
values = new ViewValues();
convertView = inflater.inflate(R.layout.text_item_list_
custom, null);
values.value
= (TextView)convertView.
findViewById(R.id.idText);
convertView.setTag(values);
}
else {
values = (ViewValues) convertView.getTag();
}
{38
Creiamo lActivity ListViewCustomAdapterActivity utilizzando lo stesso layout listview_layout_activity per la lista e instanziando il Custo-
mAdapter
public class ListViewCustomAdapterActivity extends Activity {
private ListView list = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_layout_activity);
list = (ListView)findViewById(R.id.idList);
list.setAdapter(new CustomAdapter(this));
}
}
GridLayout
Visualizza gli elementi in una griglia in due dimensioni. Faremo visualizzare delle immagini
e alla pressione di queste verr visualizzata la
posizione con un Toast.
Come prima cosa creiamo il file grid_layout_activity.xml
<?xml version=1.0 encoding=utf-8?>
<GridView xmlns:android=http://schemas.android.com/
apk/res/android
android:id=@+id/gridview
android:layout_width=match_parent
android:layout_height=match_parent
android:columnWidth=90dp
{39
ImageView imageView;
if (convertView == null) { // if its not recycled, initialize
some attributes
imageView = new ImageView(context);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(imgIds[position]);
return imageView;
mentare.
La classe risulta essere:
public class CustomGridAdapter extends BaseAdapter {
{40
{41
Allegato
imgsgridlayout.zip
Dimensione
20.48 KB
LayoutProject.zip
988.61 KB
Nel metodo onClick della classe LinearLayoutActivity inserire lintent per il passaggio alla
nuova activity
intent = new Intent(LinearLayoutActivity.this, GridViewActivity.class);
startActivity(intent);
Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/corso-su-android-lavorare-con-i-layout
{42
4. UIControls
ndroid fornisce unampia variet di componenti visuali per disegnare interfacce grafi-
ProgressBar
Spinner
TimePicker
DatePicker
Analizziamoli
denti.
EditText
CheckBox
RadioButton
RadioGroup
ImageButton
ToggleButton
singolarmente
facendo
degli
TextView
Il TextView un componente grazie al quale
{43
name=password_hint>Password</string>
in figura:
EditText
Il componente EditText permette ad un utente
di digitare del testo nellapplicazione. Pu essere costituito da una singola linea o da pi
linee. Per scrivere allinterno del campo basta
toccare il componente cos da far apparire la
tastiera. Il campo pu assumere diversi tipi di
serimento.
Un esempio di EditTetxt pu essere il seguente:
<EditText
android:id
= @+id/password
android:layout_width = fill_parent
android:layout_height= wrap_content
android:hint
= @string/password_hint
android:inputType = textPassword />
AutoCompleteTextView
Se in un campo di testo si vogliono dare dei suggerimenti possibile utilizzare una sottoclasse
di EditText chiamata AutoCompleteTextView.
Per implementare questo campo occorre definire un adapter che fornisce i suggerimenti.
Di seguito vediamo come possibile implementare un AutoCompleteTextView utilizzando un
ArrayAdapter. Inserite il codice seguente sotto
la definizione dellEditText gi immesso in precedenza:
<AutoCompleteTextView
style
= @android:style/Theme.Black
android:id
= @+id/idColor
android:layout_width
= fill_parent
android:layout_height
= wrap_content
android:completionThreshold = 1
/>
{44
= @+id/idButton1
android:layout_width = wrap_content
TextView) findViewById(R.id.idColor);
android:layout_height = wrap_content
android:text
= @string/button_text
/>
color_array);
// Crea ladapter
ArrayAdapter<String> adapter = new
ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, colors);
textView.setAdapter(adapter);
<ImageButton
android:layout_width = wrap_content
android:layout_height = wrap_content
android:src
= @drawable/button_icon
/>
i suggerimenti disponibili:
{45
<Button
android:id
= @+id/idButton1
android:layout_width
= wrap_content
android:layout_height
= wrap_content
android:text
android:onClick
= @string/button_text
= pressMethod
/>
Checkbox
I checkbox sono dei componenti che permettono allutente di poter scegliere una o pi opzioni
di una lista. Questi possono essere creati nel
file di layout utilizzado il conponente CheckBox.
Inseriamo, nel nostro file, i due checkbox, notando che il secondo risulter spuntato grazie
allattributo: android:checked= true
Per definire un evento di click si hanno due modi
come nel caso del Button: i due metodi visti nei
casi precedenti per intercettare gli eventi (ormai
abbiamo capito come funzionano) ed andiamo
ad utilizzare lattributo android:onClick nel tag
<CheckBox>
<CheckBox
android:id
= @+id/idCheck1
android:layout_width
= wrap_content
android:layout_height
= wrap_content
android:text
= @string/labelCheckBox1
android:onClick
= performCheckBoxOnClick
/>
<CheckBox
android:id
= @+id/idCheck2
{46
android:layout_width
= wrap_content
android:layout_height
= wrap_content
android:text
= @string/labelCheckBox2
android:checked
= true
android:onClick
= performCheckBoxOnClick
/>
selezionato</string>
{47
Definiamo il metodo:
public void onRadioButtonClicked(View view) {
boolean checked = ((RadioButton) view).isChecked();
switch(view.getId()) {
case R.id.idRadio1:
if (checked){
Toast.makeText(this, getString(R.string.labelRadioCheched1),
Toast.LENGTH_SHORT).show();
}
break;
case R.id.idRadio2:
if (checked){
Toast.makeText(this, getString(R.string.labelRadioCheched2),
Toast.LENGTH_SHORT).show();
}
break;
}
}
ed inseriamo le stringhe
<string name=labelRadio1>Radio 1</string>
<string name=labelRadio2>Radio 2</string>
<string name=labelRadioCheched1>Il RadioButton 1
selezionato</string>
<string name=labelRadioCheched2>Il RadioButton 2
selezionato</string>
ToggleButton
Un toggle button permette allutente di selezionare due stati (on/off).
Per vedere come intercettare lhandler utilizziamo lattributo android:onClick nel tag <ToggleButton>
<ToggleButton
android:id
= @+id/idToggle
android:layout_width
= wrap_content
android:layout_height
= wrap_content
android:textOn
= @string/labelToggleOn
android:textOff
= @string/labelToggleOff
android:onClick
= onToggleOnClick
/>
{48
{49
Spinner
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
da scegliere.
mata successiva:
Per popolare lo Spinner si pu utilizzare un ArrayAdapter. Utilizziamo lo <string-array> impiegato per lesempio su AutoCompleteTextView
Spinner spinner = (Spinner) findViewById(R.id.idSpinnerColors);
final ArrayAdapter<CharSequence> adapterSpinner = ArrayAdapter.createFromResource(this,
R.array.color_array, android.R.layout.simple_spinner_item);
adapterSpinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapterSpinner);
<TableLayout
android:layout_width = fill_parent
android:layout_height = wrap_content
android:stretchColumns = 0
>
<TableRow >
<EditText
android:id
= @+id/idDatePicker
android:layout_width = fill_parent
android:layout_height = wrap_content
/>
<Button
android:id
= @+id/idBtnOpenDatePicker
android:layout_width = wrap_content
android:layout_height = wrap_content
android:text
= @string/btnLabelOpenDatePicker
/>
</TableRow>
</TableLayout>
TimePicker DatePicker
<string name=btnLabelOpenDatePicker>Set
Date</string>
{50
edDate = (EditText)findViewById(R.id.idDatePicker);
}
};
{51
to Calendar e viene passato alla classe tramite un Bundle. Alla fine viene invocato il metodo
Create:
{52
= hour;
allEditText.
Per finire, inseriamo il codice che prende il But-
public TimePickerFragment() {}
//setta il listener per la risposta
public void setCallBack(OnTimeSetListener listener) {
this.listener = listener;
}
@Override
public void onClick(View v) {
showDatePicker();
}
});
<TableLayout
android:layout_width = fill_parent
android:layout_height = wrap_content
android:stretchColumns = 0
>
<TableRow >
<EditText
android:id
= @+id/idTimePicker
android:layout_width = fill_parent
android:layout_height = wrap_content
/>
<Button
android:id
= @+id/idBtnOpenTimePicker
android:layout_width = wrap_content
android:layout_height = wrap_content
android:text
= @string/btnLabelOpenTimePicker
/>
</TableRow>
</TableLayout>
Aggiungere nellactivity:
edTime = (EditText)findViewById(R.id.idTimePicker);
ed i metodi:
Button openTP = (Button)findViewById(R.
id.idBtnOpenTimePicker);
openTP.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showTimePicker();
}
});
private void showTimePicker() {
TimePickerFragment date = new TimePickerFragment();
/*recupera i valori per visualizzare la data attuale */
Conclusioni
Dopo aver visto come funzionano i Layout ed
i tipi pi comuni di componenti grafici, siamo in
grado di creare applicazioni graficamente com-
{53
Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/corso-su-android-uicontrols
{54
4 Anelli
Iniziamo ad implementare il calcolo per una resistenza con 4 anelli riferendoci ai valori riportati
Le Activity hanno una grafica semplice da utiliz-
{55
android:id
= @+id/idMultiplier
android:layout_width = match_parent
android:layout_height = wrap_content
/>
</TableRow>
<TableRow >
<TextView
android:layout_width = match_parent
android:layout_height = wrap_content
android:text
= @string/labelTollerance
/>
<Spinner
android:id
= @+id/idTolleance
android:layout_width = match_parent
android:layout_height = wrap_content
/>
</TableRow>
</TableLayout>
<include layout=@layout/resistance4 android:layout_
gravity=center/>
</LinearLayout>
{56
<ImageView
android:id
= @+id/idImgRing2
android:layout_height
= wrap_content
android:layout_width
= wrap_content
android:background
= @drawable/black
android:layout_marginLeft = 50dp
android:minHeight
= @dimen/ring_min_
height
/>
<ImageView
android:id
= @+id/idImgMultiplier
android:layout_height = wrap_content
android:layout_width
= wrap_content
android:background
= @drawable/black
android:layout_marginLeft = 70dp
android:minHeight
= @dimen/ring_min_
height
/>
<ImageView
android:id
= @+id/idImgTollerance
android:layout_height = wrap_content
android:layout_width
= wrap_content
android:background
= @drawable/black
android:layout_marginLeft = 100dp
android:minHeight
= @dimen/ring_min_
height
/>
</FrameLayout>
<TextView
android:id
= @+id/idResult
android:layout_width
= match_parent
android:layout_height
= wrap_content
android:layout_marginLeft = 20dp
/>
</LinearLayout>
e i valori degli string-array che andranno a popolare i nostri Spinner il layout pronto.
Spendiamo due parole per capire come strutturato il layout. Si vede che vi un LinearLayout verticale al cui interno vi un FrameLayout nel quale
viene posizionata limmagine della resistenza e
degli anelli, e sotto il FrameLayout una TextView
in cui verr visualizzato il valore della resistenza.
Si vede che allinterno del FrameLayout viene posizionata (come primo componente) limmagine
della resistenza e di seguito gli anelli in successione e con un margine progressivo. Viene settata lal-
<string-array name=color_ring_array>
<item>Nero</item>
<item>Marrone</item>
<item>Rosso</item>
<item>Arancio</item>
<item>Giallo</item>
<item>Verde</item>
<item>Blu</item>
<item>Viola</item>
<item>Grigio</item>
<item>Bianco</item>
</string-array>
<string-array name=multiplier_ring_array>
<item>Nero</item>
<item>Marrone</item>
{57
Allinterno del metodo onCreate andremo a recuperare gli Spinner e ad associargli i valori grazie
ad un ArrayAdapter come abbiamo visto nellarticolo che parlava dei componenti grafici.
{58
value = + valueMultiplier/1000;
suffix = Kohms;
tiplcatore
valueMultiplier
= valueWithoutMultiplier * multiplier;
{59
if (color == 0){
//nero
setDrawable(ring,R.drawable.black);
}else if (color == 1){
//marrone
setDrawable(ring,R.drawable.brown);
}else if (color == 2){
//rosso
setDrawable(ring,R.drawable.red);
}else if (color == 3){
//arancio
setDrawable(ring,R.drawable.orange);
}else if (color == 4){
//giallo
setDrawable(ring,R.drawable.yellow);
}else if (color == 5){
//verde
setDrawable(ring,R.drawable.green);
}else if (color == 6){
//blu
setDrawable(ring,R.drawable.blue);
}else if (color == 7){
//viola
setDrawable(ring,R.drawable.violet);
}else if (color == 8){
//grigio
setDrawable(ring,R.drawable.gray);
}else if (color == 9){
//bianco
setDrawable(ring,R.drawable.white);
}
}
/**
* carica limmagine in base allanello
*
* @param ring
* @param drawable
*/
private void setDrawable(long ring, int drawable){
if (ring == Constants.RING_1){
imgRing1.setBackgroundResource(drawable);
}else if (ring == Constants.RING_2){
imgRing2.setBackgroundResource(drawable);
}
}
{60
Come si vede dal codice per cambiare il colore degli anelli stato utilizzato il metodo setBackgroundResource che prende come parametro lid dellimmagine.
{61
5 Anelli
Il calcolo del valore della resistenza con 5 anelli
analogo a quella con 4 la differenza che vi
una cifra in pi, quindi dovremo considerarla
nel calcolo.
android:layout_height
= wrap_content
android:layout_width
= wrap_content
android:background
= @drawable/black
android:layout_marginLeft = 50dp
android:minHeight
= @dimen/ring_min_
height
android:layout_gravity
= top
/>
<ImageView
android:id
= @+id/idImgRing3
android:layout_height
= wrap_content
android:layout_width
= wrap_content
android:background
= @drawable/black
android:layout_marginLeft = 70dp
android:minHeight
= @dimen/ring_min_
height
android:layout_gravity
= top
/>
<ImageView
android:id
= @+id/idImgMultiplier
android:layout_height
= wrap_content
android:layout_width
= wrap_content
android:background
= @drawable/black
android:layout_marginLeft = 90dp
android:minHeight
= @dimen/ring_min_
height
android:layout_gravity
= top
/>
<ImageView
android:id
= @+id/idImgTollerance
android:layout_height
= wrap_content
android:layout_width
= wrap_content
android:background
= @drawable/black
android:layout_marginLeft = 120dp
android:minHeight
= @dimen/ring_min_
height
android:layout_gravity
= top
/>
</FrameLayout>
<TextView
android:id
= @+id/idResult
android:layout_width
= match_parent
android:layout_height
= wrap_content
android:layout_marginLeft = 20dp
/>
</LinearLayout>
{62
{63
Allegato
Dimensione
ResistanceProject.zip
388.94 KB
Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/corso-su-android-creiamo-nostra-applicazione-automatizzare-calcolo-del-valore-delle-resistenze
{64
massima di 10cm cos da rendere le comunicazioni molto pi sicure perch difficilmente intercettabili, a differenza di una comunicazione
wireless o Bluetooth. Per questo motivo molte
aziende stanno realizzando applicazioni in grado di sfruttare questa tecnologia per effettuare
pagamenti con carta di credito presente sulla
SIM del telefono o, se il telefono non NFCcompliant, utilizzando apposite schede SD con
tecnologia NFC. Negli ultimi anni, il numero di
telefoni che montano un chip NFC aumentato
in modo considerevole e quindi anche le applicazioni che sfruttano questa tecnologia sono in
aumento. Ad oggi possibile trovare allinterno di musei, vicino alle opere, dei tag NFC e
appoggiando il proprio smartphone possibile
acquisire ulteriori informazioni.
Nellarticolo vedremo come realizzare una nostra applicazione per poter leggere il contenuto
di un tag NFC e scrivere sui nostri tag in modo
da poter effettuare le seguenti azioni:
impostare il telefono in silenzioso;
spegnere la wifi;
attivare il bluetooth;
attivare lallarme.
Cosa ci serve
un telefono NFC, io ho usato un Samsung
S2 NFC;
uno o pi tag NFC, io ho usato i tag della
sony in figura:
Image credits:nfctimes.com
Come prima cosa pensiamo allinterfaccia grafica ossia come si deve presentare la nostra applicazione:
home page: da cui si effettuano le scelte;
sar composta da 3 pulsanti per poter scrivere e leggere i dati sul tag, in particolare:
Scrivi tag: permette di personalizzare i
tag NFC;
Leggi Tag: legge un generico tag contenente messaggi in formato NDEF;
Leggi Tag/Imposta il telefono: permette di leggere il tag e di impostare il telefono nella modalit scelta.
{65
Scrivere il tag
Partiamo dalla classe che ci permetter di personalizzare il nostro tag NFC (WriteTagActivity.java), che sar costituita da una TextView
per una breve descrizione, da tre RadioButton e
da un bottone per effettuare la scrittura.
Il file write_tag_activity.xml risulta essere molto semplice:
Leggi il tag e Leggi/Imposta il telefono:
hanno lo stesso layout ma le azioni che svolgono sono diverse, la prima mostrer a video le informazioni lette dal tag, mentre la
seconda effettuer delle azioni in base allinformazione contenuta nel tag.
{66
= http://schemas.android.com/apk/res/android
android:layout_width = fill_parent
android:layout_height = fill_parent
android:orientation
= vertical >
<LinearLayout
android:layout_width
= match_parent
android:layout_height
= wrap_content
android:layout_marginTop = 20sp
android:orientation
= vertical>
<TextView
android:layout_width
= match_parent
android:layout_height
= wrap_content
android:text
= @string/labelDescription
android:layout_marginTop = 10sp
android:layout_marginBottom = 10sp
/>
<RadioGroup
android:layout_width
= fill_parent
android:layout_height
= wrap_content
android:orientation
= vertical>
<RadioButton
android:id
= @+id/idRadioSilent
android:layout_width = wrap_content
android:layout_height = wrap_content
android:text
android:checked
= @string/labelRadioSilent
= true/>
<RadioButton
android:id
= @+id/idRadioTurnOffWifi
android:layout_width = wrap_content
android:layout_height = wrap_content
android:text
= @string/labelRadioTurnOffWifi/>
<RadioButton
android:id
= @+id/idRadioTurnOnBT
android:layout_width = wrap_content
android:layout_height = wrap_content
android:text
= @string/labelRadioTurnOnBT/>
{67
= @+id/idRadioSetAlarm
android:layout_width = wrap_content
android:layout_height = wrap_content
android:text
= @string/labelRadioSetAlarm/>
</RadioGroup>
<Button
android:id
= @+id/btnWriteTag
android:layout_width
= wrap_content
android:layout_height = wrap_content
android:layout_weight = 1
android:text
= @string/btnWrite
android:layout_gravity = center
android:layout_marginTop = 10sp />
</LinearLayout>
</LinearLayout>
corrispondente:
Azione
Silent
Imposta il telefono in
modo silenzioso
wifiOff
Spegne la wifi
BTOn
Accende il Bluetooth
Alarm-ora:minuti
Imposta lallarme
{68
{69
nel quale si controlla quale RadioButton selezionato e si effettua lazione necessaria. Si nota
che per radioSilent, radioTurnOffWifi e radioTurnOnBT viene richiamato il metodo:
private void writeTag(String text, Tag tag) throws IOException, FormatException{
NdefRecord[] records = { createTextRecord(text,Locale.getDefault(),true) };
NdefMessage message = new NdefMessage(records);
// Get an instance of Ndef for the tag.
Ndef ndef = Ndef.get(tag);
// Enable I/O
ndef.connect();
// Write the message
ndef.writeNdefMessage(message);
// Close the connection
ndef.close();
}
} catch (FormatException e) {
Toast.makeText(context, context.getString(R.string.errorWritingTag) ,
{70
{71
{72
Leggere il tag
Vediamo ora come recuperare le informazioni
dal tag appena scritto. Utilizziamo una classe
ReadActivity.java molto simile a WriteTagActivity.java; la differenza essenziale si trova nel
metodo onNewIntent in cui recuperiamo le informazioni dal tag e le presentiamo a video tramite
un Dialog:
@Override
protected void onNewIntent(Intent intent){
if(NFCAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())){
String action = intent.getAction();
Tag tag = intent.getParcelableExtra(NFCAdapter.EXTRA_TAG);
String s = action + \n\n + tag.toString();
// parse through all NDEF messages and their records and pick text type only
Parcelable[] data = intent.getParcelableArrayExtra(NFCAdapter.EXTRA_NDEF_MESSAGES);
if (data != null) {
try {
for (int i = 0; i < data.length; i++) {
NdefRecord [] recs = ((NdefMessage)data[i]).getRecords();
for (int j = 0; j < recs.length; j++) {
if (recs[j].getTnf() == NdefRecord.TNF_WELL_KNOWN &&
Arrays.equals(recs[j].getType(), NdefRecord.RTD_TEXT)) {
byte[] payload = recs[j].getPayload();
String textEncoding = ((payload[0] & 0200) == 0) ? UTF-8 : UTF-16;
int langCodeLen = payload[0] & 0077;
{73
{74
SCOVERED.equals(getIntent().getAction())){
String s
String message = ;
java, questa risulta essere leggermente diversa, a parte la logica che ci permetter di disabilitare il wifi, abilitare il bluetooth, etc, quello che
cambia come viene registrata lActivity con
lintent filter per il discover del tag NFC. Questa
volta definiamo lintent-filter nel manifest perch vogliamo che quando viene riconosciuto il
tag, venga aperta in automatico la nostra Activity per eseguire loperazione memorizzata sul
tag. Ricordo che se viene registrato lintent filter
nellActivity come la classe vista in precedenza,
allora vince la classe aperta per intercettare
lintent.
<activity
android:label=@string/app_name
android:name=.read.ReadAndSetPnoneActivity
android:screenOrientation=portrait
>
<intent-filter>
<action android:name=android.NFC.action.
NDEF_DISCOVERED/>
<category android:name=android.intent.category.
DEFAULT/>
<data android:mimeType=text/plain />
</intent-filter>
</activity>
= ;
enableBT();
message = getString(R.string.bluetoothOk);
}else if (s.startsWith(getString(R.string.stateA
{75
MODE_VIBRATE);
}
enableAlarm(s);
setAlarm = true;
message = getString(R.string.enableAlarmOk);
}
}
DialogFragment dialog = new
DialogMessage(message);
dialog.show(getFragmentManager(), message);
} catch (Exception e) {
DialogFragment dialog = new
DialogMessage(getString(R.string.errorReadingTag));
dialog.show(getFragmentManager(), message);
e.printStackTrace();
}
wifiManager.setWifiEnabled(false);
}
//Disable bluetooth
thAdapter.getDefaultAdapter();
if (!mBluetoothAdapter.isEnabled()) {
mBluetoothAdapter.enable();
}
}
Mentre per settare lallarme viene prima parsato il valore letto dal tag che ricordiamo contiene
lora e di seguito invocato lintent:
Intent openNewAlarm = new Intent(AlarmClock.
ACTION_SET_ALARM);
am.setRingerMode(AudioManager.RINGER_
MODE_NORMAL);
{76
{77
= s.substring(s.indexOf(:) + 1,s.length());
Allegato
Dimensione
ReadWriteNFCTag.zip
661.1 KB
Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/corso-su-android-creiamo-unapplicazione-scrivere-leggere-tag-nfc
{78
gorie:
tabase criptato.
{79
Allinterno della classe DbCrypt possiamo notaCliccare su browse nella sezione superclass e
re i metodi:
per:
del database;
onUpgrade: metodo invocato per controllare la versione del db attualmente salvato con
una nuova versione per effettuare eventuale
upgrade del database.
Alla classe cos creata andremo ad aggiungere
il costruttore:
private DbCrypt(Context context) {
super(context, DB_LOCATION, null, DATABASE_VERSION);
DbCrypt.context = context;
}
{80
{81
Dove
getWritableDatabase(password) permette di
base.
allapplicazione.
dbCrypt.onCreate(db);
;
passwordOk = true;
} catch (Exception e) {
// TODO: handle exception
passwordOk = false;
}
}
return dbCrypt;
il
metodo
Cognome
Indirizzo
return result;
Richiamiamo la classe DbCrypt dalla nostra activity e andiamo ad effettuare un inserimento sul
db:
}
});
{82
<RelativeLayout
android:layout_width=match_parent
android:layout_height=match_parent
>
<LinearLayout
android:id=@+id/linearLayout
android:layout_width=match_parent
android:layout_height=wrap_content
android:orientation=vertical
>
<TextView
android:layout_width=match_parent
android:layout_height=wrap_content
android:text=Dati inserimento utente
android:singleLine=true
android:textSize=20sp/>
<EditText
android:id=@+id/nome
android:layout_width=match_parent
android:layout_height=wrap_content
{83
Come prova dellavvenuto inserimento, recuperiamo i dati inseriti effettuando una query sul db
che ci restitutisca tutte le righe della tabella ed
inserendo i valori allinterno di una tableview.
public ArrayList<UtenteBean> elencoUtenti(){
ArrayList<UtenteBean> lista = new
ArrayList<UtenteBean>();
Cursor cursor = db.query(utente, null, null, null,
null, null, null);
while (cursor.moveToNext()) {
UtenteBean utente = new UtenteBean();
utente.setNome(cursor.getString(cursor.
getColumnIndex(nome)));
utente.setCognome(cursor.getString(cursor.
getColumnIndex(cognome)));
utente.setIndirizzo(cursor.getString(cursor.
getColumnIndex(indirizzo)));
</RelativeLayout>
Come si vede, la prima parte fissa con 3 EditText, mentre la tabella (TableLayout) inserita
in uno ScrollView in modo da far scorrere i dati
se eccedono le dimensioni dello schermo.
Da questa sar, quindi, possibile inserire il
nome, cognome e indirizzo.
Alla pressione del tasto Inserisci verranno in-
return result;
lista.add(utente);
}
cursor.close();
return lista;
{84
tabella.addView(riga);
<TableRow xmlns:android=http://schemas.android.
com/apk/res/android
android:layout_width=match_parent
android:layout_height=wrap_content
android:gravity=center_horizontal>
<TextView
android:id=@+id/nomeRow
android:layout_width=100dp
android:layout_height=wrap_content
android:text=Medium Text
android:textColor=@android:color/black
android:textAppearance=?android:attr/textAppearanceMedium />
<TextView
android:id=@+id/cognomeRow
android:layout_width=100dp
android:layout_height=wrap_content
android:text=Medium Text
android:textColor=@android:color/black
android:textAppearance=?android:attr/textAppearanceMedium />
<TextView
android:id=@+id/indirizzoRow
android:layout_width=100dp
android:layout_height=wrap_content
android:text=Medium Text
android:textColor=@android:color/black
{85
{86
Allegato
Dimensione
CryptDB.zip
240.36 KB
</TableRow>
Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/corso-su-android-impariamo-proteggere-i-nostri-dati
cosa ci serve :
gamenti:
re.
Piedini Arduino
D2
D3
3,3v
Gnd
{87
verde: acceso
void setupBT(){
bluetooth.begin(115200); // Di default settato a
115200bps
// manda il comando di per far entrare il modulo bt
in command mode
bluetooth.print($);
bluetooth.print($);
bluetooth.print($);
delay(100); // Ritardo per aspettare la risposta del
modulo btD
bluetooth.println(U,9600,N); // cambia temporaneamente il baudrate a 9600,
no parity
rosso: spento
dove
const int rxPin = 3; //SoftwareSerial RX pin
const int txPin = 2; //SoftwareSerial TX pin
= 7;
= 6;
= 4;
= 5;
{88
{89
btnK2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//
sendMessage(k2_0s);
}
});
faultAdapter();
}
});
} else {
if (btService == null) enableToSend();
}
sendMessage(calcNewState(k2,K2));
sendMessage(calcNewState(k3,K3));
sendMessage(calcNewState(k4,K4));
btService.start();
{90
effettuare il pairing, tramite la classe DeviceListActivity (che non altro che una lista) richiamata dal menu nella MainActivity:
@Override
public boolean onOptionsItemSelected(MenuItem
item) {
Intent serverIntent = null;
switch (item.getItemId()) {
case R.id.secure_connect_scan:
serverIntent = new Intent(this, DeviceListActivity.class);
startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE_SECURE);
return true;
case R.id.discoverable:
if (message.length() > 0) {
ensureDiscoverable();
return true;
Mentre il metodo calcNewState serve per calcolare lo stato del rel e quindi restituisce il valore da inviare alla scheda:
private String calcNewState(String who, int rele){
if (aReleStatus[rele] == RELE_ON){
Log.d(TAG, who + actual status ON --> set
to OFF);
//setta il nuovo stato del rel
aReleStatus[rele] = RELE_OFF;
setImages(who, false);
return who + _ + RELE_OFF + s;
}else {
Log.d(TAG, who + actual status OFF --> set
to ON);
//setta il nuovo stato del rel
aReleStatus[rele] = RELE_ON;
setImages(who, true);
return who + _ + RELE_ON + s;
}
}
}
return false;
{91
mBtAdapter.startDiscovery();
che lancia la ricerca in modo asincrono e quando vengono trovati dei dispositivi viene lanciato
un intent BluetoothDevice.ACTION_FOUND
quindi occorre registrare un BroadcastReceiver
a tale intent:
IntentFilter filter = new IntentFilter(BluetoothDevice.
ACTION_FOUND);
this.registerReceiver(mReceiver, filter);
btService.connect(device);
{92
A questo punto premendo sui bottoni per attivare spegnere viene chiamato il metodo
public void write(byte[] out) {
// Create temporary object
ConnectedThread r;
// Synchronize a copy of the ConnectedThread
synchronized (this) {
if (mState != STATE_CONNECTED) return;
r = mConnectedThread;
}
// Perform the write unsynchronized
r.write(out);
}
synchronized (BluetoothService.this) {
mConnectThread = null;
}
ype);
}
device mmSocket.connect();
{93
Allegato
Dimensione
readBT.zip
913 bytes
BTArduinoCommunicator.zip
583.8 KB
Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/corso-su-android-lavoriamo-con-bluetooth-del-nostro-smartphone
{94
ome prima cosa bisogna sapere che Android supporta una variet di periferiche
USB attraverso 2 modalit:
<SeekBar
android:id
= @+id/seekBar1
android:layout_width = match_parent
android:layout_height = wrap_content
android:max
= 255
android:progress
= 0
android:padding
= 40dp
/>
<Button
android:id
= @+id/idBtnEnablePWM
android:layout_width = wrap_content
android:layout_height = wrap_content
android:text
= @string/enablePWM
android:layout_gravity = center_horizontal/>
<Button
android:id
= @+id/idBtnDisablePWM
android:layout_width = wrap_content
android:layout_height = wrap_content
{95
{96
usbDevice = (UsbDevice)deviceIterator.
Toast.makeText(this.getApplicationContext(), Product ID : +
usbDevice.getProductId() + , Toast.LENGTH_
SHORT).show();
}
if (usbDevice != null) initDevice(usbDevice);
}
Questo sfrutta il metodo getDeviceList() della
classe UsbManager, che mappa tutti i dispositivi connessi. Da questa cicliamo sui dispositivi
connessi; nel nostro caso c solo Arduino, recuperiamo loggetto UsbDevice ed andiamo ad
inizializzare il dispositivo:
private void initDevice(UsbDevice mDevice){
UsbDeviceConnection conn = mUsbManager.
openDevice(mDevice);
if (!conn.claimInterface(mDevice.getInterface(1), true)) {
return;
}
{97
do send(byte[] data)
ta la classe ArduinoConnection
}
});
e.printStackTrace();
{98
try {
byte[] b = s.getBytes(US-ASCII);
@Override
public void onProgressChanged(SeekBar
seekBar,int progress,boolean fromUser){
if(fromUser){
}
});
int i = (int)progress;
sValue = i + a;
try {
byte[] b = sValue.getBytes(US-
e.printStackTrace();
ASCII);
tion e) {
}
});
e.printStackTrace();
sul led.
seekBar.setOnSeekBarChangeListener(new
SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar
seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar
seekBar) {
{99
{100
else {
//non deve fare niente
}
}//end if( isDigit(ch))
}
}
void resetValue(){
index = 0;
for (int i=0; i<5; i++){
strValue[i] = 0;
}
}
Conclusioni
Abbiamo quindi visto come semplice inviare
dati ad Arduino connettendo il telefono tramite
la porta USB. Come esercizio si potrebbe pensare di aggiungere un altro led e far in modo
di abilitare uno o laltro attraverso lapplicazione
sul telefono, per esempio introducendo un altro
Button che abiliti il secondo led e disabiliti il primo cos da pilotarli con la stessa SeekBar, oppure introducendone una nuova cos da averne
una per ciascuno. Buon divertimento.
Allegato
Dimensione
arduinoUSB.zip
841 bytes
ArduinoUSBCommunication.zip
73.52 KB
Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/corso-su-android-lavoriamo-con-porta-usb-del-telefono
ethernet compatibile).
cendere un LED.
#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <util.h>
net.
Per la gestione del rel andremo ad utilizzare il
#include <TinkerKit.h>
attuatori.
{101
}
//viene visualizzato il proprio indirizzo ip
Serial.print(My IP address: );
for (byte thisByte = 0; thisByte < 4; thisByte++) {
Serial.print(Ethernet.localIP()[thisByte], DEC);
Serial.print(.);
}
Serial.println();
{102
plicazione.
if(response.indexOf(ON)>=0){
//on del rel
Serial.println(rele on);
relay.on();
}else if(response.indexOf(OFF)>=0){
//off del
Serial.println(rele off );
relay.off();
}
Lo schema finale sar quindi:
<RelativeLayout xmlns:android=http://schemas.
android.com/apk/res/android
xmlns:tools=http://schemas.android.com/tools
android:layout_width=match_parent
android:layout_height=match_parent
android:paddingBottom=@dimen/activity_vertical_margin
android:paddingLeft=@dimen/activity_horizontal_margin
android:paddingRight=@dimen/activity_horizontal_margin
android:paddingTop=@dimen/activity_vertical_margin
tools:context=com.example.arduinowebview.
MainActivity$PlaceholderFragment >
<WebView
android:id=@+id/webView
android:layout_width=match_parent
android:layout_height=match_parent/>
</RelativeLayout>
{103
{104
te:
dice
javascript
baster
fare
webView.
loadUrl(javascript:...).
final WebView webview = (WebView) rootView.
findViewById(R.id.webView);
//abilitiamo lutilizzo di javascript sulla webview
webview.getSettings().
setJavaScriptEnabled(true);
webview.setWebViewClient(new
WebViewClient(){
@Override
public void onPageFinished(WebView view,
String url) {
//Tramite javascript coloriamo i pulsanti di
rosso
webview.
loadUrl(javascript:document.getElementById(
\button1\).style.
background=#ff0000;document.
getElementById(\button2\)
.style.background=#ff0000;);
super.onPageFinished(view, url);
}
});
//Questo lindirizzo dellarduino
webview.loadUrl(http://192.168.0.119);
return rootView;
}
La nostra Activity risulter essere:
In questo modo abbiamo visto come da codice Android interagire con una pagina web. Nel
caso in cui ci fosse la necessit per una pagina
web di interagire con Android basterebbe definire una classe JavascriptInterface con dei metodi al suo interno e configurarla con la webview
nel seguente modo:
JavascriptInterface javascriptInterface = new JavascriptInterface();
webview.addJavascriptInterface(JavascriptInterfa
ce, jsInterface);
fatto questo baster scrivere da codice javascript sulla pagina html:
jsInterface.metodoNativo();
dove metodoNativo un metodo definito nella classe JavascriptInterface e questo verr
eseguito. possibile inoltre passare dei dati in
input a questo metodo e far restituire dei valori
di ritorno.
Questa tecnica viene spesso usata per lanciare
la fotocamera del telefono da una pagina web.
Conclusioni
In questo articolo abbiamo visto la gesitone da
remoto tramite Android ma un lettore pi perspicace avr capito che sar possibile collegarsi allArduino anche attraverso un normale
browser inserendo semplicemente lindirizzo ip
della scheda e che quindi non necessario sviluppare una nuova app Android ma semplicemente aprire il browser del nostro smartphone
Allegato
Dimensione
ArduinoWebView.zip
38.85 KB
ArduinoWSRele.zip
1.51 KB
Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/corso-su-android-come-collegare-smartphone-android-ad-arduino-ethernet
{105