Spanish SOLUCIONADO-Cargo layout sobre otro usando una clase,pero el d abajo sigue estando operativo al tact

Seneca

Active Member
Licensed User
Hola.

Estoy buscando la manera de cargar un Layout sobre otro para simular una ventana emergente. Como esta ventana emergente ha de ser invocada desde distintas actividades de la App he pensado encapsularla dentro de una clase, evitando así tener que duplicar código.

Parto de la idea de que quizás este razonamiento de usar una clase quizás no sea la más acertada, pero no se me ocurre otra manera mejor.

Al ejecutar la clase lo primero que hago es crear un panel, y sobre este panel cargo el layout con la ventana emergente. El usar este panel me sirve. por un lado, para poder removerlo más adelante eliminando así la ventana emergente. La otra función del panel sería aplicarle a la ventana emergente el aspecto "modal", de manera que los controles que quedan debajo deberían quedar inoperativos, pero resulta que esto último no lo consigo.

Adjunto un ejemplo donde incorporo una seekbar, que me ayuda a comprobar si los controles del layout inferior quedan o no sin uso al cargar la ventana emergente. Se puede apreciar que la seekbar sigue estando funcional al tacto, aunque haya quedado debajo del panel de la ventana emergente.

Solicito ayuda sobre esto de la clase que indico, o si hay otra manera mejor que no sea una clase.

Gracias.
 

Attachments

  • clase_actividad.zip
    9.6 KB · Views: 145

Eme Fibonacci

Well-Known Member
Licensed User
B4X:
'<<<< class
Sub Class_Globals
 
    'Dimensiono una actividad
 
    Private actividad As Activity
    Private btnCerrar As Button
 
    Private pnl As Panel
    Private pnlbase As Panel '<<<<<<<
 
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize (parent As Object)  ', actActividad As Activity)
 
    pnl.Initialize("")
    pnlbase.Initialize("pnlbase") '<<<<<<
    
    actividad = parent
    actividad.AddView(pnlbase,0,0,100%x,100%y) '<<<<<<
    pnlbase.AddView(pnl,4%x,20%y,92%x,76%y)    '<<<<<<
 
    'Cargo el Layout dentreo del Panel
    pnl.LoadLayout("layout_superpuesto")
End Sub

Sub btnCerrar_click
    'Al pulsar el botón remuevo el panel donde se cargó el layout (es el último view dentreo de la actividad)
    'actividad.RemoveViewAt(actividad.NumberOfViews-1)
    pnlbase.RemoveView '<<<<<
    Return
End Sub

'<<<<<<<<<<<<<<<<
Sub pnlbase_Click
 
End Sub

usted debe consumir el evento click en pnlbase.
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Hola Séneca:

La idea es buena de hacerlo sobre una clase, tambien podrias crear una libreria, es muy facil hacerla, creas un proyecto en main y lo salvas en libreria, luego esa libreria la incorporas a tus aplicaciones, haces lo típico de una libreria, la inicializas, haces visible tu panel llamando a un sub de tu libreria, borras los objetos, etc . Puedes crear métodos, eventos y variables que te interesen. Lo mismo que haces en la clase puedes hacerlo en main directamente y compilar en libreria, la verdad que son muy prácticas y te deja un código muy limpio.

Yo he empleado esos dos métodos, y por otras cuestiones crear paneles diferentes en main. En programación sabes que hay mil formas de hacer una misma cosa, lo importante es conseguirlo. Mientras te guste funcione rápido y bien creo que con eso basta.


Saludos
 

Seneca

Active Member
Licensed User
debe consumir el evento click en pnlbase.

Hola.

Efectivamente, me faltaba implementar un panel "base" a modo de máscara. Y la cuestión es que ya lo tenía implementado así en otras actividades de la App, pero no lo recordaba. Tendía a pensar que, de por sí, cualquier panel no debía dejar pasar el click a la capa inferior. Pero para ello hay que "consumir" el evento click.

Gracias por la ayuda @Eme Fibonacci .
 

Seneca

Active Member
Licensed User
Hola Séneca:

La idea es buena de hacerlo sobre una clase, tambien podrias crear una libreria, es muy facil hacerla, creas un proyecto en main y lo salvas en libreria, luego esa libreria la incorporas a tus aplicaciones, haces lo típico de una libreria, la inicializas, haces visible tu panel llamando a un sub de tu libreria, borras los objetos, etc . Puedes crear métodos, eventos y variables que te interesen. Lo mismo que haces en la clase puedes hacerlo en main directamente y compilar en libreria, la verdad que son muy prácticas y te deja un código muy limpio.

Yo he empleado esos dos métodos, y por otras cuestiones crear paneles diferentes en main. En programación sabes que hay mil formas de hacer una misma cosa, lo importante es conseguirlo. Mientras te guste funcione rápido y bien creo que con eso basta.


Saludos

Hola.

Aún no tengo soltura con las Clases y lo de convertir a Librería ni se me había ocurrido. Pero me he animado a hacer la prueba y la librería generada me funciona perfectamente. Así que completaré el diseño de la clase y luego la convertiré a librería que, como tu dices, hace que el código sea más limpio.

Gracias por esta nueva gran ayuda @bgsoft

Nota: Para poder añadir "SOLUCIONADO" al título del hilo he tenido que abreviarlo, quedando un poco extraño. He de aprender a hacer títulos más breves :D
 
Last edited:
Top