Autore Topic: Come parametrizzare uno switch  (Letto 479 volte)

Offline chigibi

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows 8.1 Pro
Come parametrizzare uno switch
« il: 23 Novembre 2015, 17:15:59 CET »
0
Premetto che sono alle prime armi con Android Studio.
In una Activity ho un menù con una decina di voci che mi consentono di lanciare altre activity.
Per fare questo ho messo uno switch e quindi in ogni voce mi ritrovo le stesse istruzioni:
Intent Pagina1 = new Intent(this,nomeActivity.class);
startActivity(Pagina1);
Però così il codice mi sembra ridondante. Visto che per ogni voce quello che cambia è il nome dell'intent (Pagina1) e il nome dell'activity da lanciare (nomeActivity.class), c'è il modo di parametrizzare il tutto? Cioè mettendo in due variabili il nome dell'intent e quello dell'activity e lanciando dopo lo switch un qualcosa del tipo:
Intent variabile_pagina = new Intent(this, variabile_activity);
startActivity(variabile_pagina);
Grazie

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Come parametrizzare uno switch
« Risposta #1 il: 24 Novembre 2015, 10:24:03 CET »
0
Se ci sono poche Activity il codice che hai usato va più che bene.
Un'alternativa potrebbe essere tenere una mappa dove associ ad ogni id del menu l'Activity che vuoi lanciare, così l'istruzione diventerebbe:

Intent intent = new Intent(this, mappa.get(menuItem.getId());
startActivity(Intent);

senza switch.

Offline chigibi

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows 8.1 Pro
Re:Come parametrizzare uno switch
« Risposta #2 il: 24 Novembre 2015, 13:18:56 CET »
0
Grazie iClaude, questa soluzione già mi sembra migliore. Le voci del menù sono ora una decina (e potrebbero aumentare) e quindi l'intent ed il lancio lo farei una sola volta. Nel caso precedente avrei dovuto creare 10 intent con nomi diversi.
Quindi mappa dovrebbe essere un array con i nomi delle classi .
E come lo dichiaro e popolo?
Va bene una cosa del tipo:
string mappa[] =  new string[10]
mappa[1] = "act1.class"
mappa[2] = "act2.class"
ecc...

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Come parametrizzare uno switch
« Risposta #3 il: 24 Novembre 2015, 13:40:03 CET »
0
Puoi usare una HashMap di long - Class.

Offline chigibi

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows 8.1 Pro
Re:Come parametrizzare uno switch
« Risposta #4 il: 24 Novembre 2015, 13:56:58 CET »
0
HashMap di long - Class   :D
a saperlo che cos'è....  :-(
proverò a fare qualche ricerca e documentarmi.
Grazie per i tuoi input  :-) e se ti va di darmi qualche suggerimento te ne sono grato.
Ciao

Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Come parametrizzare uno switch
« Risposta #5 il: 24 Novembre 2015, 14:43:56 CET »
0
Map<String,Long> map = new Hashmap<>()

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Come parametrizzare uno switch
« Risposta #6 il: 24 Novembre 2015, 15:07:54 CET »
0
Grazie iClaude, questa soluzione già mi sembra migliore. Le voci del menù sono ora una decina (e potrebbero aumentare) e quindi l'intent ed il lancio lo farei una sola volta. Nel caso precedente avrei dovuto creare 10 intent con nomi diversi.
Quindi mappa dovrebbe essere un array con i nomi delle classi .
E come lo dichiaro e popolo?
Va bene una cosa del tipo:
string mappa[] =  new string[10]
mappa[1] = "act1.class"
mappa[2] = "act2.class"
ecc...

Solo una piccola precisazione, con lo switch crei solo un intent all'interno di ogni case con lo stesso nome ed avvii (startactivity) all'esterno dello switch, es:
Codice: [Seleziona]
Intent pagina = null;
switch (posizione) {
  case 0: pagina = new Intent(this,nomeActivity0.class);
              break;
  case 1: pagina = new Intent(this,nomeActivity1.class);
              break;
  case 2: pagina = new Intent(this,nomeActivity2.class);
              break;
}
startActivity(pagina);

ma la soluzione migliore dipende tutto dalla partenza;  se invece i dati sono in un db fare la creazione dell'hashmap è molto più veloce.
Se la mia risposta ti è utile, per favore un thanks!

Offline chigibi

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows 8.1 Pro
Re:Come parametrizzare uno switch
« Risposta #7 il: 24 Novembre 2015, 15:14:34 CET »
0
Grazie per il tuo suggerimento tonno16, sono andato a vedermi cosa è un' Hashmap e più o meno ho capito cosa è e come implementarla.
Premesso che il mio problema lo avevo già risolto con lo switch ma volevo solo capire se c'era la possibilità di scriverlo in modo meno ridontante e magari con un set di istruzioni riutilizzabili ogni volta che mi trovo di fronte ad una scelta di un menu.
Quello che mi interessa è capire la logica del funzionamento delle cose per cultura e quindi mi chiedo perchè un qualcosa più semplice, di derivazione dalla programmazione tradizionale, non può funzionare.
Nel mio esempio ( a parte errori di sintassi) la logica è questa:
dichiaro un array
inserisco nell'array i nomi delle activity da lanciare
recupero l'id dal menu
creo l'intent
lancio

Es:
string mappa[] =  new string[10]   // definisco l'array
mappa[1] = "act1.class"                //  lo popolo
mappa[2] = "act2.class"
...
...
int id = item.getItemId();                                   // quì andrei a recuperare i progressivo sul menù
Intent pagina = new Intent(this, mappa[id]);    // creo l'intent con il nome che ho inserito nell'array
startActivity(pagina);                                         // lancio la pagina

Questa struttura sarebbe facilmente riutilizzabile. Mi chiedo perchè non funziona? E' un problema di logica o di sintassi?

Post unito: 24 Novembre 2015, 15:19:40 CET
Grazie Lonely, il codice tuo è più snello di quello che uso (è chiaro che mi riferisco a dati statici non recuperati da db, semplici menù di navigazione). Avevo creato n intent perchè quando ho messo lo stesso nome sul secondo mi ha dato un errore (uso Android Studio) ed ho pensato che il nome dovesse essere diverso e quindi anche lo start lo dovevo duplicare. Questo è proprio il motivo del mio tentativo di parametrizzazione.
« Ultima modifica: 24 Novembre 2015, 15:19:40 CET da chigibi, Reason: Merged DoublePost »

Offline addre_91

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One
  • Sistema operativo:
    Windows 7
Re:Come parametrizzare uno switch
« Risposta #8 il: 24 Novembre 2015, 15:57:16 CET »
0
Perchè Intent vuole una classe, non una stringa come secondo parametro.

Andrea

Offline chigibi

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows 8.1 Pro
Re:Come parametrizzare uno switch
« Risposta #9 il: 24 Novembre 2015, 16:24:33 CET »
0
Magari sto dicendo una stupidaggine a causa della mia ignoranza in materia (ma sono qui per imparare), ma non si può creare un array di classi?
Opuure come si fa con alcuni linguaggio con $ oppure & trasformare dinamicamente  il codice?

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Re:Come parametrizzare uno switch
« Risposta #10 il: 24 Novembre 2015, 18:36:34 CET »
0
In questo specifico caso secondo me è meglio lo switch, ti permette inoltre (se fosse necessario) di impostare anche ulteriori parametri da passare all'activity (con i bundle) a seconda della voce del menù.
Se la mia risposta ti è utile, per favore un thanks!

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Come parametrizzare uno switch
« Risposta #11 il: 24 Novembre 2015, 20:11:37 CET »
0
Premesso che il mio problema lo avevo già risolto con lo switch ma volevo solo capire se c'era la possibilità di scriverlo in modo meno ridontante e magari con un set di istruzioni riutilizzabili ogni volta che mi trovo di fronte ad una scelta di un menu.

Un metodo che ho visto spesso utilizzare è questo:
all'interno delle varie Activity o Service che utilizzi nella tua app crei un metodo factory (static factory method pattern) che restituisce l'Intent necessario per avviare quel componente:
Codice (Java): [Seleziona]
    /**
     * Factory method to make the desired Intent.
     */

    public static Intent makeIntent(Context context) {
        // Create the Intent that's associated to the
        // MyActivity class.
        return new Intent(context,
                          MyActivity.class);
    }

quindi per avviare quella activity fai:
Codice (Java): [Seleziona]
startActivity(MyActivity.makeIntent(this)); // this is the Context
ovviamente utilizzando un blocco switch all'interno del metodo che gestisce il menu.

In alternativa puoi anche precaricare una HashMap di long - Intent, dove long sono gli id dei menu e gli Intent sono gli Intent delle varie Activity ottenuti come visto prima.
A quel punto non serve neanche uno switch, fai direttamnete:
Codice (Java): [Seleziona]
startActivity(miaMappa.get(menuItem.getId()));
Ovviamente in questo caso devi precaricare la HashMap e creare in anticipo gli Intent, per cui in un esempio semplice come questo non è una vera semplificazione.

Post unito: 25 Novembre 2015, 14:48:40 CET
Altra soluzione:
1) utilizzi i factory method per creare gli Intent come descritto nel msg precedente
2) in onCreateOptionsMenu ricavi i vari menuItem ed associ ad ognuno di essi l'Intent con il metodo menuItem.setIntent(Intent intent)
3) a questo punto quando clicchi su un menu viene lanciata l'Activity corrispondente, senza bisogno di implementare onOptionsItemSelected
« Ultima modifica: 25 Novembre 2015, 14:48:41 CET da iClaude, Reason: Merged DoublePost »

Offline chigibi

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Sistema operativo:
    Windows 8.1 Pro
Re:Come parametrizzare uno switch
« Risposta #12 il: 25 Novembre 2015, 15:51:19 CET »
0
Come avevo premesso si trattava non di risolvere un problema ma di trovare nuove strade.
Ora ho qualcosa da studiare  :-)
Grazie a tutti per i vostri contributi   ;-)
E spero di disturbarvi ancora....  :D
« Ultima modifica: 25 Novembre 2015, 16:00:38 CET da chigibi »