Programmazione mobile: ANDROID

23
ITIS Max Planck di Lancenigo di Villorba (TV) A.S. 2013-2014 Prof. PAOLO TOSATO 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

description

Seconda lezione: attività e layout

Transcript of Programmazione mobile: ANDROID

Page 1: Programmazione mobile: ANDROID

ITIS Max Planck di Lancenigo di Villorba (TV) A.S. 2013-2014

Prof. PAOLO TOSATO

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

Page 2: Programmazione mobile: ANDROID

23/04/2014 2

• Le attività

• Layout

• In Java

• In XML

Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.

Indice

Page 3: Programmazione mobile: ANDROID

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.

Page 4: Programmazione mobile: ANDROID

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()"); } }

Page 5: Programmazione mobile: ANDROID

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 implements OnClickListener {

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); } }

Page 6: Programmazione mobile: ANDROID

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("Termina Sotto-attività"); button.setOnClickListener(this); setContentView(button); }

public void onClick(View v) { finish(); } }

Page 7: Programmazione mobile: ANDROID

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.

Page 8: Programmazione mobile: ANDROID

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 implements OnClickListener {

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); }

Page 9: Programmazione mobile: ANDROID

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à","Interruzione prima 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)); } } } }

Page 10: Programmazione mobile: ANDROID

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("Termina Sotto-attività"); button.setOnClickListener(this); setContentView(button); }

Page 11: Programmazione mobile: ANDROID

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(); } }

Page 12: Programmazione mobile: ANDROID

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

Page 13: Programmazione mobile: ANDROID

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.

Page 14: Programmazione mobile: ANDROID

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 = new TextView(this); label1.setText("Nome:"); EditText edit1 = new EditText(this); TextView label2 = new TextView(this); label2.setText("Cognome:"); EditText edit2 = new EditText(this); TextView label3 = new TextView(this); label3.setText("Sesso:"); RadioButton radio1 = new RadioButton(this); radio1.setText("M"); RadioButton radio2 = 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());

Page 15: Programmazione mobile: ANDROID

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 = new TableRow(this); row1.setGravity(Gravity.CENTER); row1.addView(label1); row1.addView(edit1); TableRow row2 = new TableRow(this); row2.setGravity(Gravity.CENTER); row2.addView(label2); row2.addView(edit2); TableRow row3 = new TableRow(this); row3.setGravity(Gravity.CENTER); row3.addView(label3); row3.addView(radioGroup1);

Page 16: Programmazione mobile: ANDROID

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 = new TableLayout(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);

Page 17: Programmazione mobile: ANDROID

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);

Page 18: Programmazione mobile: ANDROID

Layout - XML

23/04/2014 18 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.

Page 19: Programmazione mobile: ANDROID

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" >

Page 20: Programmazione mobile: ANDROID

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" />

Page 21: Programmazione mobile: ANDROID

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>

Page 22: Programmazione mobile: ANDROID

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.

Page 23: Programmazione mobile: ANDROID

23/04/2014 23 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.

To be continued …