programmazione mobile: android
Post on 09-Dec-2014
339 Views
Preview:
DESCRIPTION
TRANSCRIPT
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
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
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.
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()"); } }
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); } }
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(); } }
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.
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); }
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)); } } } }
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); }
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(); } }
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
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.
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());
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);
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);
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);
Layout - XML
23/04/2014 18 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
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" >
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" />
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>
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/04/2014 23 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
To be continued …
top related