2012-05-15 28 views
7

Tôi là một người mới sử dụng Java và tôi đã sử dụng mã bên dưới để hiển thị danh sách các TextView có thể nhấp được gọi là lớp cụ thể khi chúng được nhấp.Android: Looping thông qua một mảng chuỗi - trợ giúp cần thiết về logic cho phương pháp ý định

Đây là danh sách tên nhóm bóng đá.

Ví dụ:

Arsenal Manchester United Chelsea

Nhấp vào TextView Arsenal (TextView id = ars) sẽ gọi ars.class Nhấp vào TextView Chelsea (TextView id = che) sẽ gọi che.class

tôi có hơn 20 tên đội bóng.

Tôi có một mảng id văn bản, mà tôi lặp lại và gán cho họ một hành động có thể nhấp. Điều này hoạt động tốt.

Tôi có một chuỗi chuỗi tên nhóm, mã lặp qua mảng chuỗi và gán mỗi tên nhóm cho đối tượng Lớp, được sử dụng trong phương thức Intent().

Khi tôi chạy mã này, danh sách được tạo nhưng khi tôi nhấp vào tên nhóm, nó luôn mở Wol.java, vị trí cuối cùng trong mảng chuỗi.

Tôi cần trợ giúp về logic, để khi tôi nhấp vào Arsenal, nó sẽ mở ra ars.class

Đây là mã.

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

Bạn đang nghiêm túc nói rằng bạn đã tạo 20 Hoạt động khác nhau, một hoạt động cho mỗi nhóm? Tại sao không chỉ có một 'Activity' (được gọi là' TeamActivity' chẳng hạn) và chuyển tên nhóm thành một chuỗi 'Extra' trong' Intent' mà bạn sử dụng cho 'startActivity (...)'? – Squonk

+0

Rất mới để phát triển android, vẫn nhận được đầu của tôi xung quanh Manifest. Có, tôi đã tạo 20 hoạt động riêng biệt trong tệp kê khai. Tôi có thể tạo TeamActivity trong tệp kê khai không? – tiptopjat

+0

@tiptopjat Bạn có thể làm cho một TeamActivity trong tệp kê khai giống như cách bạn đã thực hiện 20 hoạt động khác nhau và sau đó, như MisterSquonk đã nói, chỉ cần thêm một chuỗi hoặc int vào Intent để phân biệt. – Tushar

Trả lời

5

classname đã được ghi đè mỗi khi bạn lặp trong vòng lặp foreach bên setTeamNames(). Vì vậy, chỉ có tên lớp cuối cùng vẫn còn ở cuối.

Nếu teamsteamnames có cùng số lượng mục nhập (mà chúng nên), bạn có thể sử dụng mã sau và loại bỏ hoàn toàn 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! Cảm ơn Tushar! :-) Chỉ có vấn đề tôi có với điều này là dòng 7. Class class = Class.forName (prefix + teamnames [i]); Eclipse nói rằng tôi không thể tham chiếu đến biến không phải cuối cùng 'i' bên trong một lớp bên trong được định nghĩa trong một phương thức khác. – tiptopjat

+0

Phải, tôi quên mất. Bạn sẽ phải đặt tên nhóm và tiền tố của bạn là cuối cùng hoặc khai báo chúng bên trong lớp OnClickListener(). – Tushar

+0

Cảm ơn bạn đã trả lời lại. 'tên nhóm' đã là Chung kết công khai. Tôi đã thử khai báo tên nhóm trong lớp OnClickListener(). Vẫn không có niềm vui. – tiptopjat

1

Giả sử các hoạt động bạn đang cố gắng bắt đầu có bố cục và chức năng tương tự (hoặc giống nhau) nhưng hiển thị dữ liệu khác nhau cụ thể cho từng nhóm, hãy thử như sau.

Thay đổi phương pháp onClick(View v) của bạn như sau ...

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

Sau đó tạo một 'chung' 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 

    } 
} 

Chỉ cần đăng ký TeamActivity trong biểu hiện của bạn và bạn sẽ được tốt để đi.

+0

Cảm ơn bạn đã chia sẻ giải pháp này. Tôi tưởng tượng ứng dụng sẽ hiệu quả hơn khi sử dụng phương pháp này? Tôi đã đầu tư quá nhiều thời gian vào cách tiếp cận của mình, tôi không có năng lượng để bắt đầu từ đầu. Lol. – tiptopjat

Các vấn đề liên quan