Italian [Risolto] [B4I] Label dentro una ScrollView

Aldo's

Active Member
Licensed User
Buona sera a tutti.
Ho una label con molto testo e vorrei allinearla verticalmente al bordo superiore della stessa. Ho capito che devo ridimensionarla con:
B4X:
        lbl1.As(Label).SizeToFit
Il problema nasce dal fatto che la suddetta label è inserita in una ScrollView.
Ho provato a usare questo codice:
B4X:
        Private p As B4XView = xui.CreatePanel("")
        p.SetLayoutAnimated(0,0,0,Root.Width,Root.Height-90dip)
        p.LoadLayout("Page1")
        asvGiorno.AddPage(p,1)
        ScrollView1.As(ScrollView).Panel.Width = ScrollView1.As(ScrollView).Width
        ScrollView1.As(ScrollView).Panel.Height = 10000dip
        ScrollView1.as(ScrollView).Panel.LoadLayout("Scroll1")
        lbl1.As(Label).Text=sTesto
        lbl1.As(Label).SizeToFit
        ScrollView1.As(ScrollView).ScrollOffsetY = 0
Ma non si vede nulla.
Potete aiutarmi a capire dove sbaglio?
Grazie
 

Aldo's

Active Member
Licensed User
Mi rendo conto che, chi non ha in testa il progetto, non ci ha capito molto.
Faccio un po' di chiarezza.
Ho una ASViewPager (asvGiorno) all'interno delle quali ho 3 Layout ("Page1", "Page2", "Page3").
All'interno di ogni Layout ho una ScrollView (ScrollView1, ScrollView2, ScrollView3)
Ho inserito un Layout all'interno di ogni ScrollView (Scroll1, Scroll2, Scroll3) con dentro una Label ciascuno (lbl1, lbl2, lbl3).
I problemi sono due (in questo momento):
1) Inserire il testo dentro le Label e farlo scrollare (credo che il problema sia dato dal riconoscere la lunghezza della Label e settarla per permettere alla ScrollView di riconoscerla più lunga e permettere lo scroll.
2) In B4I non è possibile settare il Vertical Alignment. Però è possibile con
B4X:
lbl1.As(Label).SizeToFit
rendere la Label della lunghezza corretta per far allineare tutto in alto.

Ora il duplice problema non riesco a risolverlo.
In B4A ero riuscito a fare esattamente quanto volevo...in B4I, in questo caso, il cross-plattform non è efficace.
 

Alexander Stolte

Expert
Licensed User
Longtime User
In B4A ero riuscito a fare esattamente quanto volevo...in B4I, in questo caso, il cross-plattform non è efficace.
Inoltre non è multipiattaforma, poiché si utilizza la scrollview e non la xCustomListView.
Utilizzate xCustomListview e vedrete che funziona ed è multipiattaforma.
 

Aldo's

Active Member
Licensed User
Inoltre non è multipiattaforma, poiché si utilizza la scrollview e non la xCustomListView.
Utilizzate xCustomListview e vedrete che funziona ed è multipiattaforma.
Grazie per il suggerimento.
Ma si può inserire una label nella xCLV a altezza variabile? Come?
 

Aldo's

Active Member
Licensed User
Secondo te è possibile usare un .addtext per un testo lungo (ho solo un valore da inserire nel xCLV)?
 

Alexander Stolte

Expert
Licensed User
Longtime User
Ma si può inserire una label nella xCLV a altezza variabile?
Calcola l'altezza dell'etichetta prima di aggiungerla all'elenco. Se l'altezza cambia di nuovo in seguito, è possibile ricalcolare l'altezza e quindi utilizzare la funzione .ResizeItem per rivedere l'altezza nell'elenco.
 

Aldo's

Active Member
Licensed User
Ancora non ci siamo...colpa mia.
Ho scritto:
B4X:
        sTesto=RS1.GetString("testo")
        Private p As B4XView = xui.CreatePanel("")
        p.SetLayoutAnimated(0,0,0,Root.Width,Root.Height-90dip)
        p.LoadLayout("Page1")
        asvGiorno.AddPage(p,1)
        clv1.Clear
        Dim q As B4XView = xui.CreatePanel("")
        q.SetLayoutAnimated(0,0,0,100%x,100%y)
        q.LoadLayout("ItemCLVP1")
        lblP1.As(Label).Text=sTesto
        lblP1.As(Label).Height=MeasureTextHeight(sTesto,Font.CreateNew2("TimesNewRomanPSMT",16),True)
        clv1.Add(q,"")

Utilizzando queste funzioni:
B4X:
Sub MeasureTextHeight(Text As String,UseFont As Font,Multiline As Boolean) As Double
    Return MeasureText(Text,UseFont,Multiline)(1)
End Sub

Sub MeasureText(Text As String,UseFont As Font,Multiline As Boolean) As Double()
    Dim L As Label
    L.Initialize("")
    L.Font = UseFont
    L.Text = Text
    L.Multiline = Multiline
    L.SizeToFit
    Dim Result(2) As Double
    Result(0) = L.Width
    Result(1) = L.Height
    Return Result
End Sub
ma la Height non viene modificata.
 

LucaMs

Expert
Licensed User
Longtime User
p.SetLayoutAnimated(0,0,0,Root.Width,Root.Height-90dip)
q.SetLayoutAnimated(0,0,0,100%x,100%y)
Sto leggendo riga per riga e così le commento.

Hai creato p alto quanto Root MENO 90dip. Poi, però, hai creato un panel q (bel nome 🤬 😄 ) alto 100%y.

E mi fermo, perché devo leggere meglio la tua questione; essendo per B4i avevo evitato, ma se usi CLV, quindi multipiattaforma, posso capire e "risolvere" (forse).
 

Alexander Stolte

Expert
Licensed User
Longtime User
Utilizzando queste funzioni:
Raccomando la seguente funzione:
In questo caso, tuttavia, l'etichetta deve avere la sua larghezza finale e il carattere finale, in modo da poter calcolare correttamente l'altezza.

q.SetLayoutAnimated(0,0,0,100%x,100%y)
In B4I l'uso di %x e %y non è corretto al di fuori dell'evento di ridimensionamento.
 

Aldo's

Active Member
Licensed User
Hai creato p alto quanto Root MENO 90dip. Poi, però, hai creato un panel q (bel nome 🤬 😄 ) alto 100%y.
Ho già corretto ;)

Il vero problema è la Label, non riesco ad espanderla in altezza.
Ho provato un po' di Log()
L'altezza di sTesto e della Label sono identico
 

Aldo's

Active Member
Licensed User
Grazie, penso sia la soluzione adatta a me.
Ora rimane ancora un dubbio: posso personalizzare il testo che sto inserendo? Font, allineamento (orizzontale) e colori?
 

LucaMs

Expert
Licensed User
Longtime User
B4J_hqwHgqzGUg.gif


Snipet 😊
 

LucaMs

Expert
Licensed User
Longtime User
Grazie, penso sia la soluzione adatta a me.
Ora rimane ancora un dubbio: posso personalizzare il testo che sto inserendo? Font, allineamento (orizzontale) e colori?
Devo vedere, perché ci sono un paio di "oggetti" che lo consentono ma c'è anche una BBLabel (ovviamente se usassi questa, dovresti "tornare" al CLV.Add, non usare CLV.AddTextItem).
 

Aldo's

Active Member
Licensed User
Grazie a @Alexander Stolte e a @LucaMs ho risolto in questo modo:
B4X:
        Dim cs As CSBuilder
        Dim sTesto As String
        sTesto=RS1.GetString("testo")
        cs.Initialize.Font(Font.CreateNew2("TimesNewRomanPSMT",18)).Alignment("ALIGN_LEFT").Color(xui.Color_ARGB(255,128,0,0)).Append(sTesto).PopAll
        Private p As B4XView = xui.CreatePanel("")
        p.SetLayoutAnimated(0,0,0,Root.Width,Root.Height-120dip)
        p.LoadLayout("Page1")
        asvGiorno.AddPage(p,1)
        clv1.Clear
        clv1.AddTextItem(cs, 0)
Inoltre con CSBuilder mi si è aperto un mondo.
Grazie ancora
 
Top