Spanish (B4A) [SOLUCIONADO] ¿Alguna idea sobre CheckBox con tres estados?

Seneca

Active Member
Licensed User
Hola.

Necesito mostrar una serie de CheckBox (CB) agrupados por categorías. La idea es que en la cabecera de cada categoría aparezca otro CB "padre". Este debería mostrar el estado Activado o Desativado si todos sus "hijos" están en ese estado. Pero debería mostrar un estado intermedio en el caso de que unos CB "hijos" estén en Activado y otros en Desactivado. Ese estado intermedio podría visualizarse cambiando el interior del CB a color gris, por ejemplo

No se me ocurre la manera de hacerlo ni he encontrado ninguna librería que lo implemente.

¿Alguna orientación?

Gracias.
 

rscheel

Well-Known Member
Licensed User
Longtime User
Podrías hacerlo en el cambio de estado del check, supongamos que tienes 10 check eso seria tu 100%, pero si tienes menos de 10 marcado tu porcentaje baja, con eso puedes hacer que el check principal cambie de color o algo así.
 

Seneca

Active Member
Licensed User
...con eso puedes hacer que el check principal cambie de color o algo así.

Esa es la cuestión, que no encuentro la manera de hacer un cambio de color del Check. Solo consigo cambiar el color del texto y el del fondo de este texto, pero no el del propio Check.
 

tomky

Active Member
Licensed User
Hola Seneca.

Puedes probar alguna de estas opciones:

1. Checkbox Checked Color de Reviewnow.
2. Su propiedad color:
B4X:
    Dim CB As CheckBox
    CB.Initialize("CB")
    CB.Gravity = Gravity.FILL
    CB.Color = Colors.Yellow
    Activity.AddView(CB, 50%x, 10dip, 32dip, 30dip)
3. Su propiedad BitmapDrawable en el diseñador.

Saludos.
 
Last edited:

Seneca

Active Member
Licensed User

La opción 1 es la solución. Tanto la 2 como la 3 colorean un área más allá del propio check.

El resultado es el siguiente:


Me resulta raro que B4A no haya aportado una propiedad para personalizar el color tal y como aparece en la opción 1 y haya de recurrirse a java.

Gracias por la solución.
 

tomky

Active Member
Licensed User
Vale Seneca. Aunque se queda el color en el recuadro al deseckechar.

De nada.
Saludos.
 

Seneca

Active Member
Licensed User
Jugando con el estado y con los colores he conseguido lo que necesitaba, tal y como se muestra en la imagen.

El check de más arriba ejerce de "padre" y aparece en un estado y color u otro dependiendo de los check "hijos". A su vez, pulsando el check "padre" se pone a todos los "hijos" en ON u OFF de manera simultánea.

Saludos.

 

markfercho

New Member
Hola @Seneca

Me funciona de maravilla!!, pero lo que quiero es cambiar tambien el tamaño del cuadro del checkbox esto es posible?
 

josejad

Expert
Licensed User
Longtime User
Hola:

Deberias crear un nuevo hilo y no escribir en uno antiguo con una pregunta nueva.
Prueba esto y si no te va, crea un nuevo hilo con el problema que tengas


Podrías usar también un B4XSwitch
 

markfercho

New Member
Hola @José J. Aguilar, muchas gracias por la ayuda, por ahora encontre este hilo https://www.b4x.com/android/forum/threads/add-border-to-views-and-change-checkbox-graphic.36436/ al aprecer me funciono muy bien usando el diseñador de b4x, al parecer se adapta de acuerdo al tamaño que le ponga en el diseñador
en esta parte del codigo:
B4X:
Sub SetCBDrawable(CB As CheckBox,BoxColor As Int,BoxWidth As Int,TickColor As Int,TickChar As String,DisabledColor As Int,Size As Int,Padding As Int)
    Dim SLD As StateListDrawable
    SLD.Initialize
    
    Dim BMEnabled,BMChecked,BMDisabled As Bitmap
    BMEnabled.InitializeMutable(Size,Size)
    BMChecked.InitializeMutable(Size,Size)
    BMDisabled.InitializeMutable(Size,Size)
    'Draw Enabled State
    Dim CNV As Canvas
    CNV.Initialize2(BMEnabled)
    Dim Rect1 As Rect
    Rect1.Initialize(Padding ,Padding ,Size - Padding ,Size - Padding)
    CNV.DrawRect(Rect1,BoxColor,False,BoxWidth)
    Dim Enabled,Checked,Disabled As BitmapDrawable
    Enabled.Initialize(BMEnabled)
    'Draw Selected state
    Dim CNV1 As Canvas
    CNV1.Initialize2(BMChecked)
    If TickChar = "Fill" Then
        CNV1.DrawRect(Rect1,TickColor,True,BoxWidth)
        CNV1.DrawRect(Rect1,BoxColor,False,BoxWidth)
    Else
        CNV1.DrawRect(Rect1,BoxColor,False,BoxWidth)
        'Start small and find the largest font that allows the tick to fit in the box
        Dim FontSize As Int = 6
        Do While CNV.MeasureStringHeight(TickChar,Typeface.DEFAULT,FontSize) < Size - (BoxWidth * 2) - (Padding * 2)
            FontSize = FontSize + 1
        Loop
        FontSize = FontSize - 1
        'Draw the TickChar centered in the box
        CNV1.DrawText(TickChar,Size/2,(Size + CNV.MeasureStringHeight(TickChar,Typeface.DEFAULT,FontSize))/2,Typeface.DEFAULT,FontSize,TickColor,"CENTER")
    End If
    Checked.Initialize(BMChecked)
    'Draw disabled State
    Dim CNV2 As Canvas
    CNV2.Initialize2(BMDisabled)
    CNV2.DrawRect(Rect1,DisabledColor,True,BoxWidth)
    CNV2.DrawRect(Rect1,BoxColor,False,BoxWidth)
    Disabled.Initialize(BMDisabled)
    
    'Add to the StateList Drawable
    SLD.AddState(SLD.State_Disabled,Disabled)
    SLD.AddState(SLD.State_Checked,Checked)
    SLD.AddState(SLD.State_Enabled,Enabled)
    SLD.AddCatchAllState(Enabled)
    'Add SLD to the Checkbox
    Dim JO As JavaObject = CB
    JO.RunMethod("setButtonDrawable",Array As Object(SLD))
End Sub
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…