2016-03-25 8 views
1

Ich versuche, ein Schachspiel für Android zu erstellen und möchte vermeiden, jede Schaltfläche deklarieren zu müssen, wenn sie alle ähnlich benannt sind. Ich habe versucht, alle die A + Num-Taste mit dieser For-Schleife zu generieren.Android: Verbinden von Knöpfen mit der Java-Datei durch eine for-Schleife

int RowNum ; 
for (RowNum = 1; RowNum < 8; RowNum++) { 
    String Position = "A" + RowNum; 
    Button Position = (Button)findViewById(R.id.Position); 
} 

Aber ich habe einen Fehler: Variable 'Position' ist bereits im Bereich definiert.

Ich würde wirklich schätzen, wenn mir jemand den besten Weg erklären könnte, dies zu tun.

Vielen Dank im Voraus.

Antwort

0

R.Id.A1, R.ID.A2 usw. sind identifiers und jeder von ihnen wird während der Kompilierung der R-Klasse einer einzigen ganzen Zahl zugeordnet. Daher können Sie die 'R.id.sth' nicht als Zeichenfolge bearbeiten, da sie nicht ordnungsgemäß kompiliert wird.

Ein Weg, das zu lösen, ist die Suche nach der Zeichenfolge in Ressourcen dynamisch mit einem Code wie folgt aus:

Button[] buttons=new Button[8]; 
for(int RowNum=0; RowNum<8; RowNum++) { 
    String buttonID = "A"+(RowNum+1); 
    int resID = getResources().getIdentifier(buttonID, "id", getPackageName()); 
    buttons[RowNum] = ((Button) findViewById(resID)); 
} 

Alternativ können Sie den Zeitaufwand der dynamischen Suche vermeiden Sie eine Ressource-Array hinzufügen:

int[] butIds = {R.id.A1, R.id.A2,...}; 

Button[] buttons= new Button[8]; 
    for(int RowNum=0; RowNum<8, RowNum++) { 
     buttons[RowNum]= ((Button) findViewById(butIds[RowNum])); 
} 

Sie können das Ressourcen-Array sogar im XML-Format speichern und es als TypedArray abrufen.

+1

Danke, ich habe etwas ähnliches versucht, aber ich konnte es nicht zur Arbeit bringen, welches, basierend auf dem, was du gezeigt hast, ich realisiert habe, warum ich sie am Ende manuell erstellt habe, aber ich könnte zurückgehen und dies umsetzen. Danke noch einmal! – BlackSpark

0

Sie nannten Ihre StringundButton Objekt beide Position. Geben Sie ihnen verschiedene Namen, z. Ich erhalte

for (int RowNum = 1; RowNum < 8; RowNum++) { 
    String currentPosition = "A" + RowNum; 
    //Why doesn this not use the Position (now 'currentPosition' variable)? 
    Button currentButton = (Button)findViewById(R.id.Position); 
} 

semantisch noch nicht das Stück Code, weil Position nicht im Argument von findViewById verwendet wird, zu dem Sie eine statische Variable R.id.Position passieren.

+0

Ich verstehe nicht, wie dies separate Referenzen erzeugt, wenn der Wert von currentButton nicht ändert, da dies der Name der Referenz sein wird? – BlackSpark

+0

Alles, was ich tun möchte, ist die Schaltfläche mit dem Namen Position erstellen, und es wird mit der Schaltfläche in der XML verknüpft, die den gleichen Namen hat, I.E. – BlackSpark

+0

Schaltfläche A1 = (Schaltfläche) findViewById (R.id.A1); – BlackSpark