German Labels / Buttons at runtime einfügen

FlyingEagle

Member
Licensed User
Longtime User
Hallo,

eine vermutlich einfache Geschichte, mir fällt es aber schwer hinter das Geheimnis zu kommen.

Ich füge in einer Schleife Labels/Buttons zur Laufzeit ein, diese per Addview dann einem Panel (auf einer B4XPage).

Panel ist per Code und Designer auf 100%x gesetzt.
Ergibt per Designer geguckt im Eigenschaftenfenster eine Breite von 484.
Per Designer-Script die Breite als Text angezeigt dann 1440 (Handy mit Designer verbunden, Variant = angeschlossenes Gerät).
Per Code abgefragte Breite 1440.

Ich möchte nun dynamisch x-L/B erstellen, diese sollen sich den Platz in der Breite teilen.

Breite_Panel / Anzahl_L/B sollte das ja eigentlich machen, tut es aber nicht (?).

Bspw. kommt da rechnerisch 30 raus, schreibe ich nun l/b.width = 30 kommt ein schmales Objekt raus, schreibe ich l/b.width = 30dip, dann ein deutlich breiteres.

Wo ist der Hund begraben?
 

pucki

Active Member
Licensed User
Longtime User
Ich empfehle dir mal diesen Thread zu lesen.


Der löst so ziemlich alle Probleme.

Grund : Ich mache 2 Designs wenn nötig. Eins hoch + 1 quer. Und immer in der selben Größe. Danach lasse ich die Routinen in diesen Thread laufen und alles ist gut.

Wenn man das per Laufzeit macht, muss man die Daten des Buttons (o.ä.) einfach wissen und sie bei anlegen mit FaktorX+FaktorY (Variablen sie Thread) anpassen.

Das funktioniert immer.

Ich hab die Grundtechnik dazu in VB entwickelt und mit Hilfe der User hier auf Android umgesetzt.
 

Midimaster

Active Member
Licensed User
Mit den direkten Angaben als Zahlen, verwendest Du die wirkliche Auflösung des jeweiligen Gerätes. Ist das Gerät hochauflösend und z.b. 1440pixel breit, dann sind 30 eben sehr schmal, eben gerade mal 2% der Bildschirmbreite. Auf einem Display mit nur 320pix Breite ist alles schon viel größer.

Mit den dip-Angaben als Koordinaten verwendest Du eine virtuelle Auflösung die auf den verschiedenen Geräten nahezu identisch wirkende Elemente ergibt. Ist das Gerät hochauflösend und z.b. 1440pixel breit, dann sind 30dip eben schon viel breiter, weil das Gerät 4x so gut auflöst wie ein "Ur-Display". Auf dem kleinen Display ist der Button jetzt optisch genauso groß wie auf dem großen

Der Vorteil der beiden Möglichkeiten liegt darin, auch im Querformat die gleiche Buttongröße zu erhalten wie im Hochformat. Auch sehen 30dip senkrecht genauso groß aus wie 30dip waagrecht.

Du weißt aber nie, ob deine Button die gesamte Bildschirmbreite füllen. Versuch doch mal mit Prozenzangaben zu arbeiten. Es gibt doch auch diese Möglichkeit:
B4X:
    For i= 0 To 41
        MyButton(i).Initialize("ButtonEvent")
        WoX= i mod 7
        WoY= i / 7
        MyPanel.AddView(MyButton(i), WoX*13%x, WoY*13%y, 12%x, 12%y)
    Next

Du kannst auch wild kombinieren. Also z.b. die Buttons in der Breite mit Prozenzangaben dazu bringen die Bildschirmbreite zu füllen. Mit dips bei den y-Werten zwingst du sie, eine bestimmte lesbaren Größe zu haben:
B4X:
    For i= 0 To 41
        MyButton(i).Initialize("ButtonEvent")
        WoX= i mod 7
        WoY= i / 7
        MyPanel.AddView(MyButton(i), WoX*13%x, WoY*30dip, 12%x, 28dip)
    Next
 
Last edited:

FlyingEagle

Member
Licensed User
Longtime User
Danke für die Hinweise, im Moment - und nach dem ich komplett neu angefangen habe - erscheint es mir als wenn ich irgendwo einen Bug hatte.

Das ganze GUI-Gedöns erschliesst sich mir hier an der Stelle noch nicht völlig, aber denke das es langsam wird.
 
Top