2013-03-19 14 views
13

mam poniżej kod w android programowaniaJak mogę zoptymalizować ten kod, który zawiera pewną powtarzalną linię?

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

I dalej aż btn30
w Pythonie zoptymalizować go pod łatwego kodu

#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 

w Javie programowania w jaki sposób mogę to zrobić? A może Robię to? Istnieje dla niego łatwy kod?

UPDATE 1

więc są dwa sposób to zrobić
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))); 
} 

A Innym sposobem jest GidView
Tanks wszystko.

+0

użytkowania getIdentifier do pisania tego samego kodu w Javie jak w Pythonie –

+0

natknąłem samego problemu, kiedy robił Kółko i krzyżyk gra i miałem do wyboru 9 przycisków. – ShuklaSannidhya

+5

Wskazówka: jeśli używasz 'exec' w wersji Pythona, robisz coś złego. –

Odpowiedz

17

Można utworzyć tablicę z Button i użyć metody getIdentifier, która pozwala uzyskać identyfikator po nazwie.

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

W przypadku gdy ktoś jest zainteresowany jak achive ten sam efekt przy użyciu języka Java tylko

powyżej Rozwiązanie wykorzystuje Android konkretnych metod (takich jak getResources, getIdentifier) i nie może być stosowany w zwykły Java, ale możemy użyć reflection i napisać metodę, która działa jak 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; 
    } 
} 

, a następnie:

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

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

przepraszam za odpowiedź, nie pracuj –

+0

kiedy ją pisz i użyj btn1.setonclick błąd wydania zaćmienia –

+0

@ MM-BB: napisz 'buttons [1] .setonclick' zamiast' btn1.setonclick' dla ustawienia onClick dla pierwszego przycisku dla innych.na przykład: 'buttons [2] .setonclick',' buttons [3] .setonclick', ... –

17

Zamiast optymalizować ten rodzaj kodu, należy ponownie przemyśleć układ. Jeśli masz 30 przycisków na ekranie, prawdopodobnie lepszym rozwiązaniem jest ListView. Możesz uzyskać dostęp do przedmiotów za pośrednictwem indeksu i obsługiwać zdarzenia onClick, podobnie jak przy użyciu przycisków.

+0

twoja odpowiedź jest ok, ale w innym przypadku nie możemy użyć listview –

+7

Mocno wierzę, że nie ma żadnej wymówki, aby użyć 30 przycisków w jednym układzie. Dostępnych jest wiele AdapterViews do wyboru. Niekoniecznie ListView. –

+0

dla przykładu: sprawa, której używamy, jeśli jest powtórzona –

3

Wolę iść z prostego tablicy Button s.

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

Jeśli nadal trzeba zainicjować je findViewById() metody, to będzie brzydki i tak, ale nadal nie będzie tak dużo zgłoszeń, co jest warte rozważenia dla mnie.

5

Jeśli użyć metody z klasy ResourcesgetIndentifier(), Twój kod będzie wyglądać następująco:

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

nadzieję, że to pomaga.

1

Z kodu minum mogę myśleć Chciałbym to zrobić:

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

"Minimalny kod" nie może oznaczać "bez formatowania" – Egor

Powiązane problemy