Italian Posizionamento View (senza Designer)

zakker

Member
Licensed User
Ciao,
ho un problema con il posizionamento delle view: nello specifico vorrei usare le label in modo che si adattino automaticamente, in larghezza e/o altezza, al testo contenuto.
Ho utilizzato quindi
Panel1.AddView(Label1,0,2dip,100%x,-2)

dove il -2 indica l'adattamento in altezza... e in effetti funziona...

Il mio problema è che se cerco di mettere sotto la Label un'altra View (ad esempio uno Spinner) questa mi si sovrappone alla Label e non tiene conto del TOP che gli imposto io, con il codice seguente
(tutte le View sono state ovviamente inizializzate)

B4X:
  Activity.AddView(Panel1,0,0,100%x,100%y)
  Panel1.AddView(Label1,0,2dip,100%x,-2)
  Panel1.AddView(Spinner1,0,Label1.Top+Label1.Height+2dip,100%x,40dip)

se invece uso

B4X:
  Activity.AddView(Panel1,0,0,100%x,100%y)
  Panel1.AddView(Label1,0,2dip,100%x,35dip)
  Panel1.AddView(Spinner1,0,Label1.Top+Label1.Height+2dip,100%x,40dip)

esplicitando l'altezza della Label, allora tutto funziona correttamente.

Dove sbaglio? O è impossibile fare ciò che vorrei ?

Grazie a tutti
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Al volo ed a naso (fidati, sono molto dotato di naso :p) direi che quel -2 (mai usato) funziona nel momento in cui la label viene visualizzata.

Se è così, prova a posizionare il panel in una routine che richiamerai con una CallSubDelayed nella Activity_Create oppure chiamala direttamente nella Activity_Resume.

Detto questo, dato che sono curioso, intanto provo :)
 

zakker

Member
Licensed User
Al volo ed a naso (fidati, sono molto dotato di naso :p) direi che quel -2 (mai usato) funziona nel momento in cui la label viene visualizzata.

Se è così, prova a posizionare il panel in una routine che richiamerai con una CallSubDelayed nella Activity_Create oppure chiamala direttamente nella Activity_Resume.

Detto questo, dato che sono curioso, intanto provo :)

pensavo (speravo) che una volta fatta l'ADDVIEW la view fosse già posizionata sull'Activity o sul Panel per cui l'altezza, anche se "automatica", fosse già nota per il posizionamento sottostante delle altre view...invece non è così, a quanto pare....

Del -2 ho letto ieri un post di Erel dove ne parlava.
 

LucaMs

Expert
Licensed User
Longtime User
Per ottenere la "nuova" altezza della label si deve usare la Reflection.
Questo codice funziona:
B4X:
Sub Activity_Create(FirstTime As Boolean)

    Panel1.Initialize("Panel1")
    Label1.Initialize("Label1")
    Spinner1.Initialize("Spinner1")

    Activity.AddView(Panel1,0,0,100%x,100%y)
   
    Panel1.Color = Colors.Blue

    Label1.Color = Colors.White
    Label1.TextColor = Colors.Black
    Label1.TextSize = 20
    Label1.Text = "Ciao"

    Panel1.AddView(Label1,0,2dip,100%x,-2)
    Label1.Invalidate
    DoEvents
   

    Dim Reflect As Reflector
    Reflect.Target=Label1
    Dim Height As Int = Reflect.RunMethod("getHeight")
    Log(Height)

    Panel1.AddView(Spinner1,0,Label1.Top+Height+2dip,100%x,40dip)
   
    Spinner1.AddAll(Array As String("Domenica", "Lunedì", "Martedì"))

End Sub
 

zakker

Member
Licensed User
Per ottenere la "nuova" altezza della label si deve usare la Reflection.
Questo codice funziona:
B4X:
Sub Activity_Create(FirstTime As Boolean)

    Panel1.Initialize("Panel1")
    Label1.Initialize("Label1")
    Spinner1.Initialize("Spinner1")

    Activity.AddView(Panel1,0,0,100%x,100%y)
 
    Panel1.Color = Colors.Blue

    Label1.Color = Colors.White
    Label1.TextColor = Colors.Black
    Label1.TextSize = 20
    Label1.Text = "Ciao"

    Panel1.AddView(Label1,0,2dip,100%x,-2)
    Label1.Invalidate
    DoEvents
 

    Dim Reflect As Reflector
    Reflect.Target=Label1
    Dim Height As Int = Reflect.RunMethod("getHeight")
    Log(Height)

    Panel1.AddView(Spinner1,0,Label1.Top+Height+2dip,100%x,40dip)
 
    Spinner1.AddAll(Array As String("Domenica", "Lunedì", "Martedì"))

End Sub

non so che sia sto Reflector... e mi scoccia che non esista un manuale/libro che spieghi bene le cose...e che tutto si debba chiedere e scoprire sul forum.
Mi viene male se per ogni label (o altra view) che voglio usare con autosize devo fare 6000 controlli, calcoli ecc...ecc...

Proverò il tuo codice. Per ora grazie

EDIT: Il codice funziona ! però quante complicazioni... Devo aggiungere una libreria, devo aggiungere righe di codice...uffff Dovrò quindi fare una funzione che mi restituisca larghezze e altezze e richiamarla ogni volta che mi serve regolare in base al testo la dimensione delle view.... Bello !

Grazie 1000
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
La Reflection si usa per accedere ad alcune cose (proprietà, metodi,..) che non sono state implementate e comunque a run-time.

http://www.html.it/articoli/introduzione-alla-reflection-1/

Diciamo che strettamente non fa parte di B4A, quindi, ammesso che la documentazione su questo esista (suppongo di sì) sarà comunque poco utile, perché tutto dipende dall'oggetto sotto la lente della Reflection.

Se vuoi usare l'autosize, per forza dovrai fare calcoli.
 

zakker

Member
Licensed User
Il codice funziona ! però quante complicazioni... Devo aggiungere una libreria, devo aggiungere righe di codice...uffff Dovrò quindi fare una funzione che mi restituisca larghezze e altezze e richiamarla ogni volta che mi serve regolare in base al testo la dimensione delle view.... Bello !

Grazie 1000

EDIT: La funzione l'ho fatta.
 

LucaMs

Expert
Licensed User
Longtime User
  • Like
Reactions: udg

udg

Expert
Licensed User
Longtime User
..che la percentuale rispetto ai post è troppo bassa :p]

Per forza, stai sempre a chiacchierare..eheh

HUUUUUUUUUUUUUUUUHHHHHHHH
 
Top