German ScrollView mit Panels, Buttons, Labels und Imageview

oliver1983

Member
Licensed User
Longtime User
Hi,

klasse Forum weiter so...

So nun zu meinem Problem. In meiner App wird eine ScrollView mit Panels, Buttons, Labels und Imageview dynamisch bestückt, wie im Tutorial. Nur das meine Daten aus einer CSV Datei kommen.
Klappt auch alles. Die Buttons kann ich auch ansprechen und funktionen ausführen, soviel dazu.

Nun ist ein Panel welches beim erstellen nicht sichtbar
B4X:
      PanelHol.Initialize("PanelHol")
      Panel1.AddView(PanelHol,75dip,60dip,ScrollView1.Width,60dip)
      PanelHol.Tag = "PanelHol_"&i
      PanelHol.Color = Colors.Red

Nun möchte ich bei einem klick auf ein Button bzw. Imageview ( ICON) gleicher eintrag in der Scrollview, das das Panel angezeigt wird.
B4X:
Sub img_status_Click
    'Using Sender we find the button that raised this event
    Dim b As ImageView
    b = Sender
    Dim btag As String
    btag = b.Tag
    Msgbox(btag,"")
  
    If btag.StartsWith("Img_Status_") Then
      Msgbox("ich wurde geklickt","")
      
      Dim i As Int
       i = btag.SubString(10) 'lösche "Img_Status_" aus dem Tag string, damit der Index der Device liste vorhanden ist
      
      Dim panelholv As Panel
      panelholv.GetView
      Panel = panelhol.Tag
      paanelhol() = 
   
   
   End If

End Sub
Mein Problem ist aber wie spreche ich das Panel an?

Gruß Olli
 
Last edited:

klaus

Expert
Licensed User
Longtime User
Hallo Olli,
Willkommen im Forum.

Wie ist das ScrollView.Panel aufgebaut ?
Oder anders ausgedückt was ist die Reihenfolge in welcher Du die verschiedenen Views in das ScrollView.Panel hinzu fügst ?
Haben Alle Einträge den gleichen Aufbau ?
Alle Views die hinzugefügt werden haben einen Index in der Reihenfolge in der sie hinzugefügt sind.
Erster Index ist 0.
Du kannst eine Referenz zu den Views mit ScrollView1.Panel.GetView(Index) bekommen.
Das heisst, Du kannst zum Beispiel ein Panel mit dem Index 3 mit folgendem Code zurück bekommen.
B4X:
Dim pnl As Panel
pnl = ScrollView1.Panel.GetView(3)
pnl.Visible = xxx
Wenn Du willst kannst Du dein Projekt als zip Datei (IDE Menü File / Export As Zip) hier im Forum posten und Ich schau mal rein.

Beste Grüsse.
 

oliver1983

Member
Licensed User
Longtime User
ist wohl einfacher ich hänge das Projekt an. Das mit den GetView hatte ich auch schon in betracht gezogen.

so ich hab selber mal probiert

B4X:
   Dim pnl As Panel
   Dim pn2 As Panel
pnl = ScrollView1.Panel.GetView(0)
Msgbox(pnl.tag,"")
pn2 = pnl.getview(0)
Msgbox(pn2.tag,"")
allerdings bekomme ich immer das gleiche ergebniss
 

Attachments

  • forum-hilfe.zip
    28.6 KB · Views: 289
Last edited:

klaus

Expert
Licensed User
Longtime User
Ich kann das Programm leider nicht testen wegen fehlender device.csv Datei.
Ich habe mir den Aufbau des ScrollView.Panels angeschaut:
Du hast für jeden Eintrag ein Panel1 das in ScrollView.Panel hinzugefügt wird.
Das heisst ScrollView.Panel kennt nur diese Panesl als Views.
Dann bekommst Du mit
ScrollView.Panel.GetView(0) das erste Panel1
ScrollView.Panel.GetView(1) das zweite Panel1
ScrollView.Panel.GetView(2) das dritte Panel1

unw.

Alle anderen Views werden auf Panel1 hinzugefügt ausser den Buttons.
Das heisst Du musst zuerst mit
Dim pnl As Panel
pnl = ScrollView.Panel.GetView(n)

das Panel1 mit Index n bekommen.

Dann bekommst Du mit
Dim pnlhol As Panel
pnlhol = pnl.GetView(0) PanelHol
pnl.GetView(1) Label1
pnl.GetView(2) ImageView1
pnl.GetView(3) Label3
pnl.GetView(4) Label4


Und mit
pnlhol.GetView(0) Btn_Standby
pnlhol.GetView(1) Btn_Hibernate
pnlhol.GetView(2) Btn_Off


Du muust aber für alle Views des gleichen Eintrages das Index als Tag Eigenschaft zustellen.
Damit Du weisst welchem Eintrag die View gehört.
Dann mit dem oben stehenden kannst Du jede View erreichen.
Du könntes auch die Tageigenschaft kombinieren mit Index und einer anderen Information.

Hoffe das hift Dir weiter.

Beste Grüsse.
 
Last edited:

oliver1983

Member
Licensed User
Longtime User
wäre es einfacher wenn ich erst alle Einträge aus der device.csv auslese, angenommen es sind 4 das ich mit
B4X:
dim pnl(4) as Panel
arbeite?
B4X:
   Dim panels(3) As Panel
   For i = 0 To panels.Length - 1
      panels(i).Initialize("panels")
 

oliver1983

Member
Licensed User
Longtime User
Du muust aber für alle Views des gleichen Eintrages das Index als Tag Eigenschaft zustellen.
Damit Du weisst welchem Eintrag die View gehört.
Dann mit dem oben stehenden kannst Du jede View erreichen.
Du könntes auch die Tageigenschaft kombinieren mit Index und einer anderen Information.

Wie kann ich denn beim erstellen den index in den Tag reinschreiben?
 

klaus

Expert
Licensed User
Longtime User
Ja das geht auch, aber mit Dim panels(4) As Panel da Du ja 4 Panels in Deinem Beispiel hast.
Das gleiche könntest Du auch mit den anderen Views machen.

Du brauchst nicht unbedingt alle Einträge vorher auslesen, ausser Du weisst nicht wie viele es sind.

Beste Grüsse.
 

oliver1983

Member
Licensed User
Longtime User
so jetzt habe ich alle nochmal umgeschrieben, nun ist mir aber aufgefallen das ich weder den visible status noch das panel mit Getview anzeigen bzw. verschieben kann, schlicht gesagt es tut sich nichts, obwohl ich das panel richtig anspreche!
 

oliver1983

Member
Licensed User
Longtime User
hier mein projekt die device.csv kannst du mit den einstellung erstellen
 

Attachments

  • forum-hilfe.zip
    28.7 KB · Views: 267

klaus

Expert
Licensed User
Longtime User
Beiliegend findest Du eine geänderte Version.

Habe einiges geändert.
- FillScrollView geändert
- Sub img_status_Click Routine geändert
- FillScrollView von Activity_Resume weggenommen.

Trotz einer richtigen Anzeige funktionierte das Programm nicht wie es sollte bis Ich nach etwas Zeit rausgefunden habe dass Du FillScrollView zwei mal aufgerufen hattest, in Activity_Create und Activity_Resume !?
Du darfst diese Routine nur einmal aufrufen.

Beste Grüsse.
 

Attachments

  • forum-hilfe_1.zip
    28.6 KB · Views: 298

oliver1983

Member
Licensed User
Longtime User
und ich dachte ich wäre blöd :D Vielen Dank

Aber wenn ich das aus der resume raus nehme und in die Einstellung gehe, dann wieder zurück ist die liste leer, bzw. soll die liste neu gefüllt werden!!!

Oder wie rufe ich am besten die einstellung seite auf ?

Habe dein Programm noch nicht getestet, mache ich aber heute abend

gruß olli
 

klaus

Expert
Licensed User
Longtime User
Wenn Du das wirklich brauchst kannst Du folgendes machen:
FillScrollView nach Activizy_Resume verschieben.

Und in FillScrollView Panel0.RemoveAllViews einfügen:
B4X:
    Panel0=ScrollView1.Panel
    Panel0.RemoveAllViews
    Panel0.Color=Colors.Gray
Beste Grüsse.
 

Attachments

  • forum-hilfe_2.zip
    28.6 KB · Views: 274
Top