2012-05-15 14 views
7

Jestem nowicjuszem java i korzystam z poniższego kodu, aby wyświetlić listę klikalnych widoków tekstowych, które wywołują określoną klasę po ich kliknięciu.Android: Pętla przez tablicę znaków - pomoc potrzebna w logice do metody intencji

To jest lista nazw drużyn piłkarskich.

Np.

Arsenal Manchester United Chelsea

Kliknięcie TextView Arsenalem (TextView id = ars) wezwie ars.class klikając na TextView Chelsea (TextView id = che) wezwie che.class

I mieć ponad 20 nazw drużyn piłkarskich.

Mam tablicę identyfikatorów tekstowych, które przeglądam i przypisuję im klikalne działanie. To działa dobrze.

Mam tablicę łańcuchową nazw drużyn, pętle kodu poprzez tablicę ciągów znaków i przypisują każdą nazwę drużyny do obiektu klasy, który jest używany w metodzie Intent().

Po uruchomieniu tego kodu lista jest tworzona, ale po kliknięciu nazwy zespołu zawsze otwiera Wol.java, ostatnia pozycja w tablicy ciągów.

Potrzebuję pomocy z logiką, tak że po kliknięciu na Arsenal otwiera ars.class

Oto kod.

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

Czy naprawdę twierdzisz, że stworzyłeś 20 różnych działań, po jednej dla każdego zespołu? Dlaczego po prostu nie mieć jednego "Activity" (na przykład "TeamActivity") i przekazać nazwę zespołu jako ciąg 'Extra' w' Intent' używanym dla 'startActivity (...)'? – Squonk

+0

Bardzo nowość w rozwoju Androida, wciąż mam głowę wokół Manifestu. Tak, utworzyłem 20 oddzielnych działań w manifeście. Czy mogę utworzyć TeamActivity w manifeście? – tiptopjat

+0

@tiptopjat Możesz utworzyć jedną Aktywność zespołu w manifeście w ten sam sposób, w jaki wykonałeś 20 różnych czynności, a następnie, jak powiedział MisterSquonk, po prostu dodaj ciąg lub int do intencji, aby się rozróżnić. – Tushar

Odpowiedz

5

classname jest zastępowane za każdym razem, gdy iterację w pętli foreach wewnątrz setTeamNames(). Tak więc na końcu pozostaje tylko ostatnia nazwa klasy.

Jeśli teams i mają taką samą liczbę wpisów (które powinny), możesz użyć poniższego kodu i całkowicie pozbyć się 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! Dzięki Tushar! :-) Jedyny problem z tym związany to linia 7. Class class = Class.forName (prefix + nazwa drużyny [i]); Eclipse mówi, że nie mogę odnieść się do nieostatniej zmiennej "i" wewnątrz wewnętrznej klasy zdefiniowanej w innej metodzie. – tiptopjat

+0

Dobrze, zapomniałem. Musisz ustawić nazwy zespołów i prefiks jako ostateczne lub zadeklarować je w klasie OnClickListener(). – Tushar

+0

Dzięki za odpowiedź. "teamnames" jest już Public Final. Próbowałem już zadeklarować nazwy zespołów wewnątrz klasy OnClickListener(). Wciąż nie ma radości. – tiptopjat

1

Zakładając działalność ty próbujesz uruchomić mają podobną (lub sam) układ i funkcjonalność ale wyświetlać różne dane specyficzne dla każdej drużyny, spróbuj wykonać następujące czynności.

zmienić metodę onClick(View v) następująco ...

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

następnie utworzyć 'rodzajowe' 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 

    } 
} 

Wystarczy zarejestrować TeamActivity w swoim manifeście i powinno być dobrze udać się.

+0

Dziękujemy za udostępnienie tego rozwiązania. Wyobrażam sobie, że aplikacja będzie bardziej wydajna przy użyciu tego podejścia? Zainwestowałem tyle czasu w moje podejście, że nie mam energii, aby zacząć od zera. Lol. – tiptopjat

Powiązane problemy