2012-05-15 12 views
7

Soy un principiante de Java y he usado el código siguiente para mostrar una lista de TextViews seleccionables que llaman a una clase específica cuando se hace clic.Android: Looping a través de una matriz de cadenas: ayuda necesaria en la lógica para el método de intención

Es una lista de nombres de equipos de fútbol.

Por ejemplo.

Arsenal Manchester United Chelsea

Al hacer clic en Vista de Texto Arsenal (TextView id = ars) llamará ars.class Al hacer clic en Vista de Texto Chelsea (TextView id = che) llamará che.class

I tener más de 20 nombres de equipos de fútbol.

Tengo una matriz de ids de vistas de texto, que recorro y les doy la posibilidad de hacer clic. Esto funciona bien

Tengo una matriz de cadenas de nombres de equipos, el código recorre la matriz de cadenas y asigna cada nombre de equipo a un objeto de clase, que se utiliza en el método Intent().

Cuando ejecuto este código, la lista se produce pero cuando hago clic en el nombre de un equipo, siempre se abre Wol.java, la última posición en la matriz de cadenas.

Necesito ayuda con la lógica, de modo que cuando hago clic en el Arsenal se abre ars.class

Aquí está el código.

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

¿Estás diciendo seriamente que has creado 20 actividades diferentes, una para cada equipo? ¿Por qué no simplemente tener una 'Activity' (llamada' TeamActivity' por ejemplo) y pasar el nombre del equipo como una cadena 'Extra' en el' Intent' que usas para 'startActivity (...)'? – Squonk

+0

Muy nuevo para el desarrollo de Android, todavía estoy entendiendo el Manifiesto. Sí, he creado 20 actividades separadas en el manifiesto. ¿Podría hacer una actividad de equipo en el manifiesto? – tiptopjat

+0

@tiptopjat Puedes hacer una actividad de equipo en el manifiesto de la misma manera que hiciste las 20 actividades diferentes y luego, como dijo MisterSquonk, simplemente agrega una cadena o int al Intento para diferenciar. – Tushar

Respuesta

5

classname se sobrescribe cada vez que usted repite en el bucle foreach dentro setTeamNames(). Por lo tanto, solo el último nombre de clase permanece al final.

Si teams y teamnames tienen el mismo número de entradas (que deberían), puede usar el siguiente código y deshacerse de setTeamNames() por completo.

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! Gracias, Tushar! :-) El único problema que tengo con esto es la línea 7. Class class = Class.forName (prefix + teamnames [i]); Eclipse dice que no puedo referirme a una variable no final 'i' dentro de una clase interna definida en un método diferente. – tiptopjat

+0

Correcto, lo olvidé. Deberá configurar sus nombres de equipo y prefijo como definitivos o declararlos dentro de la clase OnClickListener(). – Tushar

+0

Gracias por responder de nuevo. 'teamnames' ya es Public Final. Intenté declarar nombres de equipo dentro de la clase OnClickListener(). Todavía no hay alegría. – tiptopjat

1

Suponiendo que las actividades que están tratando de empezar tienen el diseño y la funcionalidad similar (o el mismo) pero muestran diferentes datos específicos de cada equipo, intente lo siguiente.

cambiar su método de onClick(View v) de la siguiente manera ...

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); 
    } 
}); 

luego crear un 'genérico' 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 

    } 
} 

registrate la TeamActivity en su manifiesto y que debe ser bueno para ir.

+0

Gracias por compartir esta solución. Me imagino que la aplicación será más eficiente con este enfoque. He invertido tanto tiempo en mi enfoque que no tengo la energía para comenzar de cero. Lol. – tiptopjat

Cuestiones relacionadas