German Wie aktiviere ich ein Label in einem anderen Panel?

wbauer

Member
Licensed User
Longtime User
Habe ein Scrollview, in die ich mehrere "Zeilen" mittels eines Array von Panels eingefügt habe. Zeile(1), Zeile(2), .... alles Panels.

Jedes Panel hat mehrere Labels, in denen ich Text anzeige.

Habe nun alle Panels erzeugt und will nun in einem Label eines vorherigen Panels einen Text ändern.

Wie kann ich auf dieses Label in der vorherigen Panel zugreifen?

LG
Wolfgang
 

klaus

Expert
Licensed User
Longtime User

wbauer

Member
Licensed User
Longtime User
Hi Klaus.

Danke für die Antwort - das Beispiel ist die Basis für mein Programm. Bin aber noch ein vollkommener Anfänger in Android, daher versuche ich, hier von der Pike auf das ganze zu lernen.

Das Beispiel ist ziemlich kompliziert - da steig ich noch nicht ganz dahinter.

In meinem Programm sind in jeder Zeile (Panel) mehrere Labels untereinander angebracht, sodass ich z.B. 2 Werte untereinander pro Zeile darstellen kann.

Beispiel, wie mein Layout aussehen soll.

---------------Zeile 1---------------
Label1
Label2
---------------Zeile 2---------------
Label1
Label2
---------------Zeile 3---------------
Label1
Label2
...

Mit GetView gekomme ich die richtige Zeile heraus ... (Habe ich mittels des TAG Feld geprüft)

B4X:
Dim AktZeile as View
AktZeile  = SV.Panel.GetView(2)
So weit, so gut. Jetzt möchte ich in das Label1 in der AktZeile (2. Zeile) einen Wert anzeigen. Dachte, dass ich nun mit Label1.Text = ... den entsprechenden Wert in der Zeile 2 setzen kann.

Tut es aber nicht, er ändert mir den Text von Label1 in der LETZTEN Zeile (also die Zeile, die ich zuletzt mit Initialize angelegt habe)

Wie aktiviere ich also Label1 in der AktZeile?
 

klaus

Expert
Licensed User
Longtime User
Versuche folgendes:
B4X:
Dim AktZeile as View
AktZeile = SV.Panel.GetView(2)
AktZeile.Text = NeuerWert
oder auch direkt:
B4X:
SV.Panel.GetView(2).Text = NeuerWert

AktZeile ist ein View Objekt und entspricht dem Label der zweiten Zeile.
Deshalb musst Du AktZeile.Text = NeuerWert verwnden und nicht Label1.Text ...

Beste Grüsse.
 
Last edited:

wbauer

Member
Licensed User
Longtime User
Hi Klaus.

AktZeile ist ein View Objekt und entspricht dem Label der zweiten Zeile.
Deshalb musst Du AktZeile.Text = NeuerWert verwnden und nicht Label1.Text ...
Dein Tip funktioniert leider nicht, weil AktZeile kein .Text Objekt besitzt.
AktZeile ist meines Verständnisses nach noch nicht der Label, sondern das Panel, in dem ich die Labels dann erzeugt habe.

Ich schick dir mal den vereinfachten Sourcecode (ohne Scrollview...) zu, damit du siehst was ich programmiert habe bzw. wie das Ding reagiert.

Wäre toll, wenn du mir weiterhelfen könntest.

B4X:
'Activity module
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.

End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim Zeile(2) As Panel
    Dim Label1,Label2 As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Erste Zeile erzeugen
    Zeile(0).Initialize ("")
    Zeile(0).Color =Colors.Gray
    Zeile(0).Tag= "Zeile0"    'Info über Zeile merken

    'erstes Textfeld (Label1) in Zeile(0) erzeugen
    Label1.Initialize ("")
    Label1.Text = "Hello World"
    Zeile(0).AddView (Label1, 10, 10, 100, 20)
    'zweites Textfeld (Label1) erzeugen
    Label2.Initialize ("")
    Label2.Text = "This is a test"
    Zeile(0).AddView (Label2, 10, 30, 100, 20)
    'Die erste Zeile in die Activity hängen
    Activity.AddView (Zeile(0), 0,0,200,50)
    
    'Zweite Zeile erzeugen
    Zeile(1).Initialize ("")
    Zeile(1).Color =Colors.Blue
    Zeile(1).Tag= "Zeile1" 'Info über Zeile merken

    'erstes Textfeld (Label1) in Zeile(1) erzeugen
    Label1.Initialize ("")
    Label1.Text = "Bin nun in der"
    Zeile(1).AddView (Label1, 10, 10, 100, 20)
    'zweites Textfeld (Label1) erzeugen
    Label2.Initialize ("")
    Label2.Text = "zweiten Zeile"
    Zeile(1).AddView (Label2, 10, 30, 100, 20)
    'Die erste Zeile in die Activity hängen
    Activity.AddView (Zeile(1), 0,50,200,50)
    
    'Ende der Initialisierungen
    '-----------------------------------------------------------
    'Jetzt soll in Zeile(0) der Text von Label1 geändert werden.
    'Also die Zeile(0) = erste View in der Activity laden
    Dim AktZeile As View 
    AktZeile = Activity.GetView(0)
    'Überprüfen, ob ich wirklich in der Zeile(0) bin (dafür den .TAG der AktView ausgeben)
    Msgbox (AktZeile.Tag, "Aktive Zeile ist...")
    'Stimmt also, bin in Zeile(0)

    'WIE KANN ICH JETZT IN ZEILE(0) IM LABEL1 den Text ändern?
    Label1.Text ="NEUER TEXT"    'das soll der neue Text werden
    'So gehts nicht, weil ich hier immer noch Label1 der ZWEITEN Zeile anspreche!
    
    
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Ich dachte mir, dass ich das Label1 dann auch mit AktZeile.GetView(...) ansprechen könnte, aber AktZeile hat kein GetView
 

wbauer

Member
Licensed User
Longtime User
So, und wie ich das letzte Post geschrieben habe, ist mir die Lösung geschossen.

Ich darf AktZeile nicht als VIEW definieren, sondern als PANEL!!!!!
Dann ist AktZeile ein Panel und hat eine GetView Funktion.
Mit dieser komme ich dann auf die Labels der AktZeile ....

der entsprechende Codeteil sieht also dann so aus ...
B4X:
    'Ende der Initialisierungen
    '-----------------------------------------------------------
    'Jetzt soll in Zeile(0) der Text von Label1 geändert werden.
    'Also die Zeile(0) = erste View in der Activity laden
    Dim AktZeile As Panel
    AktZeile = Activity.GetView(0)
    'Überprüfen, ob ich wirklich in der Zeile(0) bin (dafür den .TAG der AktView ausgeben)
    Msgbox (AktZeile.Tag, "Aktive Zeile ist...")
    'Stimmt also, bin in Zeile(0)
    Dim AktLabel As Label
    AktLabel = AktZeile.GetView (0)
    AktLabel.Text = "Neuer Text"
Und jetzt wird auch der Text im ersten Label der Zeile(0) geändert. Es kann ja so einfach sein!!!!

LG
Wolfgang
 
Top