Italian xCustomView

Gianni Sassanelli

Active Member
Licensed User
Longtime User
Buongiorno ragazzi,
qualcuno può darmi una mano a gestire gli eventi di alcune View inserite in una xCustomView ?

Ho creato una xCustomview fatta da un B4xVIEW che contiene 2 bottoni anch'essi di tipo b4xView

Vorrei gestire il click sul button_1 ed il click sul button_2 ma non so come fare

riesco solo a gestire il click sulla classe, ma non quello dei bottoni
mi potete aiutare per favore?
Grazie
 

Star-Dust

Expert
Licensed User
Longtime User
Ho dato velocemente uno sguardo al codice e mi sembra ci sia proprio un errore di concetto. Ma sono fuori sede quindi non posso aiutarti.
 

Gianni Sassanelli

Active Member
Licensed User
Longtime User
Ho dato velocemente uno sguardo al codice e mi sembra ci sia proprio un errore di concetto. Ma sono fuori sede quindi non posso aiutarti.

Se riesci ti ringrazio.
Birra pagata


PS ho letto i tuoi post sulle collaborazioni di sviluppo ecc e mi piacerebbe partecipare per quanto di mia competenza.
 

Star-Dust

Expert
Licensed User
Longtime User
Se riesci ti ringrazio.
Birra pagata


PS ho letto i tuoi post sulle collaborazioni di sviluppo ecc e mi piacerebbe partecipare per quanto di mia competenza.
Se le Label sono create nel Design. Quindi per catturare l'evento devi usare il nome delle Label dichiarate nel Design. Adesso non hai allegato il Layou quindi non saprei, ma supponendo che si chiamassero Label1 e Label2

B4X:
Private Label1_Click

End Sub

Private Label2_Click

End Sub

Ma se ti riferisci a quelle dichiarate all'interno (come dummyIcon) allora hai sbagliato l'inizializzazione
B4X:
Dim dummyIcon As Label
dummyIcon.Initialize("dummyIcon")
e l'evento
B4X:
Private Sub dummyIcon_Click

End Sub
 

Gianni Sassanelli

Active Member
Licensed User
Longtime User
ti allego il codice della classe
B4X:
'xCustomButton CustomView cross platform class.
'Version 1.0
'Author: Klaus CHRISTL (klaus)
'
'Events declarations
#Event: Click
'#Event: LongClick
'#Event: CheckdChange(Checked As Boolean)
#RaisesSynchronousEvents: Click
'#RaisesSynchronousEvents: LongClick
'#RaisesSynchronousEvents: CheckdChange

'Designer property declarations
#DesignerProperty: Key: IconsTextColor, DisplayName: IconsTextColor, FieldType: Color, DefaultValue: 0xFFFFFFFF, Description: ForeGroundColor of ToolBar Icons.
#DesignerProperty: Key: HomeIconLib, DisplayName: Home Icon Library, FieldType: String, DefaultValue: MATERIAL, List: MATERIAL|AWESOME, Description: Select Library of Home Icon.
#DesignerProperty: Key: MenuIconLib, DisplayName: Menu Icon Library, FieldType: String, DefaultValue: MATERIAL, List: MATERIAL|AWESOME, Description: Select Library of Menù Icon.
#DesignerProperty: Key: BackgroundColor, DisplayName: BackgroundColor, FieldType: Color, DefaultValue: 0x00FFFFFF, Description: Background color.

'#DesignerProperty: Key: ButtonType, DisplayName: ButtonType, FieldType: String, DefaultValue: STANDARD, List: STANDARD|TOGGLE, Description: Select the buttton Type.
'#DesignerProperty: Key: Text, DisplayName: Text, FieldType: String, DefaultValue: Text, Description: Text at the bottom of the button.
'#DesignerProperty: Key: OnStateText, DisplayName: OnStateText, FieldType: String, DefaultValue: ON, Description: Text at the bottom of the button.
'#DesignerProperty: Key: PressedColor, DisplayName: PressedColor, FieldType: Color, DefaultValue: 0xFFFFFF00, Description: Color when the button is pressed.
'#DesignerProperty: Key: OnStateColor, DisplayName: OnStateColor, FieldType: Color, DefaultValue: 0xFFFF00FF, Description: Color for the ON state.
'#DesignerProperty: Key: OnStateBackgroundColor, DisplayName: OnStateBackgroundColor, FieldType: Color, DefaultValue: 0x00FFFFFF, Description: Color of the background for the ON state.

'xCustomButton is a button based on a Panel with two Labels
'one with a Material Icon and the other with text.
'It has two events: Click and LongClick.
Sub Class_Globals
#If B4J
    Private fx As JFX
#End If
    Private xui             As XUI
    Private mEventName     As String
    Private mCallBack     As Object
    Private xBase             As B4XView
    Private xParent         As B4XView   
    Private mLeft, mTop, mWidth, mHeight As Int
    Private mTag             As Object
 
    Private xLabelFont, xIconFont                 As B4XFont
    Private mIconTextSize, mCaptionTextSize     As Double
    Private mIconsColor, mTextColor                 As Int
    Private mCaptionText, mHomeIconText, mMenuIconText As String
    
    Private HomeIcon, MenuIcon, CaptionLabel As B4XView
End Sub
Public Sub Initialize (Callback As Object, EventName As String)
    mEventName         = EventName
    mCallBack         = Callback
    mHomeIconText     = Chr(0xF03C)
    mCaptionText     = "Standard Caption"
    mTextColor         = xui.Color_Red
    
End Sub
Public Sub DesignerCreateView (Base As Object, Lbl As Label, Props As Map)
    Private mDummy As B4XView
    mDummy             = Base
    mLeft             = mDummy.Left
    mTop                 = mDummy.Top
    mWidth             = mDummy.Width
    mHeight            = mDummy.Height
    
    
  
    xBase                 = xui.CreatePanel("xBase")
    xBase.Color         = Props.Get("BackgroundColor")
    xParent                 = mDummy.Parent
    xParent.AddView(xBase, mLeft, mTop, mWidth, mHeight)
    mTag                     = mDummy.Tag
    
    mTextColor             = xui.PaintOrColorToColor(Lbl.TextColor)
    mCaptionTextSize    = Lbl.TextSize
    mIconsColor         = xui.PaintOrColorToColor(Props.Get("IconsTextColor"))
    mHomeIconText         = Chr(0xE88A)
    mMenuIconText        = Chr(0xE23D)
'    mDummy.RemoveViewFromParent
    Dim dummyIcon As Label
    dummyIcon.Initialize("")
    dummyIcon.Typeface     = Typeface.MATERIALICONS
    dummyIcon.Text            = Chr(0xE88A)
    dummyIcon.TextSize    = GetMaxIconTextsize(dummyIcon)
    #If B4A
        xIconFont     = xui.CreateFont(Typeface.MATERIALICONS, dummyIcon.TextSize)
        xLabelFont    = xui.CreateFont(Lbl.Typeface, Lbl.TextSize)
    #Else
        xIconFont     = dummyIcon.Font
        xLabelFont    = Lbl.Font
    #End If
    
    HomeIcon                  = dummyIcon
    HomeIcon.Font             = xIconFont
    HomeIcon.SetTextAlignment("CENTER", "CENTER")
    HomeIcon.Text             = mHomeIconText
    HomeIcon.TextSize     = dummyIcon.TextSize
    HomeIcon.TextColor     = xui.PaintOrColorToColor(mTextColor)
    dummyIcon.Initialize("")
    MenuIcon                    = dummyIcon
    MenuIcon.Font             = xIconFont
    MenuIcon.SetTextAlignment("CENTER", "CENTER")
    MenuIcon.Text             = mMenuIconText
    MenuIcon.TextSize     = HomeIcon.TextSize
    MenuIcon.TextColor    = HomeIcon.TextColor
    'dummyCaption.Initialize("")
    CaptionLabel                = Lbl
    CaptionLabel.Font         = xLabelFont
    CaptionLabel.SetTextAlignment("CENTER", "LEFT")
    CaptionLabel.Text         = Lbl.Text
    CaptionLabel.Visible        = Lbl.Visible
    CaptionLabel.TextSize     = mCaptionTextSize
    CaptionLabel.TextColor    = HomeIcon.TextColor


    xBase.AddView(HomeIcon, 1dip, 1dip, xBase.Height, xBase.Height)
    xBase.AddView(MenuIcon, xBase.Width -xBase.Height- 1dip, 1dip, xBase.Height, xBase.Height)
    xBase.AddView(CaptionLabel, xBase.Height + 10dip,0dip,  xBase.Width -(2*xBase.Height) -12dip ,xBase.Height)
End Sub
Private Sub GetMaxIconTextsize(l As Label) As Double
    Dim h, ts As Double
    Dim cv As Canvas
    cv.Initialize(xBase)
    ts = 10 ' valore base di partenza
    h = cv.MeasureStringHeight(l.Text ,l.Typeface,ts)
    Do While h < xBase.Height - 20dip
        ts = ts * 105 / 100
        h = cv.MeasureStringHeight(l.Text ,l.Typeface,ts)
    Loop   
    Return ts
End Sub


Sub xBase_Click
    'Is this the right point?
    Dim xObj As B4XView = Sender
    Dim xObj2 As B4XView = xObj.GetView(0)
    Dim xObj3 As B4XView = xObj.GetView(1)
    
    If xui.SubExists(mCallBack, mEventName & "_Click", 0) Then
        CallSubDelayed(mCallBack, mEventName & "_Click")
    End If
End Sub


Public Sub GetBase As Object
    Return xBase
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Ciao mario fa riferimento la thread sul forum inglese english forum link
Sì, l'ho visto ma... diciamo che non è pulitissimo.
Magari allega qui il progettino, anziché la classe come testo, e gli dò un'occhiata.

Quanto detto da @Star-Dust è corretto; manca il fatto che hai inizializzato le tue Label senza dargli un nome evento, da usare poi come ha scritto @Star-Dust


P.S. Ecco, nello stesso istante in cui scrivevo questo post, tu allegavi la classe (a meno che il tuo non sia un progetto completo, allega questo, è molto meglio. Esportalo clickando sul commento:
B4X:
'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip
 

Star-Dust

Expert
Licensed User
Longtime User
Se le Label sono create nel Design. Quindi per catturare l'evento devi usare il nome delle Label dichiarate nel Design. Adesso non hai allegato il Layou quindi non saprei, ma supponendo che si chiamassero Label1 e Label2

B4X:
Private Label1_Click

End Sub

Private Label2_Click

End Sub

Ma se ti riferisci a quelle dichiarate all'interno (come dummyIcon) allora hai sbagliato l'inizializzazione
B4X:
Dim dummyIcon As Label
dummyIcon.Initialize("dummyIcon")
e l'evento
B4X:
Private Sub dummyIcon_Click

End Sub
Aggiungo che stai usando anche lbl passato dal Design e lo assegni a CaptionLabel. Non sono sicuro che puoi ricevere le'vento su lbl_Click, quindi se è per Android dovresti usare i reflection per cambiare l'evento (cosa che sconsiglio) oppure usa un'altra label (cosa che consiglio)
 

LucaMs

Expert
Licensed User
Longtime User
Aggiungo che stai usando anche lbl passato dal Design e lo assegni a CaptionLabel. Non sono sicuro che puoi ricevere le'vento su lbl_Click, quindi se è per Android dovresti usare i reflection per cambiare l'evento (cosa che sconsiglio) oppure usa un'altra label (cosa che consiglio)
Sì, come detto, non è proprio pulitissimo (anche l'utilizzo dell'oggetto Base, oltre a lbl).
Meglio che alleghi il progetto e gli diamo un'aggiustata (magari con commenti che spieghino).
 

Star-Dust

Expert
Licensed User
Longtime User
Aggiungo che stai usando anche lbl passato dal Design e lo assegni a CaptionLabel. Non sono sicuro che puoi ricevere le'vento su lbl_Click, quindi se è per Android dovresti usare i reflection per cambiare l'evento (cosa che sconsiglio) oppure usa un'altra label (cosa che consiglio)
Terzo e non meno importante assegni una Label ad altre due. Le label non si duplicano come una stringa ma punteranno allo stesso oggetto
B4X:
Dim dummyIcon As Label
dummyIcon.Initialize("HomeIcon")
dummyIcon.Typeface     = Typeface.MATERIALICONS
dummyIcon.Text            = Chr(0xE88A)
dummyIcon.TextSize    = GetMaxIconTextsize(dummyIcon)

HomeIcon                  = dummyIcon
HomeIcon.Font             = xIconFont
HomeIcon.SetTextAlignment("CENTER", "CENTER")
HomeIcon.Text             = mHomeIconText
HomeIcon.TextSize     = dummyIcon.TextSize
HomeIcon.TextColor     = xui.PaintOrColorToColor(mTextColor)

Dim dummyIcon As Label ' Aggiungi questo'
dummyIcon.Initialize("MenuIcon")
MenuIcon                    = dummyIcon
MenuIcon.Font             = xIconFont
MenuIcon.SetTextAlignment("CENTER", "CENTER")
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
PS ho letto i tuoi post sulle collaborazioni di sviluppo ecc e mi piacerebbe partecipare per quanto di mia competenza.
Se ti riferisci all'App per autotrasporti sono al momento fermo perchè nel mio "bacino di utenza" non avrei a chi venderlo.
Per lo scontrino elettronico è già finito. Vedi qua
 

Star-Dust

Expert
Licensed User
Longtime User

Star-Dust

Expert
Licensed User
Longtime User
Dicevo alla tua CustomView, hai risolto?
 

Star-Dust

Expert
Licensed User
Longtime User
ripeto il consiglio in maniera ancora piu semplice
B4X:
Dim dummyIcon As Label
dummyIcon.Initialize("HomeIcon")
dummyIcon.Typeface     = Typeface.MATERIALICONS
dummyIcon.Text            = Chr(0xE88A)
dummyIcon.TextSize    = GetMaxIconTextsize(dummyIcon)

HomeIcon                  = dummyIcon
HomeIcon.Font             = xIconFont
HomeIcon.SetTextAlignment("CENTER", "CENTER")
HomeIcon.Text             = mHomeIconText
HomeIcon.TextSize     = dummyIcon.TextSize
HomeIcon.TextColor     = xui.PaintOrColorToColor(mTextColor)

Dim dummyIcon As Label ' Aggiungi questo'
dummyIcon.Initialize("MenuIcon")
MenuIcon                    = dummyIcon
MenuIcon.Font             = xIconFont
MenuIcon.SetTextAlignment("CENTER", "CENTER")

eventi
B4X:
Private Sub HomeIcon_Click

End Sub

Private Sub MenuIcon_Click

End Sub

Per quanto riguarda la lbl credo che meglio che la cambi
 

Gianni Sassanelli

Active Member
Licensed User
Longtime User
Non puoi "postare" il progetto? Comprende altro, oltre alla tua CV?

Va beh, ora sono un po' libero (anche se finora ho smanettato con codice, quindi non lucidissimo) e magari provo a prelevarla così come l'hai pubblicata.

ok dammi qualche minuto
 
Top