Italian [NON VA BENE] [B4A] ridimensionare un Layout a Runtime

ivanomonti

Expert
Licensed User
Longtime User
Dal suggerimento di @LucaMs ho scritto questo piccolo frammento, ma non da i risultati desiderati, qui sotto la risposta voluta da me visto che sono 10 :)

1. Non avrai altri dèi all'infuori di me.
2. Non nominare invano il nome di Dio.
3. Ricordati di santificare le feste.
4. Onora il padre e la madre.
5. Non uccidere.
6. Non commettere atti impuri.
7. Non rubare.
8. Non dire falsa testimonianza.
9. Non desiderare la donna d'altri.
10. Non desiderare i beni d'altri.

01.png
1680716751966.png
1680716850633.png


code:
Private Sub CreateItem(Width As Int, m As Map) As Panel
   
    Dim p As B4XView = xui.CreatePanel("")
    Dim height As Int = 280dip
    If GetDeviceLayoutValues.ApproximateScreenSize < 4.5 Then height = 310dip
   
    p.SetLayoutAnimated(0, 0, 0, Width, height)
    p.LoadLayout("frame1")
   
    Label1.Text = m.Get("ms_gpt_01_04").As(String).ToUpperCase
    Label2.Text = m.Get("ms_gpt_01_05").As(String).ToLowerCase
   
    Dim su As StringUtils
    Dim valueH As Int = su.MeasureMultilineTextHeight(Label2, Label2.Text)
   
    If valueH > Label2.Height Then
        Log("String h: " & valueH & "- label h: " & Label2.Height & " = " & (valueH-Label2.Height))
        valueH = valueH-Label2.Height
        For Each v As B4XView In p.GetAllViewsRecursive
            If v Is Panel Then
                If v.As(Panel).Tag ="pane1" Then
                    Log("old panel h: " & v.As(Panel).Height)
                    v.As(Panel).Height = (v.As(Panel).Height + valueH)
                    Log("new panel H: " & v.As(Panel).Height)
                End If
            End If
        Next
    End If

    AS_TabMenuAdvanced1.AddTab("Love",Null,Null)
    AS_TabMenuAdvanced1.AddTab("Copy",Null,Null)
    AS_TabMenuAdvanced1.AddTab("Print",Null,Null)
    AS_TabMenuAdvanced1.GetTab(2).xTab.Enabled = False
    AS_TabMenuAdvanced1.AddTab("Speect",Null,Null)
    AS_TabMenuAdvanced1.Refresh

    AS_TabMenuAdvanced1.Tag = m
   
    Return p
   
End Sub

qualcuno di voi mi da una sbirciata al codice, magari non vedo l'errore o mi da dei consigli.
 
Last edited:

ivanomonti

Expert
Licensed User
Longtime User
Corretto ma non mi fa impazzire visto che avevo ancorato tutti gli elementi

1680718609586.png

corretto ma non mi fa impazzire:
Private Sub CreateItem(Width As Int, m As Map) As Panel
   
    Dim p As B4XView = xui.CreatePanel("")
    Dim height As Int = 280dip
    If GetDeviceLayoutValues.ApproximateScreenSize < 4.5 Then height = 310dip
   
    p.SetLayoutAnimated(0, 0, 0, Width, height)
    p.LoadLayout("frame1")
   
    Label1.Text = m.Get("ms_gpt_01_04").As(String).ToUpperCase
    Label2.Text = m.Get("ms_gpt_01_05").As(String).ToLowerCase
   
    Dim su As StringUtils
    Dim valueH As Int = su.MeasureMultilineTextHeight(Label2, Label2.Text)
   
    If valueH > Label2.Height Then
        Log("String h: " & valueH & "- label h: " & Label2.Height & " = " & (valueH-Label2.Height))
        valueH = valueH-Label2.Height
        For Each v As B4XView In p.GetAllViewsRecursive
            If v Is Panel Then
                If v.As(Panel).Tag ="pane1" Then
                    Log("old panel h: " & v.As(Panel).Height)
                    v.As(Panel).Height = (v.As(Panel).Height + valueH)
                    v.As(Panel).Parent.As(B4XView).Height = v.As(Panel).Height
                    p.SetLayoutAnimated(0, 0, 0, v.As(Panel).Width, v.As(Panel).Height)
                    Log("new panel H: " & v.As(Panel).Height)
                End If
            End If
            If v Is Label Then
                If v.As(Label).Tag = "Label2" Then
                    v.As(Label).Height = v.As(Label).Height + valueH
                End If
            End If
'            If v Is B4XView Then
'                If v.As(B4XView).Tag = "TabMenu" Then
'                    v.As(B4XView).Top = v.As(B4XView).Top + valueH
'                End If
'            End If
        Next
        AS_TabMenuAdvanced1.mBase.Top = AS_TabMenuAdvanced1.mBase.Top + valueH
    End If

    AS_TabMenuAdvanced1.AddTab("Love",Null,Null)
    AS_TabMenuAdvanced1.AddTab("Copy",Null,Null)
    AS_TabMenuAdvanced1.AddTab("Print",Null,Null)
    AS_TabMenuAdvanced1.GetTab(2).xTab.Enabled = False
    AS_TabMenuAdvanced1.AddTab("Speect",Null,Null)
    AS_TabMenuAdvanced1.Refresh

    AS_TabMenuAdvanced1.Tag = m
   
    Return p
   
End Sub
 

ivanomonti

Expert
Licensed User
Longtime User
Corretto ma non mi fa impazzire visto che avevo ancorato tutti gli elementi

View attachment 140990
corretto ma non mi fa impazzire:
Private Sub CreateItem(Width As Int, m As Map) As Panel
  
    Dim p As B4XView = xui.CreatePanel("")
    Dim height As Int = 280dip
    If GetDeviceLayoutValues.ApproximateScreenSize < 4.5 Then height = 310dip
  
    p.SetLayoutAnimated(0, 0, 0, Width, height)
    p.LoadLayout("frame1")
  
    Label1.Text = m.Get("ms_gpt_01_04").As(String).ToUpperCase
    Label2.Text = m.Get("ms_gpt_01_05").As(String).ToLowerCase
  
    Dim su As StringUtils
    Dim valueH As Int = su.MeasureMultilineTextHeight(Label2, Label2.Text)
  
    If valueH > Label2.Height Then
        Log("String h: " & valueH & "- label h: " & Label2.Height & " = " & (valueH-Label2.Height))
        valueH = valueH-Label2.Height
        For Each v As B4XView In p.GetAllViewsRecursive
            If v Is Panel Then
                If v.As(Panel).Tag ="pane1" Then
                    Log("old panel h: " & v.As(Panel).Height)
                    v.As(Panel).Height = (v.As(Panel).Height + valueH)
                    v.As(Panel).Parent.As(B4XView).Height = v.As(Panel).Height
                    p.SetLayoutAnimated(0, 0, 0, v.As(Panel).Width, v.As(Panel).Height)
                    Log("new panel H: " & v.As(Panel).Height)
                End If
            End If
            If v Is Label Then
                If v.As(Label).Tag = "Label2" Then
                    v.As(Label).Height = v.As(Label).Height + valueH
                End If
            End If
'            If v Is B4XView Then
'                If v.As(B4XView).Tag = "TabMenu" Then
'                    v.As(B4XView).Top = v.As(B4XView).Top + valueH
'                End If
'            End If
        Next
        AS_TabMenuAdvanced1.mBase.Top = AS_TabMenuAdvanced1.mBase.Top + valueH
    End If

    AS_TabMenuAdvanced1.AddTab("Love",Null,Null)
    AS_TabMenuAdvanced1.AddTab("Copy",Null,Null)
    AS_TabMenuAdvanced1.AddTab("Print",Null,Null)
    AS_TabMenuAdvanced1.GetTab(2).xTab.Enabled = False
    AS_TabMenuAdvanced1.AddTab("Speect",Null,Null)
    AS_TabMenuAdvanced1.Refresh

    AS_TabMenuAdvanced1.Tag = m
  
    Return p
  
End Sub
In effetti non va bene per nulla :-(
 

LucaMs

Expert
Licensed User
Longtime User
Dim height As Int = 280dip
If GetDeviceLayoutValues.ApproximateScreenSize < 4.5 Then height = 310dip
Intanto mi pare che le due righe sopra, consecutive, facciano un po' a pugni.
Se il disposivito è molto piccolo, meno di 4,5 pollici, imposti l'altezza (suppongo dell'item, mi sono fermato là, per ora) a 310dip altrimenti rimane quello impostato in precedenza, 280dip? Suppongo debba essere il contrario, no?!

Magari allega ad un post i layout (non il progetto), così possiamo provarli.


[
A che scopo quel AS_TabMenuAdvanced? E' questa parte, no?!
1680763291610.png

Basterebbe un Panel. Inoltre, con tre belle icone sarebbe meglio.
"Speect"???

]
 

ivanomonti

Expert
Licensed User
Longtime User
Intanto mi pare che le due righe sopra, consecutive, facciano un po' a pugni.
Se il disposivito è molto piccolo, meno di 4,5 pollici, imposti l'altezza (suppongo dell'item, mi sono fermato là, per ora) a 310dip altrimenti rimane quello impostato in precedenza, 280dip? Suppongo debba essere il contrario, no?!

Magari allega ad un post i layout (non il progetto), così possiamo provarli.


[
A che scopo quel AS_TabMenuAdvanced? E' questa parte, no?!
View attachment 141007
Basterebbe un Panel. Inoltre, con tre belle icone sarebbe meglio.
"Speect"???

]
il frame che carico Layout e di 320x600

si la parte sopra è un AS_TabMenuAdvanced che rifarò a modo mio

le voci dei bottoni lasciale stare che verranno tutte cambiate.
 

ivanomonti

Expert
Licensed User
Longtime User
Questo è il frame (layout), ma mi serve il contatore come qui presente, che non mi piace il presente

01.png
 

Attachments

  • frame1.bal
    3.5 KB · Views: 48

LucaMs

Expert
Licensed User
Longtime User
Questo è il frame (layout), ma mi serve il contatore come qui presente, che non mi piace il presente

View attachment 141009

Una coscia per volta!

Dal primo post mi sembra d'aver capito che non riesci a visualizzare tutti e 10 i comandamenti, nell'esempio, ovvero dimensionare l'altezza dell'item a runtime!
Il file di layout che hai allegato non è uguale né simile a quello che che hai pubblicato nel primo post!
1680764562013.png


E' così:
1680764617777.png


Stesse 3 view ma in posizioni diverse (sempre meglio dare un nome significativo alle View (ed a tutto), anziché lasciare quelli di default, Label1, Lable2, etc)
 

ivanomonti

Expert
Licensed User
Longtime User
@LucaMs lo so e hai ragione solo questo layout ha questi nomi di default, si ho cambiato le disposizioni e allungato il form ma il problema non cambia, ho creato anche un codice a se perché se non viene prima inserito quindi inizializzato non posso prendere le misure in altezza text in quanto la label non è inizializzata e va in crash ma a debug diciamo che funziona ma a runtime va in crash
 

LucaMs

Expert
Licensed User
Longtime User
Non è il massimo (non ho impostato trasparenze) ma consente di adattare l'altezza degli item, come serve a te.

Non ho quella AS_TabMenuAdvanced, per cui l'ho sostituita con un Panel (cosa che potresti fare anche tu, mettendoci dentro 3 B4XImageView al posto dei tasti e una Label per il contatore di Like).



[3/4 d'ora di lavoro/tentativi? Dovrei farti pagare 3/4 di 30€ 😁 + 800€ per tutte le risposte che ti ho dato in questi giorni 🤣 ]
 

Attachments

  • IvanoLayout.zip
    16 KB · Views: 41

ivanomonti

Expert
Licensed User
Longtime User
View attachment 141016

Meglio, no? Con possibilità più righe anche per la domanda.
wow non posso crederci, in effetti la domanda su 2 righe non l'ho posta come problema ma credo si sia bene che la domanda possa essere su più righe, grazie davvero anche perché as_tab non si gestisce bene a runtime.

il problema poi e dei numeri tipo cuore o mytoken o mypost che possono superare le migliaia quindi numeri alti esempio 100000 mytoken, o 2000 domande poste ecc ecc.
 

LucaMs

Expert
Licensed User
Longtime User
wow non posso crederci, in effetti la domanda su 2 righe non l'ho posta come problema ma credo si sia bene che la domanda possa essere su più righe, grazie davvero anche perché as_tab non si gestisce bene a runtime.

il problema poi e dei numeri tipo cuore o mytoken o mypost che possono superare le migliaia quindi numeri alti esempio 100000 mytoken, o 2000 domande poste ecc ecc.
Alura... ti mando quell'ultima versione?
 
Top