Spanish [SOLUCIONADO] Activity + TabHost + ScrollView + controles generados por código

fchirico

Member
Estimados,



En un activity que tiene un TabHost (tiene 5 Tab), en el TAB 5 quiero un ScrollView y dentro de él quiero generar LABELS y EDITTEX por código ya que la cantidad a generar de estos controles depende de los registros que tenga cargado en memoria.

Pude lograr generar estos controles, pero si cambio de Tab se siguen viendo, por lo que supongo que es como que estos controles están en el Activity y no en el ScrollView del Tab 5.

Les paso el código:

Genero los Tabs


B4X:
Sub Activity_Create(FirstTime As Boolean)
    
    'uso la clase SearchView para seleccionar el CLIENTE y luego el PRODUCTO
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("CargaDePedidos")
    Activity.Title="9-Carga Ped.Vta.        " & Application.LabelName
    
    'Dim bmp1, bmp2 As Bitmap
    'bmp1 = LoadBitmap(File.DirAssets, "ic.png")
    'bmp2 = LoadBitmap(File.DirAssets, "ic_selected.png")
    'TabHost1.AddTabWithIcon ("Name", bmp1, bmp2, "page1") 'load the layout file of each page
    TabHost1.AddTab("Cliente","page1") 'load the layout file of each page
    TabHost1.AddTab("Cabecera", "page2")
    TabHost1.AddTab("Producto", "page3")
    TabHost1.AddTab("Detalle", "page4")
    TabHost1.AddTab("Pedido", "page5")

En el TAB 5 (Case 4) ejeccuto el SUB 5 “Proc_Page5” el cual genera los controles EDITTEXT y LABELS

B4X:
Sub TabHost1_TabChanged
    'Activity.Title = "Current Tab = " & TabHost1.CurrentTab
    Select TabHost1.CurrentTab
        Case 0
            'Busca Cliente
        Case 1
            'Page 2 - Datos de Cabecera del Pedido
            If nCambioCliente = 1 Then
                'Cargo los datos del cliente de la SA1 y ZZX
                nCambioCliente = 0
                spn_canales.Clear
                edt_MensajeFac.Text = ""
                Wait For (Proc_Page2) complete (succes As Boolean)
                If succes = False Then
                    Return
                End If
            End If
        Case 2
            'Busca Producto
        Case 3
            'Traigo el precio de venta del producto seleccionado (DA1)
            'e ingreso la CANTIDAD y DTO del producto
            If nCambioProducto = 1 Then
                'si seleccioné un producto entonces recupero el precio, sino no
                nCambioProducto = 0
                Wait For (Proc_Page4) complete (succes As Boolean)
                If succes = False Then
                    Return
                End If
            End If
        Case 4
            'Mostrar el pedido cargado, se puede editar o borrar una linea
            Proc_Page5
    End Select   
End Sub

Y este es el SUB “Proc_Page5”

B4X:
Sub Proc_Page5
    'Recorro la lista de productos cargados y genero los controles EDITTEXT para editarlos
    Dim lbl_CodigoProducto(nIndiceLineaPedido) As Label
    Dim lbl_DescripProd(nIndiceLineaPedido) As Label
    Dim Edit_Cant(nIndiceLineaPedido) As EditText
    Dim Edit_DtoLin(nIndiceLineaPedido) As EditText
    

    'AddView (View As android.view.View, Left As Int, Top As Int, Width As Int, Height As Int)
    sv_LinPed.Initialize(90%y) 'Alto/Height previsto para el svMenu
    Activity.AddView(sv_LinPed,1%x,10%y,98%x,90%y) 'Hacemos que el scrollview ocupe el 100% de la pantalla
    p_LinPed.Initialize("")
    sv_LinPed.Panel.AddView(p_LinPed,2%x,11%y,97%x,89%y)
    
    Dim i As Int
    vY_LinPed = 4%x
    For i = 0 To nIndiceLineaPedido - 1
        Log(i & ") --> " & User4(i).LinPed_CodProd)
        Log(i & ") --> " & User4(i).LinPed_Cantidad)
        Log(i & ") --> " & User4(i).LinPed_DtoLin)
        Log("----------------------")
        
        lbl_CodigoProducto(i).Initialize("lbl_CodigoProducto")
        lbl_CodigoProducto(i).TextSize = 10
        sv_LinPed.Panel.AddView(lbl_CodigoProducto(i),3%x,vY_LinPed,30%x,5%y)
        lbl_CodigoProducto(i).Tag = i + 1
        lbl_CodigoProducto(i).Text = User4(i).LinPed_CodProd

        lbl_DescripProd(i).Initialize("lbl_DescripProd")
        lbl_DescripProd(i).TextSize = 10
        sv_LinPed.Panel.AddView(lbl_DescripProd(i),30%x,vY_LinPed,60%x,5%y)
        lbl_DescripProd(i).Tag = i + 1
        lbl_DescripProd(i).Text = User4(i).LinPed_DescriPro
        
        Edit_Cant(i).Initialize("Edit_Cant")
        Edit_Cant(i).TextSize = 12
        Edit_Cant(i).InputType = Edit_Cant(i).INPUT_TYPE_NUMBERS
        sv_LinPed.Panel.AddView(Edit_Cant(i),3%x,vY_LinPed + 1,20%x,10%y)
        Edit_Cant(i).Tag = i + 1
        Edit_Cant(i).Text = NumberFormat(Round2((User4(i).LinPed_Cantidad),0),1,0)
        
        Edit_DtoLin(i).Initialize("Edit_DtoLin")
        Edit_DtoLin(i).TextSize = 12
        Edit_DtoLin(i).InputType = Edit_DtoLin(i).INPUT_TYPE_DECIMAL_NUMBERS
        sv_LinPed.Panel.AddView(Edit_DtoLin(i),30%x,vY_LinPed + 1,20%x,10%y)
        Edit_DtoLin(i).Tag = i + 1
        Edit_DtoLin(i).Text = User4(i).LinPed_DtoLin
        
        vY_LinPed = vY_LinPed + 14%x

        'Ajustamos el alto del panel del scroll view para que se vea todo
        'svMenu.Panel.Height = vY
        
    Next
End Sub

Intenté ser lo más claro que puede en la explicación.

Por favor me pueden decir qué estoy haciendo mal?
 

fchirico

Member
Listo SOLUCIONADO, lo que hice para corregirlo fué definir el ScrollView desde el Diseñador en vez de hacerlo por código, solo eso.

Gracias!
 

josejad

Expert
Licensed User
Longtime User
Hola:

Entiendo que el scrollview es sv_LinPed (recuerda que deberías usar un xCustomListView, mejor que un scrollview).
Veo que lo estás inicializando en la línea 10, pero no deberías, ya que entiendo que ese scrollview lo deberías cargar en tu layout "Pedido" (TabHost1.AddTab("Pedido", "page5")

Y efectivamente, estás añadiendo el sv al Activity aquí:
B4X:
Activity.AddView(sv_LinPed,1%x,10%y,98%x,90%y) 'Hacemos que el scrollview ocupe el 100% de la pantalla
No hace falta, ya lo deberías tener cargado en el Layout "Pedido", y deberías añadirle items como en este ejemplo:
B4X:
clv2.Add(CreateListItem($"Item #${i}"$, 160dip, clv2.AsView.Height), $"Item #${i}"$)


Resumiendo, en tu layout "Pedido" deberías añadir tu scrollview con el diseñador (no hacerlo a través de código como ahora), y luego en la sub "Proc_Page5" añadirle ítems al scrollview

saludos,
 

fchirico

Member
Resumiendo, en tu layout "Pedido" deberías añadir tu scrollview con el diseñador (no hacerlo a través de código como ahora), y luego en la sub "Proc_Page5" añadirle ítems al scrollview

saludos,

Gracias, sí luego de postear el mensaje me dí cuenta de eso y me respondía a mismo lo mismo que tu dices.
 
Top