Richiamare un'Activity da un'altra pagina con Intent
In questo tutorial vedremo uno dei primi importanti meccanismi per animare un pò le nostre app e riuscire così a passare da una pagina ad un'altra, sulla base di un click o tocco fatto su di un bottone.
Nel tutorial precedente, abbiamo visto come rendere "intelligente" un bottone inserito in un apposito layout, in modo che al verificarsi di un certo evento, il CLICK o tocco, accada qualcosa. Questo qualcosa potrebbe essere ad esempio l'apertura di una nuova pagina, quindi l'attivazione di una nuova Activity.
Cosa imparerai
- Imparerai uno dei concetti più importanti di Android ossia l'uso di Intent
- Imparerai a passare da una Activity ad un'altra e a gestirle in modo corretto nel file manifest.xml
Ipotizzando allora di aver già creato questa seconda Activity e di averla chiamata "Page1.java" (vedi il tutorial: Le pagine web in Android: Activity) e ipotizzando che questa Activity mostri, tramite setContentView() un layout progettato in precedenza con all'interno un testo, un campo di input e un bottone, il passo successivo sara' quello di completare il codice da inserire all'interno del metodo startActivity() visto nel tutorial precedente.
Definire la seconda Activity Page1.java
Giusto per avere del codice da usare per ricreare l'esempio, potremmo definire il layout che mostrera' la nostra Activity di nome Page1.java, in questo modo:
<?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|top" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:clickable="false" android:text="@string/page_top" android:textSize="20dp" /> <EditText android:id="@+id/editText1" android:layout_width="234dp" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:ems="10" android:hint="Enter your Birthdate" > <requestFocus /> </EditText> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Submit" /> </LinearLayout>
mentre a livello di codice java, non faremo altro che richiamare il solito metodo setContentView()
public class Page1 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.page1); } }
Attivare elementi della nostra app con Intent()
Una delle operazioni che spesso dovrai fare all'interno di una app in Android, è richiamare una nuova Activity. Ebbene in Android hanno sviluppato un meccanismo molto semplice, che non solo permette di attivare ogni componente di una applicazione, quindi anche una Activity, ma in generale di trasmettere delle informazioni tra componenti e di farli comunicare l'uno con l'altro o con altre applicazioni.
Basti pensare ad esempio a quello che succede non appena si riceve una chiamata al telefono. Il sistema attiva una applicazione che mostra all'utente un layout con il numero del chiamante e una serie di pulsanti per rispondere.
Questo meccanismo base prende il nome di Intent() e possiamo pensarlo come ad una "Intenzione" di fare qualcosa.
Attivare e collegare una seconda Activity
Ora che sappiamo che istruzioni usare per richiamare una Activity dal codice, ossia usando startActivity(), vediamo come usare gli Intent per attivare a tutti gli effetti la nostra Activity.
// definisco l'intenzione di aprire l'Activity "Page1.java" Intent openPage1 = new Intent(MainActivity.this,Page1.class);
Ho definito una variabile di tipo Intent con nome openPage1, che mi servira' poi all'interno di startActivity(). All'interno delle parentesi di Intent ho inserito due parametri, il primo che identifica l'attuale Activity (nota la presenza della parola .this finale), mentre il secondo che identifica l'activity che vorremmo richiamare (nota la presenza della parola .class finale).
Questo tipo di chiamata al nostro Intent si dice esplicita, in quanto diciamo proprio noi che tipo di activity lanciare.
// definisco l'intenzione di aprire l'Activity "Page1.java" Intent openPage1 = new Intent(MainActivity.this,Page1.class); // passo all'attivazione dell'activity page1.java startActivity(openPage1);
Pertanto riprendendo il codice visto nel precedente tutorial, potremmo concludere l'esempio:
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btnHome=(Button)findViewById(R.id.Button1); btnHome.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { // definisco l'intenzione Intent openPage1 = new Intent(MainActivity.this,Pagina1.class); // passo all'attivazione dell'activity Pagina.java startActivity(openPage1); } }); } }
Cosa succederà allora non appena l'utente cliccherà sul bottone identificato dall'id "Button1"?
- Il gestore di evento riconosce il verificarsi di un click
- Fa partire le istruzioni presenti dentro al gestore onClick
- Esprimo la mia intenzione di attivare una Activity di nome "Pagina1"
- Faccio partire l'activity con startActivity()
- "Magicamente" appare sullo schermo il nuovo layout, che oscura il precedente.
Se tutto è corretto, in teoria l'utente dovrebbe visualizzare sullo schermo proprio il layout definity nell'istruzione setContentView() dell'activity di nome "Page1".
NB: In realtà se testiamo il tutto, potrebbe verificarsi un errore. E questo perchè ogni Activity (classe), che andiamo a definire all'interno della cartella "src>java" deve essere anche "registrata" all'interno del file AndroidManifest.xml.
Quindi nel nostro caso io mi aspetto che sia presente un nodo <activity> con definito all'interno il nome del file java aggiunto in precedenza, ossia il quello con nome "Pagina1".
In teoria questo avviene in automatico non appena aggiungiamo una nuova activity in Visual Studio, ma se non dovesse accadere, dobbiamo farlo manualmente andando all'interno del file androidmanifest.xml, con il doppio click, poi selezionando la scheda "Application" (solo su Eclipse, altrimenti su Android Studio lo dovrai fare manualmente) e tra i nodi presenti aggiungere "Add", cliccare sulla scheda "Application" e poi selezionare il nome dell'Activity aggiunta, completa di percorso, e un'etichetta.
La classe Intent nella realtà ha molte capacità, come quella di passare dei parametri alla seconda Activity, oppure quella di far comunicare due applicazioni diverse e molto altri ancora che inizieremo ad esplorare in uno dei prossimi tutorial.
2024-12-13 Tipo/Autore: Davide Copelli {ing} Pubblicato da: CorsoAndroid.it