2013-03-19 56 views
13

tôi có dưới đây mã trong lập trình androidLàm thế nào tôi có thể tối ưu hóa mã này có chứa một số dòng lặp đi lặp lại?

Button btn1 = (Button) findViewById(R.id.btn1); 
Button btn2 = (Button) findViewById(R.id.btn2); 
Button btn3 = (Button) findViewById(R.id.btn3); 
Button btn4 = (Button) findViewById(R.id.btn4); 
Button btn5 = (Button) findViewById(R.id.btn5); 
Button btn6 = (Button) findViewById(R.id.btn6); 
Button btn7 = (Button) findViewById(R.id.btn7); 
Button btn8 = (Button) findViewById(R.id.btn8); 
Button btn9 = (Button) findViewById(R.id.btn9); 

Và nó tiếp tục cho đến khi btn30
Trong python tôi tối ưu hóa nó bằng mã bên dưới dễ dàng

#is a python syntax (for_statement) 
#python work by tab 
for i in range(1,31): 
    #in python not need to declare temp 
    temp="""Button btn"""+str(i)+"""=(Button)findViewById(R.id.btn"""+str(i)+""")""" 
    exec(temp)#a default function in python 

Trong java lập trình làm thế nào tôi có thể làm điều đó? Hoặc có thể Tôi làm điều đó? Có tồn tại một mã dễ dàng cho nó?

UPDATE 1

SO có hai cách để làm điều đó
Code 1:

final int number = 30; 
final Button[] buttons = new Button[number]; 
final Resources resources = getResources(); 

for (int i = 0; i < number; i++) { 
    final String name = "btn" + (i + 1); 
    final int id = resources.getIdentifier(name, "id", getPackageName()); 

    buttons[i] = (Button) findViewById(id); 
} 

Code 2:

public static int getIdByName(final String name) { 
    try { 
     final Field field = R.id.class.getDeclaredField(name); 

     field.setAccessible(true); 
     return field.getInt(null); 
    } catch (Exception ignore) { 
     return -1; 
    } 
} 

final Button[] buttons = new Button[30]; 

for (int i = 0; i < buttons.length; i++) { 
    buttons[i] = (Button) findViewById(getIdByName("btn" + (i + 1))); 
} 

Và khác cách là GidView
Tanks All.

+0

sử dụng getIdentifier để viết cùng mã trong java như trong python –

+0

tôi đi qua cùng một vấn đề khi tôi đã thực hiện một Tic-Tac-Toe và tôi có 9 nút để xử lý. – ShuklaSannidhya

+5

Gợi ý: Nếu bạn đang sử dụng 'exec' trong phiên bản Python, thì bạn đang làm sai điều gì đó. –

Trả lời

17

Bạn có thể tạo một mảng của Button và sử dụng phương pháp getIdentifier cho phép bạn nhận mã nhận diện theo tên của nó.

final int number = 30; 
final Button[] buttons = new Button[number]; 
final Resources resources = getResources(); 

for (int i = 0; i < number; i++) { 
    final String name = "btn" + (i + 1); 
    final int id = resources.getIdentifier(name, "id", getPackageName()); 

    buttons[i] = (Button) findViewById(id); 
} 

Trong trường hợp ai đó đang quan tâm làm thế nào để đạt được kết quả tương tự sử dụng Java chỉ

Các giải pháp trên sử dụng Android phương pháp cụ thể (chẳng hạn như getResources, getIdentifier) và không thể được sử dụng trong thông thường Java, nhưng chúng tôi có thể sử dụng số reflection và viết phương thức hoạt động như getIdentifier:

public static int getIdByName(final String name) { 
    try { 
     final Field field = R.id.class.getDeclaredField(name); 

     field.setAccessible(true); 
     return field.getInt(null); 
    } catch (Exception ignore) { 
     return -1; 
    } 
} 

Và sau đó:

final Button[] buttons = new Button[30]; 

for (int i = 0; i < buttons.length; i++) { 
    buttons[i] = (Button) findViewById(getIdByName("btn" + (i + 1))); 
} 
+0

xin lỗi câu trả lời của bạn không hoạt động –

+0

khi viết và sử dụng btn1.setonclick eclipse phát hành lỗi –

+0

@ MM-BB: ghi 'nút [1] .setonclick' thay vì' btn1.setonclick' để thiết lập onClick listener cho nút đầu tiên giống nhau cho những người khác. Ví dụ: 'buttons [2] .setonclick',' buttons [3] .setonclick', ... –

17

Thay vì tối ưu hóa loại mã này, bạn nên suy nghĩ lại bố cục của mình. Nếu bạn có 30 nút trên màn hình, một ListView có lẽ là giải pháp tốt hơn. Bạn có thể truy cập các mục qua chỉ mục và xử lý các sự kiện onClick giống như với các nút.

+0

câu trả lời của bạn là ok nhưng trong trường hợp khác mà chúng tôi không thể sử dụng listview –

+7

Tôi mạnh mẽ tin rằng không có lý do gì cả để sử dụng 30 nút trong một bố cục duy nhất. Có rất nhiều AdapterViews có sẵn để lựa chọn. Không nhất thiết là một ListView. –

+0

cho ví dụ: trường hợp chúng tôi sử dụng một số nếu đó là lặp lại –

3

Tôi muốn sử dụng một mảng đơn giản là Button s.

// Just a simple code 
Button [] buttons = new Button[30]; 
for(int i = 0; i < 30; i++) 
{ 
    buttons[i] = new Button(); 
} 

Nếu bạn vẫn cần phải khởi tạo chúng với findViewById() phương pháp, nó sẽ xấu xí dù sao, nhưng vẫn sẽ không có quá nhiều tờ khai, đó là giá trị xem xét cho tôi.

5

Nếu bạn sử dụng phương pháp getIndentifier() từ lớp Resources, mã của bạn sẽ trông như thế này:

Button[] buttons = new Button[10]; 
for (int i = 0; i < buttons.size; i++) { 
    int id = getResources().getIdentifier("btn" + (i + 1), "id", <your-package-name>); 
    buttons[i] = (Button) findViewById(id); 
} 

Hope this helps.

1

Với mã minum tôi có thể nghĩ tôi sẽ làm điều này:

Button[]btn=new Button[30]; 
    for (int i=0;i<btn.length;i++) btn[i] = (Button) findViewById(getResources().getIdentifier("btn"+(i+1),"id", "yourpackage")); 
+10

"Mã tối thiểu" không được có nghĩa là "không có định dạng" – Egor

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