Spanish (B4A) [SOLUCIONADO] ¿Se puede añadir un View a la Activity desde un módulo de código?

Seneca

Active Member
Licensed User
Hola.

En una Activity he diseñado un Sub que muestra un HorizontalScrollView (HSV), que a su vez albergará una serie de botones, todo esto mediante código.

Ahora estoy diseñando otra Activity y se me ha ocurrido mostrar en ella el mismo HSV de la Activity anterior.

Para no duplicar código pensaba si sería posible sacar del primer Activy el Sub que muestra el HSV y pasarlo a un módulo de código. Desde allí sería llamado desde ambas Activity. Pero creo que esta idea no es válida.

Me gustarían me aclarasen y recomendasen la mejor manera de hacerlo reaprovechando código, si es posible.

Saludos.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Séneca:

Si se puede hacer.
Mete todo el código en un módulo de clase (Class Module)
En el Sub Class_Globals declara los objetos y variables que vas a necesitar tanto públicas como privadas
Create un Public Sub Initialize y ahí le pasas como parametro el Hsv, alto, ancho, top, left, etc (lo que necesites)
Create los sub con los eventos que emplees, luego estos eventos (click por ejemplo) haces un CallSub2( al sub del formulario que le hayas pasado en el inicializar .
Create los sub de leer, escribir, añadir, etc

Entonces, desde cualquier formulario puedes hacer esto (los nombres me los he inventado):

B4X:
Sub Globals
   private HSV1 as HorizontalScrollView
   Private MiHSV As MiHorizontalScrollViewClass ' <- este será el nombre de tu módulo de clase
...


Sub Activity_Create(FirstTime As Boolean)

MiHSV.Initialize(HSV1, Me,0,0,100%x,100%y) ' aqui inicializas lo que creas, hasta el nombre del evento para el click si quieres

Sub EventoAlPulsarElBoton_Click (indice as int)
  ' cuando el modulo de clase detecte un click en uno de los botones que pongas
  ' como te he dicho al principio haces un CallSub2( pasandole la actividad y el indice
End sub

Ahhh, si arriba de los sub le pones comentarios, cuando estes escribiendo te saldrá como ayuda ;)

Si creas un modulo de clase muy potente y simple, incluso lo puedes convertir en libreria y ya lo tienes para otros proyectos ;) , no es una fantasia, y es facil con Project/Compile To Library , lo he echo con cosas muy repetitivas y me ahorro el copiar el modulo de clase :D



Saludos
 

Seneca

Active Member
Licensed User
Hola.

En lo que he venido estudiando de B4A, el tema de las clases lo he ido dejando a un lado para más adelante porque se me hacía un poco complicado. Creo que ha llegado el momento de abordarlo.

Gracias Jesús por la ayuda, que ni me imaginaba que fuesen por ahí los tiros.

Saludos.
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Séneca

Bájate este ejemplo de cámara extendida y verás que es muy facil, no tiene nada que ver con tu scroll pero verás como se hacen llamadas a modulos de clase, como puedes configurar los eventos, etc
https://www.b4x.com/android/forum/t...e-camera-library-functionality.23801/#content


Si ya resolviste el problema, podrias añadir al título [SOLUCIONADO] así ayudamos a mejorar el foro.

Gracias

Saludos
 

Seneca

Active Member
Licensed User
Hola.

Sí, bastante ilustrativo el ejemplo de la cámara extendida. Si me surgen dudas volveré a este hilo.

Gracias Jesús.
 

Seneca

Active Member
Licensed User
Hola de nuevo.

Para aprender el funcionamiento de las clases he creado un pequeño ejemplo, mediante el cual se crea un HorizontalScrollView, al que se le añaden una serie de botones, los cuales pueden ser posteriormente eliminados y redibujados a voluntad haciendo un click.

Creo que he entendido cual es el funcionamiento de las clases. Adjunto el código por si alquien tiene a bien ojearlo a ver si el flujo es el adecuado.

Comento que el ejemplo solo era para practicar, por si alguien ve poco útil la funcionalidad del mismo.

Saludos.

MAIN:
B4X:
'Cada botón del HSV representa una Categoría, de ahí que se use este nombre en diversos sitios

Sub Process_Globals
    Dim ID_categoria_escogida As Int
    Dim Num_boton_categoria_escogida As Int = 2 'Establece el botón nº 2 como seleccionado a modo de ejemplo
    Dim Texto_categoria_escogida As String

    Dim lstCategorias As List 'Lista con los datos del botón.
    Dim intTotalCategorias As Int 'Número total de Categorías (botones)
End Sub

Sub Globals
    Dim svCategorias As HorizontalScrollView 'Scrollview Horizontal para botones de categorías
    Dim Menu_horizontal_1 As menu_horizontal

    Private lblNumBoton As Label
    Private lblTextoBoton As Label
    Private lblIDCategoria As Label
    Private Spinner1 As Spinner
  
    Dim intBorrarBoton = 0
End Sub

Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        'Añado a una lista los datos de cada botón: ID y Texto
        'La ID se utilizará para acciones posteriores, tras pulsar cualquiera de los botones
        lstCategorias.Initialize
        lstCategorias.Add (Array As String("12", "Naranjas"))
        lstCategorias.Add (Array As String("6", "Manzanas"))
        lstCategorias.Add (Array As String("5", "Judias"))
        lstCategorias.Add (Array As String("2", "Patatas"))
        lstCategorias.Add (Array As String("21", "Uvas"))
      
        intTotalCategorias = lstCategorias.Size 'almacena el número total de categorias (botones)
      
      
        Activity.LoadLayout ("layout_principal")
      
        Spinner1.Prompt="Escoge un Botón"
        Spinner1.AddAll(Array As String("1", "2", "3", "4", "5"))
         
    End If

    'Añado el HorizontalScrollView al Activity
    svCategorias.Initialize(0,"")  
    svCategorias.Color = Colors.blue
    Activity.AddView(svCategorias,0,80%y,100%x,20%y)

    'Dibujo los botones en el HSV
    Menu_horizontal_1.Initialize(svCategorias, lstCategorias, Me)

End Sub

Sub botonH_Click (pulsado As Int)
    'otras acciones
    lblNumBoton.Text = "Nº Botón:  " & Num_boton_categoria_escogida
    lblTextoBoton.Text = "Categoría:  " & Texto_categoria_escogida
    lblIDCategoria.Text = "ID Categoría:  " & ID_categoria_escogida
    '.......
    '.......
    '.......
End Sub

Sub btnBorraAgregaBoton_click
    Menu_horizontal_1.BorraBoton(intBorrarBoton) 'Borra segundo botón
    Msgbox("¿Continúo y publico el botón borrado?" , "Segundo botón borrado")
    Menu_horizontal_1.DibujaBotonH2(intBorrarBoton) 'Dibuja segundo botón
End Sub

Sub Spin_itemclick (Position As Int, Value As Object)
    intBorrarBoton = Value-1 'memoriza el número de botón a borrar y redibujar  
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

MENU HORIZONTAL (CLASS)
B4X:
Sub Class_Globals
    Dim HSV1 As HorizontalScrollView
    Dim lista As List
    Public btnH() As Button
    Private retorno As Object
    Dim ancho_alto_boton As Int
    Dim separacion As Int
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize (HSV As HorizontalScrollView, Lista_botones As List, target As Object)
    HSV1 = HSV
    lista = Lista_botones
    retorno = target
    separacion = 10dip 'separación entre botones
    'Determina el tamaño del botón según la altura del HSV y la separación entre botones
    ancho_alto_boton = HSV1.Height - (2 * separacion)

    'Determina el ancho del Panel del HSV según el número, tamaño y separación de los botones
    HSV.Panel.width=(Main.intTotalCategorias * (ancho_alto_boton + separacion)) + separacion
    Dim UnaCategoria () As String
    Public btnH(Main.intTotalCategorias) As Button 'Aunque ya se dimensionó en Class_Globals, ahora se le da el tamaño adecuado
  
    For Categoria = 0 To Main.intTotalCategorias - 1
        UnaCategoria=lista.Get(Categoria) 'Recupera de la Lista de Botones los datos de cada uno
        DibujaBotonH (HSV1, btnH(Categoria), Categoria, UnaCategoria(1)) 'Pasa como parámetros el HSV, un botón, nº del botón y texto del botón
    Next
End Sub


Sub DibujaBotonH2 (numero As Int)
    Dim ListaCategorias () As String
    ListaCategorias=lista.Get(numero)
  
    DibujaBotonH (HSV1, btnH(numero), numero, ListaCategorias(1))
End Sub

Sub DibujaBotonH (Hscroll As HorizontalScrollView, boton As Button, numero As Int,  texto As String)
    Dim x, y As Int
    boton.Initialize("btnH")
    boton.Tag = numero 'se almacena el número de orden de cada botón

    x = separacion + (ancho_alto_boton + separacion) * numero
    y = separacion
      
    HSV1.Panel.AddView(boton, x, y, ancho_alto_boton, ancho_alto_boton)

    boton.Text = texto

    If Main.Num_boton_categoria_escogida = numero Then
        boton.TextColor=Colors.yellow 'Texto amarillo para el botón "seleccionado"
    Else
        boton.TextColor=Colors.White 'Texto blanco par el resto de botones
    End If
End Sub

Sub BorraBoton (numero As Int)
    For Each btnborrar As View In HSV1.Panel
        If btnborrar.Tag = numero Then 'Determina el botón a borrar
             btnborrar.RemoveView
             Return
        End If
    Next
End Sub

Sub btnh_click
    Dim boton_pulsado As Button
    boton_pulsado = Sender

    'Se comprueba si el númro del botón pulsado es distinto al seleccionado anteriormente
    If Main.Num_boton_categoria_escogida <> boton_pulsado.Tag Then
        CambiaBoton(boton_pulsado.Tag) '
        CallSub2 (retorno, "botonH_Click", boton_pulsado.tag)
    End If
End Sub

Sub CambiaBoton (nuevo As Int)
    Dim categoria_escogida () As String
    categoria_escogida=lista.Get(nuevo)
    btnH(Main.Num_boton_categoria_escogida).TextColor=Colors.White 'Texto de la categoría anterior pasa a blanco

    Main.ID_categoria_escogida = categoria_escogida(0)
    Main.Texto_categoria_escogida = categoria_escogida(1)
    Main.Num_boton_categoria_escogida = nuevo
  
    btnH(nuevo).TextColor=Colors.Yellow 'Texto de la nueva categoría pasa a amarillo
End Sub
 

Attachments

  • clase scroll horizontal.zip
    11.9 KB · Views: 315

bgsoft

Well-Known Member
Licensed User
Longtime User
Gracias por compartir

Saludos
 
Top