2012-05-15 15 views
7

Sono un java novice e ho utilizzato il codice seguente per visualizzare un elenco di TextView selezionabili che chiamano una classe specifica quando viene fatto clic.Android: looping attraverso un array di stringhe - aiuto necessario sulla logica per il metodo intent

È un elenco di nomi di squadre di calcio.

Es.

Arsenal Manchester United Chelsea

Cliccando su TextView Arsenal (TextView id = ars) chiamerà ars.class Cliccando su TextView Chelsea (TextView id = che) chiamerà che.class

I avere più di 20 nomi di squadre di calcio.

Ho una matrice di ID di vista testo, che eseguo il ciclo e assegna loro un'azione selezionabile. Funziona bene

Ho una serie di stringhe di nomi di squadra, il codice scorre attraverso l'array di stringhe e assegna ciascun nome di team ad un oggetto di classe, che viene utilizzato nel metodo Intent().

Quando si esegue questo codice, l'elenco viene prodotto ma quando si fa clic su un nome di team si apre sempre Wol.java, l'ultima posizione nell'array di stringhe.

Ho bisogno di aiuto con la logica, in modo che quando clicco su Arsenal si apre ars.class

Ecco il codice.

public final int[] teams = { R.id.ars, R.id.ast, R.id.bir, R.id.bla, 
     R.id.blp, R.id.bol, R.id.che, R.id.eve, R.id.ful, R.id.hul, 
     R.id.lee, R.id.liv, R.id.mid, R.id.mnc, R.id.mnu, R.id.nor, 
     R.id.nwu, R.id.por, R.id.qpr, R.id.sto, R.id.sun, R.id.swa, 
     R.id.tot, R.id.wes, R.id.wig, R.id.wol }; 

    //String array of teamnames, named to correspond their class name. 
public final String[] teamnames = { "ars", "ast", "bir", "bla", "blp", 
     "bol", "che", "eve", "ful", "hul", "lee", "liv", "mid", "mnc", 
     "mnu", "nor", "nwu", "por", "qpr", "sto", "sun", "swa", "tot", 
     "wes", "wig", "wol" }; 

TextView tv; 
Class classname; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.m_transfers); 

    setTeamNames(); //Method sets up team names to a Class name. 

    for (int i = 0; i < teams.length; i++) { 
     tv = (TextView) findViewById(teams[i]); 
     tv.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Intent open = new Intent(Transfers.this, classname); 
       startActivity(open); 
      } 
     }); 
    } 
    ; 
} 

public void setTeamNames() { 
    for (String s : teamnames) { 
     String name = "ttj.android.ft.teams." + s; 

     try { 
      classname = Class.forName(name); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 
    ; 
} 
+0

Stai dicendo seriamente che hai creato 20 attività diverse, una per ogni squadra? Perché non avere solo un 'Activity' (chiamato' TeamActivity' per esempio) e passare il nome del team come una stringa 'Extra' nell'intento' che usi per 'startActivity (...)'? – Squonk

+0

Molto nuovo per lo sviluppo di Android, che continua a farmi vedere il Manifest. Sì, ho creato 20 attività separate nel manifest. Posso creare un'Attività di squadra nel manifest? – tiptopjat

+0

@tiptopjat Potresti creare una TeamActivity nel manifest nello stesso modo in cui hai effettuato le 20 diverse attività e poi, come ha detto MisterSquonk, basta aggiungere una stringa o una int all'Intento per differenziare. – Tushar

risposta

5

classname viene sovrascritto ogni volta di eseguire iterazioni nel ciclo foreach all'interno setTeamNames(). Pertanto, solo l'ultimo nome di classe rimane alla fine.

Se teams e teamnames hanno lo stesso numero di voci (che dovrebbero), è possibile utilizzare il codice seguente ed eliminare completamente setTeamNames().

final String prefix = "ttj.android.ft.teams."; 
for (int i = 0; i < teams.length; i++) { 
    tv = (TextView) findViewById(teams[i]); 
    tv.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
     try { 
      Class class = Class.forName(prefix + teamnames[i]);    
      Intent open = new Intent(Transfers.this, class); 
      startActivity(open); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    }); 
} 
; 
+0

Duh! Grazie Tushar! :-) L'unico problema che ho con questo è la riga 7. Class class = Class.forName (prefisso + teamnames [i]); Eclipse dice che non posso fare riferimento a una variabile non finale 'i' all'interno di una classe interna definita in un metodo diverso. – tiptopjat

+0

Giusto, ho dimenticato. Dovrai impostare i nomi delle tue squadre e il loro prefisso come definitivi o dichiararli all'interno della classe OnClickListener(). – Tushar

+0

Grazie per aver risposto. 'teamnames' è già Public Final. Ho provato a dichiarare i nomi di squadra all'interno della classe OnClickListener(). Ancora nessuna gioia. – tiptopjat

1

Supponendo che le attività che si sta tentando di avviare avere simili (o lo stesso) layout e le funzionalità, ma visualizzare dati diversi specifici per ogni squadra, provare quanto segue.

cambiare il metodo di onClick(View v) come segue ...

tv.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     Intent open = new Intent(Transfers.this, TeamActivity.class); 
     open.putExtra("team", ((TextView)v).getText()); 
     startActivity(open); 
    } 
}); 

quindi creare un 'generico' Activity ...

public class TeamActivity extends Activity { 

    String teamName = ""; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Set the layout here 

     // Get the Intent and team name with the following... 
     teamName = getIntent().getStringExtra("team"); 

     // Do something with teamName 

    } 
} 

Basta registrarsi il TeamActivity nel vostro manifesto e si dovrebbe essere pronti per partire.

+0

Grazie per aver condiviso questa soluzione. Immagino che l'app sarà più efficiente utilizzando questo approccio? Ho investito così tanto tempo nel mio approccio che non ho le energie per ripartire da zero. Lol. – tiptopjat

Problemi correlati