Autore Topic: Activity e Intent in relazione all'EventHandler  (Letto 1488 volte)

Offline powered

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Activity e Intent in relazione all'EventHandler
« il: 24 Agosto 2011, 05:19:56 CEST »
0
Salve a tutti,

 sono nuovo del forum e mi sono messo da pochissimo a smaneggiare con l'sdk di android. Probabilmente la mia domanda sarà stupida e banale per molti di voi, ma ho cercato su google in largo e lungo e non ho trovato una risposta che soddisfacesse il mio problema.
In realta più che un problema pratico è un problema logico, mi spiego meglio.

Da quello che ho letto (e provato), le activity rappresentano oggetti che il sistema android può rappresentare attraverso una UI e che hanno un ciclo di vita scandito da eventi precisi ( vedi tabella ciclo di vita). Essendo gestite da eventi c'e' sicuramente un eventhandler che deve inviare e ricevere i messaggi che passano durante la fase di bubbling. A questo punto entrano in gioco gli Intent che rappresentano una "chiamata di operazione" verso un altra attività delegando un determinato contesto all'oggetto chiamato... fin qua dovrei aver capito tutto giusto.

Il problema sorge ora...

Normalmente quando viene scatenato un evento viene recepito dall'oggetto che poi lo dovrà gestire eseguendo del codice specializzato: per fare un esempio pratico se in una finestra premo un bottone, il suo eventhandler recepisce OnClick ed esegue qualcosa di particolare che può essere legato alla finestra stessa o no. Da quello che ho visto nell'sdk, gli eventi scatenati in una Activity devono assolutamente essere registrati dalla stessa activity per poi eseguire eventualmente codice inerente ad un altro oggetto perchè per simulare il meccanismo delle finestre una volta che ho fatto acquisire l'evento all'oggetto destinatario questo è gia attivato e non può piu eseguire niente.

L'esempio pratico che stavo provando a fare è un'activity con un pulsante che esegue una nuova activity che all'esecuzione cambia il contentView, e l'unico modo che ho trovato per farlo funzionare è appunto di registrare l'evento "click" dalla prima activity e avviare con un intent la seconda, mentre quello che volevo fare era registrare l'evento direttamente nella seconda, gestendo da li il codice necessario.

So che l'esempio è stupido e banale ma mi serve per capire bene il funzionamento di questi oggetti visto che sono il punto nevralgico delle applicazione user friendly :)

Grazie in anticipo a chi mi risponde ( e si legge anche il papiro :P )

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Activity e Intent in relazione all'EventHandler
« Risposta #1 il: 24 Agosto 2011, 08:02:36 CEST »
0
Mi sa che non ho compreso la domanda.

Comunque, tu hai un onClickListener che cattura l'evento di pressione del Button, a quel punto sta a te decidere se avviare una nuova activity o eseguire operazioni su quella corrente.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline powered

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Activity e Intent in relazione all'EventHandler
« Risposta #2 il: 24 Agosto 2011, 08:36:44 CEST »
0
Mi sa che non ho compreso la domanda.

Comunque, tu hai un onClickListener che cattura l'evento di pressione del Button, a quel punto sta a te decidere se avviare una nuova activity o eseguire operazioni su quella corrente.

si questo è corretto se usi una sola Activity.

quello che interessa a me è invece l'uso di due activity diverse la seconda eseguita in seguito alla pressione di un bottone della prima... in parole povere:

1°activity -> click -> 2° activity

quello che mi interessava sapere è come mai il "click" lo devo catturare nella prima activity per eseguire poi la seconda invece di poterlo catturare direttamente nella seconda gestendo direttamente li le cose da fare

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Activity e Intent in relazione all'EventHandler
« Risposta #3 il: 24 Agosto 2011, 09:48:12 CEST »
0
Behtu sei nella prima activity, ed il clic lo fai su un Button della prima activity (la seconda ancora non esiste).

Catturato il clic, con un Intent lanci la seconda activity, e ad esempio passando degli Extra puoi far eseguire delle azioni concettualmente legate al clic sul Button.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline powered

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Activity e Intent in relazione all'EventHandler
« Risposta #4 il: 24 Agosto 2011, 11:16:38 CEST »
0
Behtu sei nella prima activity, ed il clic lo fai su un Button della prima activity (la seconda ancora non esiste).

Catturato il clic, con un Intent lanci la seconda activity, e ad esempio passando degli Extra puoi far eseguire delle azioni concettualmente legate al clic sul Button.

questo mi può anche stare bene, però con lo stesso principio dovrebbe anche funzionare se a raccogliere l'evento fosse una classe esterna ad entrambe le activity richiamando poi la seconda come conseguenza del bubbling... invece non va, anche in questo caso non funziona... quindi l'eventhandler funziona SOLO se usato nella classe che scatena l'evento ?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Activity e Intent in relazione all'EventHandler
« Risposta #5 il: 24 Agosto 2011, 12:15:30 CEST »
0
questo mi può anche stare bene, però con lo stesso principio dovrebbe anche funzionare se a raccogliere l'evento fosse una classe esterna ad entrambe le activity richiamando poi la seconda come conseguenza del bubbling... invece non va, anche in questo caso non funziona... quindi l'eventhandler funziona SOLO se usato nella classe che scatena l'evento ?

Confesso che faccio fatica a comprendere la problematica della classe esterna. Una volta che tu hai creato il ClickListener, lo associ al Button e sarà l'onClick del listener ad essere richiamata in occasione dell'evento.

Andando a memoria, una cosa così:

Codice (Java): [Seleziona]
      OnClickListener MyListener = new OnClickListener() {
         @Override
         public void onClick(View v) {
            launch2ndActivity();
         }
      };

       myBtn.setOnClickListener(MyListener);

Codice (Java): [Seleziona]
   public void launch2ndActivity() {
      Intent myIntent = new Intent(this,2ndActivity.class);
      startActivity(myIntent);
   }
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline powered

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Activity e Intent in relazione all'EventHandler
« Risposta #6 il: 24 Agosto 2011, 12:54:28 CEST »
0
Confesso che faccio fatica a comprendere la problematica della classe esterna. Una volta che tu hai creato il ClickListener, lo associ al Button e sarà l'onClick del listener ad essere richiamata in occasione dell'evento.

Andando a memoria, una cosa così:

Codice (Java): [Seleziona]
      OnClickListener MyListener = new OnClickListener() {
         @Override
         public void onClick(View v) {
            launch2ndActivity();
         }
      };

       myBtn.setOnClickListener(MyListener);

Codice (Java): [Seleziona]
   public void launch2ndActivity() {
      Intent myIntent = new Intent(this,2ndActivity.class);
      startActivity(myIntent);
   }

è solo un problema di logica per comprendere bene cosa si puo e cosa non si puo fare :)
Quel codice li funziona solo se il listener l'hai dichiarato in 1rtActivity perche se fai qualcosa del genere
Codice (Java): [Seleziona]
public class Act1{
View btn = findViewById(@ID);
btn.setOnClickListener(new ExtEventHandler());
}

public class ExtEventHandler implements OnClickListener{
@Override
public void OnClick(View v){
 Intent myIntent = new Intent(v.getContext, Act2.class);
      startActivity(myIntent);
}
}

public class Act2{
//Do something...
}

questo non funziona :/

p..s: non guardare la sintassi del codice, l'ho scritto al volo senza compilarlo, è giusto per dare un idea :/
« Ultima modifica: 24 Agosto 2011, 12:57:14 CEST da powered »

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Activity e Intent in relazione all'EventHandler
« Risposta #7 il: 24 Agosto 2011, 14:33:36 CEST »
0
Il metodo startActivity() fa parte della classe Context, se lanci un'activity fuori da una classe Activity devi settare nell'Intent il flag FLAG_ACTIVITY_NEW_TASK, come descritto dalla documentazione ufficiale : startActivity (Intent intent)

Quindi o passi il context dell'Activity al tuo custom listener, ad esempio implementandolo nel costruttore oppure usi il flag citato sopra.

Offline powered

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Activity e Intent in relazione all'EventHandler
« Risposta #8 il: 24 Agosto 2011, 19:58:37 CEST »
0
Il metodo startActivity() fa parte della classe Context, se lanci un'activity fuori da una classe Activity devi settare nell'Intent il flag FLAG_ACTIVITY_NEW_TASK, come descritto dalla documentazione ufficiale : startActivity (Intent intent)

Quindi o passi il context dell'Activity al tuo custom listener, ad esempio implementandolo nel costruttore oppure usi il flag citato sopra.

mhhh, quindi sostanzialmente l'handling può essere fatto internamente dalla classe generante o esternamente da una classe specifica addetta alla gestione, ma non dala classe che dovra eseguire il codice risultato, giusto ?! ( dai che forse ho capito :P )

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Activity e Intent in relazione all'EventHandler
« Risposta #9 il: 25 Agosto 2011, 08:13:45 CEST »
0
Puoi sempre implementare una nested class (classe annidata) nella tua seconda Activity, quella chiamata, e associare tale classe come listener sul click di un button che si trova nella prima Activity, quella chiamante :

Codice (Java): [Seleziona]
public class Act1 extends Activity{
    View btn = findViewById(@ID);
    btn.setOnClickListener(new Act2.ExtEventHandler(getApplicationContext()));
}

public class Act2 extends Activity{
//Do something...

public static class ExtEventHandler implements OnClickListener{
 
 private Context context ;
 
 public ExtEventHandler(Context c){
     context = c ;
 }

 @Override
 public void OnClick(View v){
    Intent myIntent = new Intent(context, Act2.class);
    context.startActivity(myIntent);
  }
 }
}

Credo posso funzionare :-P
Scusa la domanda, ma perchè vuoi proprio implementare il tutto in questo modo ?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Activity e Intent in relazione all'EventHandler
« Risposta #10 il: 25 Agosto 2011, 08:42:58 CEST »
0
mhhh, quindi sostanzialmente l'handling può essere fatto internamente dalla classe generante o esternamente da una classe specifica addetta alla gestione, ma non dala classe che dovra eseguire il codice risultato, giusto ?! ( dai che forse ho capito :P )

Penso che il punto stia nella frase che ho evidenziato. La classe che deve eseguire il codice risultato è l'activity corrente (quella dove hai messo il Button per intendersi), non quella che lanci. Il fatto che tu voglia associare all'evento il lancio di una seconda activity E l'esecuzione di qualcosa è un'altra questione. Nell'activity 1 se clicchi il Button, l'azione è "lancio della activity 2" e stop. Sta poi alla activity 2 eventualmente fare alto.

E' una concatenazione: evento clic su Button in activity 1 ---> gestito in activity 1 ---> lancio di un evento (startactivity) verso activity 2 ---> lancio activity 2

Oltre all'incubo implementativo, non ha senzo legare il Button nella activity 1 ad un listener contenuto nella activity 2. Le activity sono pensate per comunicare con l'esterno attraverso Intent con eventualmente Extra a corredo.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline powered

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Activity e Intent in relazione all'EventHandler
« Risposta #11 il: 25 Agosto 2011, 09:40:09 CEST »
0
Tutto questo era per capre il sistema con il quale si implementano le cose in android :) Come detto da qualche parte di solito è l'oggeto ricevente ( nel caso specifico il button ) che recepisce l'evento e lo gestisce per conto suo... in questo caso specifico essendo un View deve essere contenuto dentro un activity ( se non ho capito male) quindi mi chiedevo come si replicasse il meccanismo standard :) Il giochino della nested class dovrebbe funzionare ( in realta c'avevo gia provato ma avevo caz***o il context di passaggio, ecco perchè non andava ) ed è esattamente quello che mi chiedevo, in realtà il bubbling degli eventi puo essere tranquillamente trasmesso da un oggetto all'altro come in un qualsiasi sistema ad eventi normale...

Il perchè pratico di tutto questo, oltre che a livello teorico, è per provare a fare un gestore un po diverso delle cose seguendo un progetto che avevo provato a fare sul desktop tempo fa :)

Ovviamente grazie a tutti per le risposte e per gli esempi ;)