Spanish B4XPages: Poder definir la orientación de la aplicación en tiempo de ejecución (o casi)

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Muy buenas.

He estado dando vueltas a cómo poder programar una aplicación hecha con B4XPages para que pudiera tener "configurable" la orientación que van a tener sus páginas y no que forzosamente tuviera que decidirlo en el momento de la compilación de la misma.

O sea, si sé que un cliente siempre la va a utilizar con un teléfono, pues puedo dejarla en Portrait porque es la manera más habitual en la que solemos coger los teléfonos, mientras que si se va a utilizar en una tablet, quizás sea más interesante ejecutarla en Landscape, ya que suele ser la forma que se suele tener cuando están en alguna funda, soporte, etc.

Pues estoy haciendo pruebas pero creo que se puede hacer de una manera muy fácil, simplemente habilitando en la aplicación el poder decidir la orientación deseada y luego a la hora de arrancar la aplicación, tener en cuenta esta configuración para asignar la orientación.

Lo único que habría que hacer es tenerlo en cuenta en el Activity_Create de Main

B4XPages Orientation Defined At Runtime:
Sub Activity_Create(FirstTime As Boolean)
    ' Truco para poder definir la orientación de la aplicación en función a un unas opciones de configuración y no que forzósamente esté fijo.
   ' Hay que comentar la línea superior que hasta ahora fijaba la orientación de la aplicación. 
    Dim ph As Phone
    Dim Orientation As Int
    Orientation = ConfigMap.getDefault("DefaultOrientation", 1)
    ph.SetScreenOrientation(Orientation)        ' -1 Unspecified, 0 Landscape, 1 Portrait
    
    Dim pm As B4XPagesManager
    pm.Initialize(Activity)
End Sub
 
Last edited:

angel_

Well-Known Member
Licensed User
Longtime User
Quizás mejor ponerlo en Starter, no estoy seguro de que la aplicación inicie siempre en Activity_Create, no sé si estáis de acuerdo
 

josejad

Expert
Licensed User
Longtime User
Hola Gabino:

Pinta bien. ¿Lo has probado y va bien?

Hay un post similar, pero no tiene respuestas, ni ningún comentario de Erel, por lo que no sabemos si causa algún problema, aunque supongo que si los hubiera, lo habría comentado William.


saludos,
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
De momento estoy haciendo pruebas y funciona con el 0 y con el 1 sin problemas.

Si le pones - 1, la aplicación arranca según tengas orientado el dispositivo, pero si le cambias la orientación, la aplicación vuelve automáticamente a la pantalla inicial.
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Genial.

¿Dónde inicializas el ConfigMap?
Esa fue la primera pregunta que me hice tras postear... jajaja...

He barajado dos opciones:
  1. Hacerlo todo en el Main / Activty_create
  2. Definir el ConfigMap en Main / Process_Globals, pero inicializarla en Starter / Service Create
Yo de momento lo tengo funcionando con la opción 2 que me parece más "elegante". Pero si alguien aporta una mejor solución, pues para eso estamos...
En el Main:
Sub Process_Globals
    Public ActionBarHomeClicked As Boolean
    Public ConfigMap As Map
End Sub

Sub Globals

    
End Sub

Sub Activity_Create(FirstTime As Boolean)
'    ' Truco para poder definir la orientación de la aplicación en función a un unas opciones de configuración y no que forzósamente esté fijo.
'    Dim ConfigMap As Map
'    If ConfigMap.IsInitialized = False Then ConfigMap.Initialize
'   
'    #if B4J
'        If File.Exists(File.DirApp, "config.map") Then ConfigMap = File.ReadMap(File.DirApp, "config.map")
'    #else
'        If File.Exists(File.DirInternal, "config.map") Then ConfigMap = File.ReadMap(File.DirInternal, "config.map")
'    #end if
'       
    Dim ph As Phone

    ph.SetScreenOrientation(ConfigMap.getDefault("defaultorientation", 1))        ' -1 Unspecified, 0 Landscape, 1 Portrait
    'ph.SetScreenOrientation(-1)        ' -1 Unspecified, 0 Landscape, 1 Portrait
    
    Dim pm As B4XPagesManager
    pm.Initialize(Activity)
End Sub

En el Starter:
Sub Service_Create
    'This is the program entry point.
    'This is a good place to load resources that are not specific to a single activity.
    Provider.Initialize
    ' Truco para poder definir la orientación de la aplicación en función a un unas opciones de configuración y no que forzósamente esté fijo.
    If Main.ConfigMap.IsInitialized = False Then Main.ConfigMap.Initialize
    
    #if B4J
        If File.Exists(File.DirApp, "config.map") Then main.ConfigMap = File.ReadMap(File.DirApp, "config.map")
    #else
        If File.Exists(File.DirInternal, "config.map") Then Main.ConfigMap = File.ReadMap(File.DirInternal, "config.map")
    #end if
End Sub

Un saludo.
 
Top