Button ID während der Laufzeit aus Variable erzeugen

  • 17 Antworten
  • Letztes Antwortdatum
S

Speedy1985

Neues Mitglied
0
Hallo zusammen,

ich möchte dynamisch mehrere Buttons erzeugen. Dies geschieht in einer For-Schleife. Dabei möchte ich die ID anhand der Laufvariable der Schleife durchnummeriert haben. Also:

Code:
buttonsErstellen() {
   for (int i=1 ; i<10 ; i++) {
      Button "Button_"+i = new Button(this);         //Fehler
   }
}

Geht das irgendwie umzusetzen?

Gruß Chris
 
Zuletzt bearbeitet:
Okay, ich hab mich etwas undeutlich ausgedrückt.

Ich möchte einen Button erzeugen, dessen ID sich aus dem String "Button_" und der angehängten Variable i zusammensetzt.
 
Ich würde die Buttons in einer ArrayList speichern.

Gruß

Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
 
Hi Ammy,

welchen Vorteil bringt mir eine ArrayList?
Das Problem ist doch, dass ich den Buttonnamen nicht mit einem String zusammensetzen kann.

Vielleicht versteh ich auch einfach nicht, wie du das meinst.

Gruß Chris
 
Ich bin jetzt am Notebook deswegen kann ich jetzt etwas mehr schreiben ;).

Also ich habe gemeint dass du deine Buttons in eine ArrayList legst:

Zuerst definierst du die ArrayList, so z. B.:
Code:
private ArrayList<Button> myButtons;
@Override
public void onCreate(Bundle savedInstanceState) {
[...]
myButtons = new ArrayList<Button>();
[...]
}


und dann wenn du die Buttons generierst:

Code:
private void buttonsErstellen() {
   for (int i=0 ; i<10 ; i++) {
      myButtons.add(new Button(this));
   }
}

Dann kannst du die Buttons wieder mit der ArrayList und der Nummer ansprechen, wobei der erste Button die Nummer 0 hat, der zweite die 1, usw.

Code:
myButtons.get(0).setText("Hallo!");


Ich hoffe ich habe es richtig verstanden und keinen Tippfehler gemacht ;)

Gruß
 
Zuletzt bearbeitet:
Ammy vielen Dank für die ausführliche Antwort!

Das ist auch eine Möglichkeit um gezielt auf die einzelnen Buttons zuzugreifen, aber wäre da nicht die andere Variante:

button.setId(i);

die einfachere?

Für meinen Fall optimal wäre die Möglichkeit, die Button-ID als String zu belegen anstelle von Integer. Über die Properties geht das doch auch, dann muss man das doch auch programmieren können...

Gruß
 
Ich weiß nicht was du mit den Buttons danach noch anstellen willst. Wenn du auf die Buttons danach wieder zugreifen willst, um z. B. einen Listener zu registrieren oder das Label zu ändern, dann ist meine Lösung besser. Bei deiner Lösung müsstest du, um auf deinen Button zuzugreifen wieder mit findViewById("..."); arbeiten. Dabei muss Android erst den Button "suchen"; das ist zwar recht schnell erledigt, aber bei mehreren Operationen dauert das dann schon unnötig länger. Bei meiner Lösung kann er direkt darauf zugreifen.

Für was willst du dem Button den eine ID geben?
 
Schwer zu erklären, aber ich versuchs trotzdem mal.

Je nach vorheriger Auswahl auf dem Startscreen werden unterschiedliche Buttons erzeugt. Insgesamt sind es 11 Buttons, wobei auf dem zweiten Bildschirm nur zwischen 7 bis 10 davon angezeigt werden.

Anschließend gibt's in der onClick-Methode natürlich eine Abfrage, welche id der button besitzt. Dafür muss der Button eindeutig benannt werden. Das ist er zwar mit 1 bis 9 zb. auch, allerdings weiß ich dann nicht eindeutig, welche Funktion der button hat, da ich im Falle einer anderen Auswahl auf dem Startscreen die Buttons auch wieder mit 1 bis 9 benannt habe, die Nummer 1 in diesem Fall aber eine andere Funktion haben könnte als vorher.

Somit ist die onClick Abfrage nicht eindeutig, wenn ich als id die 1 zurückbekomme.

Dabei fällt mir ein, dass ich den Button doch eigentlich auch über getText() zuordnen könnte oder?

Ich hoffe es war einigermaßen verständlich... ;-)

Gruß
 
du könntest dem Button auch mit setTag("HIER DEIN TAG"); eindeutig identifizieren. Mit (String)getTag(); bekommst du dann wieder dein String zur Identifizierung.

Gruß
 
Super! An die Tags hab ich gar nicht gedacht.

So werd ichs versuchen. Sieht nach der elegantesten Lösung aus denk ich.

Vielen Dank! Ich werde berichten

Gruß Chris

Der ursprüngliche Beitrag von 19:16 Uhr wurde um 20:42 Uhr ergänzt:

Möchte kurz nachfragen, wo ihr eure Bilder hochladet um sie hier einzufügen. Ich hab einen Screenshot gemacht, den ich gern zeigen würde, damit evtl. eine Lösung für ein neues Problem gefunden werden kann.

Das mit dem setTag funktioniert anscheinend. Bei der v.getTag() Verwendung in einer if-Abfrage springt das Prog allerdings noch nicht in den Block, sondern erhält anscheinend ein False zurück.

Mal schauen...
 
Am besten du postest einfach mal die entsprechenden Teile des Java-Codes.

Das mit dem Bilderhochladen habe ich bisher auch noch nicht gemacht, würde es aber in Dropbox oder Google Drive hochladen. Oder, wenn du kein Google/Dropbox-Account hast, halt kostenlose Bilder-Hochlade-Seiten. Einfach mal googlen.

Edit: Ich hab grad entdeckt dass man, wenn man beim Editor auf "Erweitert" klickt, Dateien anfügen kann ;).
 
Zuletzt bearbeitet:
Warum integer verwenden, wenn man auch 10 mal so viele cpu zyklen + speicher belegen kann, indem man strings verwendet?
 
Unnötig viel diskutiert. In meinen links ist auch alles erklärt, was hier besprochen worden ist oO

Gesendet von meinem Nexus 4 mit der Android-Hilfe.de App
 
Problem: ich weiß nicht, warum die im Anhang gezeigt Abfrage ein False zur Folge hat. Das Programm springt jedenfalls nicht in den Block.
 

Anhänge

  • if-Abfrage.png
    if-Abfrage.png
    4,4 KB · Aufrufe: 234
Probier des mal dann klappts denk ich :)

if (Rasse.matches ("Mensch"))
 
Ja damit funktionierts einwandfrei. :-D

Gibt's einen plausiblen Grund, warum die andere Version nicht läuft?
 
Ich bin mir net ganz sicher aber des liegt daran das "String´s" Objekte sind auch wenn man sie nicht mit "new" erzeugt. Bei == vergleichste den Wert von primitiven Datentypen aber bei Objekte ob sie sich auf die gleiche Referenz beziehen.

Da beide Strings nen eigenes Objekt sind musste mit "matches" den Inhalt prüfen damit es klappt.

Bitte berichtigen wenn ich net ganz richtig liege ;)
 
Zurück
Oben Unten