German ScrollView Position nach Formatwechsel wieder herstellen?

Petrus

Member
Licensed User
Longtime User
Hallo Leute,
ich möchte die ScrollView-Position nach dem Wechsel zwischen Quer- und Hochformat wieder herstellen. Ich speichere die Position bei Activity_Pause und stelle sie bei Activity_Resume wieder ein. Das Problem ist nur, dass manchmal bei Formatwechsel Pause/Create/Resume zweimal hintereinander aufgerufen wird, wodurch das dann nicht mehr funktioniert:

** Activity (main) Pause, UserClosed = false **
** Activity (main) Create, isFirst = false **
** Activity (main) Resume **
** Activity (main) Pause, UserClosed = false **
** Activity (main) Create, isFirst = false **
** Activity (main) Resume **

Ist das nur auf dem Emulator so, oder auch sonst? Gibt es dafür eine Lösung?

Gruß
Petrus
 

klaus

Expert
Licensed User
Longtime User
B4X:
Das Problem ist nur, dass manchmal bei Formatwechsel Pause/Create/Resume  zweimal hintereinander aufgerufen wird, wodurch das dann nicht mehr  funktioniert:
Kannst Du das genauer erklähren, kommt mir etwas komisch vor und Ich sehe nicht warum die ScrollPosition geändert würde.
Kannst Du Dein Projekt als zip Datei posten, dann könnten wir sehen was wo wie gemacht ist.

Beste Grüsse.
 

Petrus

Member
Licensed User
Longtime User
Hallo Klaus,
anbei ein Testprojekt mit einer ScrollView-Liste, bei dem das Problem auftritt. Wenn ich mit Strg+F11 die Orientation von Landscape zu Portrait wechsle, dann wird Pause/Create/Resume zweimal hintereinander aufgerufen (eigenartiger Weise).

Beim ersten Event Activity_Pause kann ich die Scrollposition auswerten. Beim zweiten Mal ist das ScrollView aber noch garnicht so weit, sodass die Scrollposition (fast) immer 0 ist. Manchmal geht es, aber meistens nicht.

B4X:
Sub Process_Globals
   Dim svTopIndex, ItemHo As Int
End Sub

Sub Globals
   Dim ScrollView1 As ScrollView
End Sub

Sub Activity_Create(FirstTime As Boolean)
   Dim x, Ho, Br, PosY, ZCount As Int

   'Einrichten:
   Activity.Title = "TestScrollViewPos"
   Ho = Activity.Height
   Br = Activity.Width
   ItemHo = 30dip
   ZCount = 200
   
   Activity.LoadLayout("Layout01")
   ScrollView1.SetLayout(0, 0, Br, Ho)
   ScrollView1.Panel.Height = ItemHo * ZCount
   
   For x = 0 To ZCount -1
      Dim Label0 As Label
      Label0.Initialize("")
      Label0.Color = Colors.Black
      Label0.Text = "Zeile " & x
      ScrollView1.Panel.AddView(Label0, 0, PosY, Br, ItemHo -1dip)
      PosY = PosY + ItemHo
   Next
End Sub

Sub Activity_Resume
   'TopIndex wieder herstellen:
   DoEvents
   ScrollView1.ScrollPosition =  svTopIndex * ItemHo
End Sub

Sub Activity_Pause (UserClosed As Boolean)
   'TopIndex festhalten:
   svTopIndex = (ScrollView1.ScrollPosition / ItemHo)
End Sub

Viele Grüße
Peter
 

Attachments

  • TestScrollViewPos.zip
    6.6 KB · Views: 292

Petrus

Member
Licensed User
Longtime User
Leider nicht immer - trotzdem vielen Dank! Ich habe gerade noch eine Idee gehabt, die scheinbar klappt - ich überprüfe bei Activity_Pause ob sich die Orientation geändert hat und halte die Scrollposition nur dann fest:
B4X:
Sub Process_Globals
   Dim svTopIndex, ItemHo As Int
   Dim OrientationZuletzt As String
End Sub

Sub Globals
   Dim ScrollView1 As ScrollView
End Sub

Sub Activity_Create(FirstTime As Boolean)
   Dim x, Ho, Br, PosY, ZCount As Int

   'Einrichten:
   Ho = Activity.Height
   Br = Activity.Width
   If FirstTime = True Then
      If Ho > Br Then OrientationZuletzt = "Landscape" Else OrientationZuletzt = "Portrait" 
   End If
   ItemHo = 30dip
   ZCount = 200
   
   Activity.LoadLayout("Layout01")
   Activity.Title = "TestScrollViewPos"
   ScrollView1.SetLayout(0, 0, Br, Ho)
   ScrollView1.Panel.Height = ItemHo * ZCount

   For x = 0 To ZCount -1
      Dim Label0 As Label
      Label0.Initialize("")
      Label0.Color = Colors.Black
      Label0.Text = "Zeile " & x
      ScrollView1.Panel.AddView(Label0, 0, PosY, Br, ItemHo -1dip)
      PosY = PosY + ItemHo
   Next
End Sub

Sub Activity_Resume
   'TopIndex wieder herstellen:
   DoEvents
   ScrollView1.ScrollPosition =  svTopIndex * ItemHo
End Sub

Sub Activity_Pause (UserClosed As Boolean)
   Dim Br, Ho As Int
   Br =  Activity.Width
   Ho = Activity.Height

   If Ho > Br AND OrientationZuletzt <> "Portrait" OR Ho < Br AND OrientationZuletzt <> "Landscape" Then
      Log("Ermitteln")
      'Index der ersten sichtbaren Zeile festhalten:
      Dim k As Int
      k = (ScrollView1.ScrollPosition / ItemHo)
      If k * ItemHo < ScrollView1.ScrollPosition Then k = k +1
      svTopIndex = k 
      If Ho > Br Then OrientationZuletzt = "Portrait" Else OrientationZuletzt = "Landscape"
   Else
      Log("Nicht ermitteln")
   End If
End Sub

Viele Grüße
Peter
 

Petrus

Member
Licensed User
Longtime User
Ja, habe ich - das funktioniert damit auch besser, aber es kommt immer wieder zu dem oben beschriebenen Problem (immer nur beim Wechsel von Landscape zu Portrait).

Gruß
Peter
 
Top