- Presentación.
NOTA: Este tutorial se complementa con otro que vimos en: 15.- Panel con pestañas.
- Como hemos visto en un tutorial anterior, cuando Android cambia de orientación horizontal / vertical, los controles se descolocan y las variables pierden su valor. Vamos a ver como podemos mantener los controles situados en los lugares adecuados y que las variables no pierdan su valor.
Para ello vamos a realizar el siguiente ejemplo:
1.- Mantener controles y variables cuando cambia la orientación.
- Creamos un nuevo proyecto llamado orientacion.
____________________________
- Designer. Layout.
Creamos los controles
|
|
Insertamos mediante
Designer / Add View
Label1 Text = Escribe tu nombre
EditText1
CheckBox1 Text = Pescado
CheckBox2 Text = Carne
CheckBox3 Text = Frutas
Button1 Text = Elige y Pulsa
Label2
Guardamos el Designer:
File / Save : Layout
|
____________________________
- Código (copia y pega).
Código del programa
|
' Juan Antonio
' juana1991@yahoo.com
Sub Process_Globals
End Sub
Sub Globals
Dim comida As String
Dim EditText1 As EditText
Dim CheckBox1, CheckBox2, CheckBox3 As CheckBox
Dim Label2 As Label
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Button1_Click
comida = ""
If CheckBox1.Checked = True Then comida = "pescado, "
If CheckBox2.Checked = True Then comida = comida & "carne, "
If CheckBox3.Checked = True Then comida = comida & "fruta. "
comida = EditText1.Text & ", has elegido: " & comida
Label2.Text = comida
End Sub
|
____________________________
- Compila y ejecuta la aplicación.
|
Pulsa la combinación de teclas Control F11 para se se ponga horizontal.
Verás que se han perdido algunos controles y que no se mantienen las variables ni los elementos elegidos.
Si vuelves a pulsar Control F11 se volverá a poner en vertical y comprobarás que las variables continúan sin los valores que pusistes. |
________________________________________________
- Vamos a solucionar la ubicación de los controles.
- Utilizaremos Variants.
Para ello vamos al Designer y observamos que nuestro Layout es de 320 x 480.
Vamos a crear otro Layout, para ello pulsamos en New Variant
y elegimos un Phone (landscape) 480 x 320
Marcamos 480 x 320
Pulsamos la combinación de teclas Control F11, para ponerlo horizontal y arrastramos el Botón y el Label2 hasta ponerlos visibles como indica el dibujo.
|
|
A partir de ahora cuando cambiemos la orientación horizontal o vertical de la pantalla, los controles se situarán según la manera elegida en cada caso.
___________________________________________________________________
- Ahora vamos a solucionar el problema de las variables, es decir que cuando cambia la orientación los valores de variables y propiedades de los controles se mantengan.
Para ello deberíamos recurrir a la subrutina Sub Activity_Pause (UserClosed As Boolean) y poner los valores de variables que existen en ese momento.
Pero Basic4Android ofrece una posibilidad más sencilla, es cargar un módulo llamado StateManager, con este módulo podemos mantener los valores de las variables y sus propiedades aunque cambiemos su orientación.
Seguimos el tutorial de sus foros StateManager. Añadimos nuevas líneas a nuestro código.
Código del programa
|
' Juan Antonio
' juana1991@yahoo.com
Sub Process_Globals
End Sub
Sub Globals
Dim comida As String
Dim EditText1 As EditText
Dim CheckBox1, CheckBox2, CheckBox3 As CheckBox
Dim Label2 As Label
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
If StateManager.RestoreState(Activity, "Main", 60) = False Then
End If
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
If UserClosed Then
StateManager.ResetState("Main")
Else
StateManager.SaveState(Activity, "Main")
End If
StateManager.SaveSettings
End Sub
Sub Button1_Click
comida = ""
If CheckBox1.Checked = True Then comida = "pescado, "
If CheckBox2.Checked = True Then comida = comida & "carne, "
If CheckBox3.Checked = True Then comida = comida & "fruta. "
comida = EditText1.Text & ", has elegido: " & comida
Label2.Text = comida
End Sub
|
Además hace falta cargar un módulo. Esto se hace mediante.
Project / Add New Module / Code Module
le llamamos StateManager
En el módulo StateManager ponemos el código correspondiente.
Lo puedes encontrar en... el último de esta página.
Además hace falta marcar las Librerías: RandomAccessFile y Reflection.
Una vez realizado todo esto, prueba marcar elementos de la aplicación, poner el móvil en horizontal y vertical.
Pulsar el botón de "Atrás" del móvil.... las variables deben permanecer con sus valores y los controles con las propiedades elegidas.
________________________________________________
2.- Mantener controles y variables cuando cambia la orientación, mediante otro código.
Vamos a realizarlo de otra manera sin necesidad del módulo StateManeger ni las librería indicadas anteriormente.
En este caso solo le prestamos atención al valor de las variables.
Creamos un nuevo proyecto llamado orientacion_2
Creamos los controles
|
|
Insertamos mediante
Designer / Add View
Label1 Text = Escribe tu nombre
EditText1
EditText2
Button1 Text = Pulsa
Guardamos el Designer:
File / Save : Layout
Recuerda que para que el Designer muestre los controles en el emulador debemos de pulsar en...
Designer / Tools / Connect to Device / Emulator |
Código del programa
|
' Juan Antonio Villalpando
' juana1991@yahoo.com
Sub Process_Globals
' En el elemento guarda de Tipo Guardador, se guardarán en distintos cajones las variables.
Type Guardador (cajon1 As String, cajon2 As String, cajon3 As Int, cajon4 As Int)
Dim guarda As Guardador
End Sub
Sub Globals
Dim EditText1, EditText2 As EditText
Dim suma As Int
suma = 0
End Sub
Sub Valores_iniciales
guarda.cajon1 = ""
guarda.cajon2 = ""
guarda.cajon3 = 0
guarda.cajon4 = 0
End Sub
Sub Activity_Create(FirstTime As Boolean)
If FirstTime Then
Valores_iniciales
End If
Activity.LoadLayout("Layout")
End Sub
Sub Activity_Resume
' Al volver a funcionar la aplicación después de haber cambiado la orientación.
' Se recuperan los valores guardado en los cajones.
EditText1.Text = guarda.cajon1
EditText2.Text = guarda.cajon2
suma = guarda.cajon3
End Sub
Sub Activity_Pause (UserClosed As Boolean)
If UserClosed Then
' El usuario quiere cerrar la aplicación.
' Pondremos valores iniciales.
Valores_iniciales
Else
' Al cambiar de orientación entra en funcionamiento esta Subrutina
' y guarda las variables en cajones.
guarda.cajon1 = EditText1.Text
guarda.cajon2 = EditText2.Text
guarda.cajon3 = suma
End If
End Sub
Sub Button1_Click
suma = suma + 1
EditText2.Text = suma
End Sub
|
En este caso creo un Type Guardador preparado para guardar distintos valores de String y Int.
guarda será la variable que utilizará este Type.
Cuando cambio de orientación se ejecuta la Subrutina Pause y guarda losl valores de las variables actuales en guarda.
Cuando la aplicación ya ha tomado la orientación se ejecuta la Subrutina Resume y carga los valores de las variables guardadas.
Recuerda para cambiar la orientación de la pantalla pulsa Control F11.
________________________________