2011-02-01 22 views
48

Tôi đang tạo một ứng dụng Android, trong đó có chế độ xem bao gồm hàng trăm nút, mỗi nút có một cuộc gọi lại cụ thể. Bây giờ, tôi muốn thiết lập các callbacks này bằng cách sử dụng một vòng lặp, thay vì phải viết hàng trăm dòng mã (cho mỗi một trong các nút).Android: Sử dụng findViewById() với chuỗi/trong vòng lặp

Câu hỏi của tôi là: Làm cách nào tôi có thể sử dụng findViewById mà không phải nhập tĩnh vào từng id nút? Đây là những gì tôi muốn làm:

for(int i=0; i<some_value; i++) { 
     for(int j=0; j<some_other_value; j++) { 
     String buttonID = "btn" + i + "-" + j; 
     buttons[i][j] = ((Button) findViewById(R.id.buttonID)); 
     buttons[i][j].setOnClickListener(this); 
     } 
    } 

Cảm ơn bạn trước!

Trả lời

81

Bạn nên sử dụng getIdentifier()

for(int i=0; i<some_value; i++) { 
    for(int j=0; j<some_other_value; j++) { 
    String buttonID = "btn" + i + "-" + j; 
    int resID = getResources().getIdentifier(buttonID, "id", getPackageName()); 
    buttons[i][j] = ((Button) findViewById(resID)); 
    buttons[i][j].setOnClickListener(this); 
    } 
} 
+0

Cảm ơn, đó là những gì tôi đang tìm kiếm. – user573536

+21

"com.sample.project" có thể được thay thế bằng getPackageName(). – jenzz

+0

Tôi đã nhìn thấy các câu trả lời khác rất giống với câu trả lời này, nhưng arg thứ hai là "id" là điều cuối cùng tôi cần để nó hoạt động. –

3

Bạn có thể thử làm một int [] chứa tất cả các ID nút bấm của bạn, và sau đó lặp qua rằng:

int[] buttonIDs = new int[] {R.id.button1ID, R.id.button2ID, R.id.button3ID, ... } 

for(int i=0; i<buttonIDs.length; i++) { 
    Button b = (Button) findViewById(buttonIDs[i]); 
    b.setOnClickListener(this); 
} 
3
+1

@ user573536 lưu ý rằng sử dụng 'getResources(). GetIdentifier()' trong một vòng lặp có thể làm giảm hiệu suất khi bạn có một số lượng lớn tra cứu. –

+0

Bạn nói đúng. Tôi khuyên bạn nên tiếp cận chỉ khi có một trình tự hoặc thứ tự cho các nguồn lực VÀ có rất nhiều người trong số họ (tạo ra một mảng của 50 tài nguyên có mùi). – Cristian

1

bạn có thể sử dụng thẻ nếu bạn muốn truy cập.

trong onClick

int i=Integer.parseInt(v.getTag); 

Nhưng bạn không thể truy cập vào nút đó như thế này.

chỉ cần tạo nút programatically

bởi

0

tạo Custom Button trong mã java thay vì trong Xml như tôi trình bày dưới đây

Button bs_text[]= new Button[some_value]; 

    for(int z=0;z<some_value;z++) 
     { 
      try 
      { 

      bs_text[z] = (Button) new Button(this); 

      } 
      catch(ArrayIndexOutOfBoundsException e) 
      { 
       Log.d("ArrayIndexOutOfBoundsException",e.toString()); 
      } 
     } 
0

Nếu chế độ xem cấp cao nhất của bạn chỉ có những người lượt xem tấn như trẻ em, bạn có thể làm

for (int i = 0 ; i < yourView.getChildCount(); i++) { 
    Button b = (Button) yourView.getChildAt(i); 
    b.setOnClickListener(xxxx); 
} 

Nếu có nhiều lượt xem hơn, bạn cần kiểm tra xem nút đã chọn có phải là một trong các nút hay không.

+0

bạn có biết hiệu suất so sánh với các phương pháp được đề xuất khác không? Tôi giả sử rằng nó hơi chậm hơn một mảng ID, nhưng tôi muốn biết làm thế nào nó so sánh với 'getResources(). GetIdentifier()'. –

+0

Không xin lỗi. Một cái nhìn biết con cái của mình, vì vậy tôi không nghĩ rằng nó là quá xấu. –

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