Le forme allotropiche del C-Palestini e Pancia.docx
Programmazione mobile: ANDROID
1. ITIS Max Planck di Lancenigo diVillorba (TV)
A.S. 2013-2014
Prof. PAOLOTOSATO
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Programmazione mobile: ANDROID
Seconda lezione: attività e layout
2. 23/04/2014 2
• Le attività
• Layout
• In Java
• InXML
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Indice
3. 23/04/2014 3
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Le attività
Componenti di un’applicazione Android che
fanno uso del display e che
interagiscono con l’utente (~ finestra).
Classe che estende android.app.Activity.
Hanno carattere di esclusività: soltanto
un’attività alla volta può occupare il
display.
La distruzione delle attività è
completamente demandata al sistema:
si possono ibernare ma non chiudere.
4. 23/04/2014 4
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Le attività
Metodi di Activity eseguiti durante i passaggi di stato di un’attività
package esempi.ciaomondo;
import android.util.Log;
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// …
}
protected void onRestart() {
super.onRestart();
Log.i("Activity", "Richiamato onRestart()");
}
protected void onStart() {
super.onStart();
Log.i("Activity", "Richiamato onStart()");
}
protected void onResume() {
super.onResume();
Log.i("Activity", "Richiamato onResume()");
}
protected void onPause() {
super.onPause();
Log.i("Activity", "Richiamato onPause()");
}
protected void onStop() {
super.onStop();
Log.i("Activity", "Richiamato onStop()");
}
protected void onDestroy() {
super.onDestroy();
Log.i("Activity", "Richiamato onDestroy()");
}
}
5. 23/04/2014 5
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Le attività
Esempio sotto-attività: attività principale
public class MainActivity extends Activity implementsOnClickListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("Lancia Sotto-attività");
button.setOnClickListener(this);
setContentView(button);
}
public void onClick(View v) {
Intent intent = new Intent(this, SubActivity.class);
startActivity(intent);
}
}
6. 23/04/2014 6
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Le attività
Esempio sotto-attività: attività secondaria
public class SubActivity extends Activity implements OnClickListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("TerminaSotto-attività");
button.setOnClickListener(this);
setContentView(button);
}
public void onClick(View v) {
finish();
}
}
7. 23/04/2014 7
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Le attività
Esempio sotto-attività: descrittore dell’applicazione (AndroidManifest.xml)
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="esempi.ciaomondo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SubActivity"
android:label="@string/app_name" />
</application>
Intent: descrizione di
un’operazione che deve
essere eseguita.
Le attività, attraverso un
intent-filter, possono
essere attivate in risposta
ad uno specifico evento.
Gli intent-filter accettano
figli di tre tipi: action,
category, data.
8. 23/04/2014 8
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Le attività
Valore di ritorno di una sotto-attività: attività principale
public class MainActivity extends Activity implementsOnClickListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("Lancia Sotto-attività");
button.setOnClickListener(this);
setContentView(button);
}
public void onClick(View v) {
Intent intent = new Intent(this, SubActivity.class);
// Il secondo parametro è un intero che rappresenta
// il codice della richiesta
startActivityForResult(intent, 10);
}
9. Le attività
23/04/2014 9
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Valore di ritorno di una sotto-attività: attività principale
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 10) {
if (resultCode == 0) {
Log.i("Sotto-attività","Interruzioneprima di setResult");
} else if (resultCode == 1) {
Log.i("Sotto-attività","Risultato ottenuto correttamente");
Log.i("Sotto-attività","Messaggio: " + data.getStringExtra("messaggio"));
Log.i("Sotto-attività","Cliccato: " + data.getBooleanExtra("cliccato", false));
SimpleDateFormat f = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.ITALY);
Date d = new Date(data.getLongExtra("timestamp", 0));
Log.i("Sotto-attività","Timestamp: " + f.format(d));
}
}
}
}
10. 23/04/2014 10
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Le attività
Valore di ritorno di una sotto-attività: attività secondaria
public class SubActivity extends Activity implements OnClickListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("TerminaSotto-attività");
button.setOnClickListener(this);
setContentView(button);
}
11. 23/04/2014 11
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Le attività
Valore di ritorno di una sotto-attività: attività secondaria
public void onClick(View v) {
Intent data = new Intent();
data.putExtra("messaggio", "Tutto ok!");
data.putExtra("cliccato", true);
data.putExtra("timestamp", System.currentTimeMillis());
// Il primo parametro è un intero che rappresenta
// l'identificativo del risultato (0 se non viene chiamato setResult).
// Il secondo parametro può mancare ed è un Intent, il quale
// contiene un dizionario chiave-valore (null se assente).
setResult(1, data);
finish();
}
}
12. 23/04/2014 12
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Layout - Java
I componenti View estendono tutti la classe base
android.view.View.
Per mostrare sullo schermo l’oggetto View specificato:
setContentView(View view).
Tutti i widget richiedono, nei loro costruttori, un oggetto
che estenda la classe astratta android.content.Context
(Activity estende indirettamente Context).
Pacchetto android.widget
• TextView - setText()
• EditText - getText()
• Button - setText()
• ImageView - setImageResource()
• ImageButton -
setImageResource()
• CheckBox - setText()
• RadioButton/RadioGroup
• ToggleButton (on/off)
• DatePicker - getDayOfMonth(),
getMonth(), getYear().
• TimePicker - getCurrentHour(),
getCurrentMinute().
• AnalogClock/DigitalClock
13. Layout - Java
23/04/2014 13
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Layout: ViewGroup utilizzabili per posizionare i widget sullo schermo
Pacchetto android.widget
• FrameLayout: allinea il widget in alto a sinistra e lo estende per tutta la dimensione
disponibile al layout stesso.
• RelativeLayout: per default, il componente aggiunto viene allineato in alto a sinistra
(dimensioni reali). E' possibile controllare l’allineamento attraverso setGravity().
• LinearLayout: il suo orientamento può essere stabilito chiamando il metodo
setOrientation(), con argomento pari a LinearLayout.HORIZONTAL o
LinearLayout.VERTICAL.Se si va di poco oltre la dimensione della riga, il sistema tenta
un aggiustamento restringendo i componenti al di sotto delle loro dimensioni ideali.
• TableLayout: permette di sistemare i componenti secondo uno schema a tabella. I
TableLayout vanno costruiti aggiungendo al loro interno degli oggetti TableRow.
14. Layout - Java
23/04/2014 14
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
TextView label1 = newTextView(this);
label1.setText("Nome:");
EditText edit1 = new EditText(this);
TextView label2 = new TextView(this);
label2.setText("Cognome:");
EditText edit2 = new EditText(this);
TextView label3 = newTextView(this);
label3.setText("Sesso:");
RadioButtonradio1 = new RadioButton(this);
radio1.setText("M");
RadioButtonradio2 = new RadioButton(this);
radio2.setText("F");
RadioGroup radioGroup1 = new RadioGroup(this);
radioGroup1.setOrientation(LinearLayout.HORIZONTAL);
radioGroup1.setGravity(Gravity.CENTER);
radioGroup1.addView(radio1);
radioGroup1.addView(radio2);
radioGroup1.check(radio1.getId());
15. Layout - Java
23/04/2014 15
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Button button1 = new Button(this);
button1.setText("Salva");
Button button2 = new Button(this);
button2.setText("Annulla");
TableRow row1 = newTableRow(this);
row1.setGravity(Gravity.CENTER);
row1.addView(label1);
row1.addView(edit1);
TableRow row2 = newTableRow(this);
row2.setGravity(Gravity.CENTER);
row2.addView(label2);
row2.addView(edit2);
TableRow row3 = newTableRow(this);
row3.setGravity(Gravity.CENTER);
row3.addView(label3);
row3.addView(radioGroup1);
16. Layout - Java
23/04/2014 16
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
TableLayout tableLayout = newTableLayout(this);
tableLayout.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP);
tableLayout.addView(row1);
tableLayout.addView(row2);
tableLayout.addView(row3);
tableLayout.setColumnShrinkable(0, true);
tableLayout.setColumnStretchable(1, true);
LinearLayout linearLayout1 = new LinearLayout(this);
linearLayout1.setGravity(Gravity.CENTER);
linearLayout1.setOrientation(LinearLayout.HORIZONTAL);
linearLayout1.addView(button1);
linearLayout1.addView(button2);
LinearLayout linearLayout2 = new LinearLayout(this);
linearLayout2.setGravity(Gravity.CENTER);
linearLayout2.setOrientation(LinearLayout.VERTICAL);
linearLayout2.setPadding(5, 5, 5, 5);
linearLayout2.addView(tableLayout);
linearLayout2.addView(linearLayout1);
setContentView(linearLayout2);
17. Layout - XML
23/04/2014 17
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Editor basato su XML
res/layout contiene le descrizioni dei layout e dei widget che saranno
poi usati in una o più attività dell’applicazione.
Per richiamare un layout XML: setContentView(R.layout.main);
18. Layout - XML
23/04/2014 18
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
19. Layout - XML
23/04/2014 19
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
<?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:gravity="center"
android:orientation="vertical"
android:padding="5dp" >
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top|center_horizontal"
android:shrinkColumns="0"
android:stretchColumns="1" >
<TableRow
android:id="@+id/tableRow1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="fill_horizontal|center_vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="fill_horizontal|center_vertical"
android:text="Nome" />
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="match_parent">
<requestFocus />
</EditText>
</TableRow>
<TableRow
android:id="@+id/tableRow2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="fill_horizontal|center_vertical" >
20. Layout - XML
23/04/2014 20
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="fill_horizontal|center_vertical"
android:text="Cognome" />
<EditText
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</TableRow>
<TableRow
android:id="@+id/tableRow3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="fill_horizontal|center_vertical" >
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="fill_horizontal|center_vertical"
android:text="Sesso" />
<RadioGroup
android:id="@+id/radioGroup1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checkedButton="0"
android:gravity="center"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/radio0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="M" />
21. 23/04/2014 21
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Layout - XML
<RadioButton
android:id="@+id/radio1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="F" />
</RadioGroup>
</TableRow>
</TableLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Salva" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Annulla" />
</LinearLayout>
</LinearLayout>
22. Layout - XML
23/04/2014 22
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
A ogni componente nel file XML è possibile assegnare un ID
@+nomeGruppo/nomeId
In Java è possibile richiamare il componente e modificarlo
R.nomeGruppo.nomeId
Esempio:
Button button = (Button) findViewById(R.id.button2);
Attributi obbligatori: layout_width e layout_height
• wrap_content: rende il componente grande tanto quanto impongono i suoi
sotto-componenti.
• match_parent: allarga il componente fino a fargli occupare tutto lo spazio
concessogli dal suo contenitore d’ordine superiore.
23. 23/04/2014 23
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
To be continued …