Spanish Error al volver a la aplicación después de pulsar botón home

Espinosa4

Active Member
Licensed User
Longtime User
Hola a todos,

Estoy teniendo problemas con mi aplicación. Tengo un módulo que se llama imagen y en el únicamente cargo una imagen utilizando la librería TouchImageView. En ella aparece una imagen que en muchas ocasiones se necesita visualizar a lo largo de una jornada laboral. Lo que hacemos es ocultar la aplicación pulsando home y luego la recuperamos volviendo a pulsar en el acceso directo de la aplicación. En un principio todo va ok y se nos muestra la imagen que teníamos abierta con su posición y dimensiones que hubiéramos dejado. El problema es que aleatoriamente nos aparece error en la creación del módulo. Es decir, y creo en tender, que después de pause pasa a resume y después a create y en una de esas es cuando da el error.

Dejo enlace de captura.
https://www.dropbox.com/s/o6spkpchajxssn9/IMG_20130614_184341.JPG
https://www.dropbox.com/s/dzox722294kwvvb/IMG-20130807-WA0000.jpg

Me podríais echar una mano por favor?
Aquí os dejo también el código:

B4X:
#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim SourceImageRect, TouchImageViewRect As Rect
    Dim sImagen,sServicio As String
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 TouchImageView1 As TouchImageView
    Dim P As Phone
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
    Activity.LoadLayout("Imagen")
    'Hay que tener instalada librería phone
'    P.SetScreenOrientation(0) Landscape
'    P.SetScreenOrientation(1) Portrait
'    P.SetScreenOrientation(-1) Both
'    P.SetScreenOrientation(0)
   
    Activity.Title = "Nº DE SERVICIO: " & sServicio
    TouchImageView1.Initialize("TouchImageView1")
    Activity.AddView(TouchImageView1, 0, 0, 100%x, 100%y)
   
    TouchImageView1.MinScale=0.25            '    default is 0.5
    TouchImageView1.MaxScale=2                '    default is 1.5
    TouchImageView1.TranslatePadding=128dip    '    default is 64dip
   
    TouchImageView1.Gravity=Gravity.FILL
    TouchImageView1.SetBackgroundImage(LoadBitmap(File.DirAssets,"fondo.png"))
   
    Dim Bitmap1 As Bitmap
    Bitmap1.Initialize(File.DirAssets,sImagen)
    TouchImageView1.SetBitmap(Bitmap1)
   
    If FirstTime Then
    '    RECT PARAMETERS ARE: LEFT, TOP, RIGHT, BOTTOM
        SourceImageRect.INITIALIZE(0, 0, Bitmap1.WIDTH, Bitmap1.HEIGHT)
        TouchImageViewRect.INITIALIZE(0, 0, TouchImageView1.WIDTH, TouchImageView1.HEIGHT)
        ''P.SetScreenOrientation(0)
    End If
   
    '    if the scaling process scales the image to less than the current MinScale or more than the current MaxScale then MinScale or MaxScale will be adjusted
    TouchImageView1.ScaleSrcRectToDestRect(SourceImageRect, TouchImageViewRect, "CENTER")    '    make string a static constant in library
End Sub

Sub Activity_Resume
   
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    TouchImageViewRect = TouchImageView1.GetDestRect
End Sub


Sub Activity_KeyPress (KeyCode As Int) As Boolean 'Return True to consume the event
      If KeyCode = KeyCodes.KEYCODE_BACK Then
        Activity.Finish
      End If
End Sub

Un saludo y muchas gracias.
 

Espinosa4

Active Member
Licensed User
Longtime User
Hola de nuevo.
He estado viendo que si estoy todo el rato con la pantalla en vertical funciona correctamente pero al rotarla es cuando aparece el error y no siempre ala primera.

Puede ser que tenga que poner algo en el procedimiento create o en resume?

Saludos
 

vampirbcn

Active Member
Licensed User
Longtime User
Basicamente, al rotar la pantalla, la activity se reinicia, los datos se pierden, por lo que hay que almacenarlos en el Activity_Pause y volver a cargarlos en el Activity_Resume.

Los valores existentes hay que almacenarlos en variables declaradas en Sub Process_Globals.
 
Last edited:

vampirbcn

Active Member
Licensed User
Longtime User
He realizado una pequeña modificación al código que muestras y funciona correctamente al rotar el dispositivo.
Simplemente he cambiado la variable SImagen por el nombre de una imagen que he colodado en DirAssets, por lo que parece que al rotar el dispositivo pierdes el valor de SImagen.

B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim SourceImageRect, TouchImageViewRect As Rect
    Dim sImagen,sServicio As String
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 TouchImageView1 As TouchImageView
    Dim P As Phone
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
    Activity.LoadLayout("Image")
    'Hay que tener instalada librería phone
'    P.SetScreenOrientation(0) Landscape
'    P.SetScreenOrientation(1) Portrait
'    P.SetScreenOrientation(-1) Both
'    P.SetScreenOrientation(0)
 
    Activity.Title = "Nº DE SERVICIO: " & sServicio
    TouchImageView1.Initialize("TouchImageView1")
    Activity.AddView(TouchImageView1, 0, 0, 100%x, 100%y)
 
    TouchImageView1.MinScale=0.25            '    default is 0.5
    TouchImageView1.MaxScale=2                '    default is 1.5
    TouchImageView1.TranslatePadding=128dip    '    default is 64dip
 
    TouchImageView1.Gravity=Gravity.FILL
    TouchImageView1.SetBackgroundImage(LoadBitmap(File.DirAssets,"ffff.png"))
 
    Dim Bitmap1 As Bitmap
    Bitmap1.Initialize(File.DirAssets,"icon-sms.png") ' ------------- UTILIZO UNA IMAGEN DE Dirassets en lugar de la variable y funciona
    TouchImageView1.SetBitmap(Bitmap1)
 
    If FirstTime Then
    '    RECT PARAMETERS ARE: LEFT, TOP, RIGHT, BOTTOM
        SourceImageRect.INITIALIZE(0, 0, Bitmap1.WIDTH, Bitmap1.HEIGHT)
        TouchImageViewRect.INITIALIZE(0, 0, TouchImageView1.WIDTH, TouchImageView1.HEIGHT)
        ''P.SetScreenOrientation(0)
    End If
 
    '    if the scaling process scales the image to less than the current MinScale or more than the current MaxScale then MinScale or MaxScale will be adjusted
    TouchImageView1.ScaleSrcRectToDestRect(SourceImageRect, TouchImageViewRect, "CENTER")    '    make string a static constant in library
End Sub

Sub Activity_Resume
 
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    TouchImageViewRect = TouchImageView1.GetDestRect
End Sub


Sub Activity_KeyPress (KeyCode As Int) As Boolean 'Return True to consume the event
      If KeyCode = KeyCodes.KEYCODE_BACK Then
        Activity.Finish
      End If
End Sub
 

Espinosa4

Active Member
Licensed User
Longtime User
Hola vampirbcn
Una vez más infinitas gracias por tu ayuda.

Siguiendo tu pequeña modificación lo que he hecho ha sido crear la variable globlal en el activity principal. Así esa variable siempre está con el valor correcto. Lo que no me queda claro es por qué. Entiendo que aunque esté en el mismo activity las variables globales no se destruían a no ser que cierres tú.

He visto por ahí que está el activity module statemanager. Parece que te salva el estado. Qué opinas? Es necesario o facilita mucho la gestión a la hora de salvar y restaurar el estado?

Un saludo
Espinosa4
 
Top