Tutorial

Creare la prima App (Continuazione)

Avviare un'altra Activity

Gestore dell'evento Touch sul pulsante.

  1. Nella cartella res/layout modificare il file activity_main.xml.

  2. Aggiungere l'attributo android:onClick all'elemento <Button>.

res/layout/activity_my.xml

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

Il valore "sendMessage" dell'attributo android:onClick é il nome di un metodo contenuto nell'activity che il sistema operativo richiama quando l'utente tocca il pulsante.

Nella cartella del progetto, aprire il file MyActivity.java.

All'interno della classe MyActivity aggiungere il metodo sendMessage():

MyActivity.java

/** Richiamato quando l'utente tocca il pulsante Invia */
public void sendMessage(View view) {
    // Operazioni da eseguire per gestire l'evento onTouch
}

Affinchè il sistema riconosca questo metodo come quello specificato nel valore dell'attributo android:onClick, la firma (la dichiarazione) deve essere esattamente identica a quella mostrata. Cioè il metodo deve:

Il compito di questo metodo consiste nel leggere il contenuto della casella di testo e consegnarlo ad un'altra activity.

Costruire un Intent

Nel file MyActivity.java all'interno del metodo sendMessage() creare un Intent per avviare un'activity denominata DisplayMessageActivity contenente le seguenti istruzioni:

/MyActivity.java

public void sendMessage(View view) {
  Intent intent = new Intent(this, DisplayMessageActivity.class);
}

Intent

Un Intent é un oggetto che fornisce il collegamento tra componenti separati (ad esempio due activity). Un Intent può essere usato per molti scopi. In genere vengono usati per avviare un0altra activity.

Nota: Il riferimento a DisplayMessageActivity genera un errore perché la classe non esiste. Per il momento, ignorare l'errore.

Il costruttore usato richiede due parametri:

L'ambiente di sviluppo, Android Studio, suggerisce di importare la classe Intent.

Nella sezione di intestazione del file importare la classe Intent:

/MyActivity.java

import android.content.Intent;

Suggerimento: premere Alt + Invio per importare le classi mancanti.

All'interno del metodo sendMessage() usare findViewById() per ottenere un riferimento all'elemento EditText.

/MyActivity.java

public void sendMessage(View view) {
  Intent intent = new Intent(this, DisplayMessageActivity.class);
  EditText editText = (EditText) findViewById(R.id.edit_message);
}

Nella sezione import, del file, importare la classe EditText.

Assegnare il testo alla variabile locale message, ed usare il metodo putExtra() per aggiungere il testo all'intent.

/MyActivity.java

public void sendMessage(View view) {
  Intent intent = new Intent(this, DisplayMessageActivity.class);
  EditText editText = (EditText) findViewById(R.id.edit_message);
  String message = editText.getText().toString();
  intent.putExtra(EXTRA_MESSAGE, message);
}

Un Intent porta i dati nella forma di una coppia Chiave-Valore chiamata extra.

Il metodo putExtra() riceve la chiave come primo parametro e il valore come secondo parametro.

Nella sezione proprietà della classe MyActivity inserire la definizione della costante EXTRA_MESSAGE:

/MyActivity.java

public class MyActivity extends ActionBarActivity {
  public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE";
    ...
}

Affinché la nuova activity possa interrogare i dati extra si deve definire la chiave usando una costante pubblica.
Per convenzione le chiavi vengono definite anteponendo il nome del package dell'applicazione come prefisso.
In questo modo si assicura che il nome di una chiave sia univoco.
Nel metodo sendMessage(), per completare l'intent, richiamare il metodo startActivity() passando l'oggetto Intent.

Il metodo completo sendMessage() richiamato dal pulsante è il seguente:

/MyActivity.java

/** Richiamato quando l'utente preme il pulsante Invia */
public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
  EditText editText = (EditText) findViewById(R.id.edit_message);
  String message = editText.getText().toString();
  intent.putExtra(EXTRA_MESSAGE, message);
  startActivity(intent);
}

Il sistema operativo riceve questa chiamata ed avvia un'istanza dell'Activity specificata dall'Intent.

A questo punto si deve creare la classe DisplayMessageActivity.

Creare la Seconda Activity

Tutte le sottoclassi di Activity devono ridefinire il metodo onCreate(). Questo è il metodo dell'activity, a cui il sistema operativo consegna il messaggio dell'Intent, e che quindi provvede ad elaborarlo. Inoltre, il metodo onCreate() deve definire il layout con il metodo setContentView(). Questo metodo si occupa di impostare i componenti dell'activity.

Creare una nuova activity

Quando si crea una nuova activity, l'ambiente di sviluppo fornisce un prototipo del metodo onCreate().

Nella casella del progetto, Clic destro sul nome del package. Dal menu contestuale selezionare New > Activity > Blank Activity.

Completare i dettagli dell'activity:

  Activity Name: DisplayMessageActivity
  Layout Name: activity_display_message
  Title: My Message
  Hierarchical Parent: com.mycompany.myfirstapp.MyActivity
  Package name: com.mycompany.myfirstapp

Premere il pulsante Finish.

Aprire il file DisplayMessageActivity.java.

La classe già contiene un'implementazione del metodo onCreate(). Questo metodo verrà completato in un momento successivo. Contiene anche l'implementazione del metodo onOptionsItemSelected().

Cancellare il metodo onCreateOptionsMenu().

A questo punto l'app può essere eseguita per verificare la preseza di errori, ma non succede niente. Cliccando il pulsante Invia si apre la seconda activity, che usa il layout di default "Hello world" fornito dal modello.

Creare l'activity senza l'ambiente di sviluppo Android Studio

Creare un nuovo file denominato DisplayMessageActivity.java nella cartella src/ del progetto, accanto al file MyActivity.java.

Inserire il seguente codice:

public class DisplayMessageActivity extends ActionBarActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_display_message);
  
     if (savedInstanceState == null) {
     getSupportFragmentManager().beginTransaction()
     .add(R.id.container, new PlaceholderFragment()).commit();
     }
   }

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
     // Handle action bar item clicks here. The action bar will
     // automatically handle clicks on the Home/Up button, so long
     // as you specify a parent activity in AndroidManifest.xml.
     int id = item.getItemId();
     if (id == R.id.action_settings) {
       return true;
     }
     return super.onOptionsItemSelected(item);
     }
  
   /**
   * A placeholder fragment containing a simple view.
   */
   public static class PlaceholderFragment extends Fragment {
  
    public PlaceholderFragment() { }
  
   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
     Bundle savedInstanceState) {
       View rootView = inflater.inflate(R.layout.fragment_display_message,
       container, false);
       return rootView;
       }
     }
   }
  

Nel file strings.xml aggiungere il titolo dell'activity:

<resources>
   ...
   <string name="title_activity_display_message">My Message</string>
</resources>

Nel file manifest, AndroidManifest.xml, all'interno dell'elemento Application, aggiungere l'elemento <activity> per la classe DisplayMessageActivity:

  <application ... >
  ...
  <activity
  android:name="com.mycompany.myfirstapp.DisplayMessageActivity"
  android:label="@string/title_activity_display_message"
  android:parentActivityName="com.mycompany.myfirstapp.MyActivity" >
  <meta-data
  android:name="android.support.PARENT_ACTIVITY"
  android:value="com.mycompany.myfirstapp.MyActivity" />
  </activity>
  </application>

L'attributo android:parentActivityName dichiara il nome del padre dell'activity. Il sistema operativo usa questo valore per implementare il comportamento di default per la navigazione.

Ricevere l'Intent

Ogni Activity è richiamata da un Intent, indipendentemente da come l'utente abbia navigato. Per conoscere quale Intent ha avviato l'activity si deve richiamare getIntent() e accedere ai dati contenuti nell'intent.

Modificare il file DisplayMessageActivity.java.

Nel metodo onCreate() eliminare la seguente linea:

  setContentView(R.layout.activity_display_message);

Leggere l'intent ed assegnare il valore ad una variabile locale:

  Intent intent = getIntent();

Nella sezione superiore del file importare la classe Intent

Estrarre il messaggio consegnato da MyActivity con il metodo getStringExtra()

.
  String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);

Mostrare il messaggio

Nel metodo onCreate() creare un oggetto TextView.

  TextView textView = new TextView(this);

Fissare la dimensione del carattere e del messaggio:

  textView.setTextSize(40);
  textView.setText(message);

Aggiungere un elemento TextView come vista radice del layout dell'activity€passandolo a setContentView().

  setContentView(textView);

Importare la classe TextView.

Il metodo completo onCreate() per la classe DisplayMessageActivity:

  @Override
  public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
  
   // Get the message from the intent
   Intent intent = getIntent();
   String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);
  
   // Create the text view
   TextView textView = new TextView(this);
   textView.setTextSize(40);
   textView.setText(message);
  
   // Set the text view as the activity layout
   setContentView(textView);
  }

Eseguire l'app. Quando si apre, scrivere un messaggio, premere il pulsante Invia, il messaggio viene mostrato nella seconda activity.