Italian Domanda su dimensione Layout

Sberla

Active Member
Licensed User
Longtime User
ragazzi posso sapere su b4a in runtime , quantè la dimensione del layout disegnato prima di caricarlo con LoadLayout in un panel ??!?

il layout lo disegno tramite design, "ovviamente io che la disegno conosco la dimensione " ma voglio beccare le dimensioni in modo che la classe che sto realizzando si adatti dinamicamente, ai futuri layout senza saperne le dimensioni.

Grazie in anticipo!
 

Sberla

Active Member
Licensed User
Longtime User
se la carico con LoadLayout mi carica il layout in base alla dimensione del pannello, e non in base alle dimensioni del layout creato tramite design, come faccio a ridimensionare il pannello della stessa dimensione del layout creato in b4a design?

Spero di essere stato chiaro..
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
quando crei un layount e non usi alcun script di ridimensionamento, le dimensioni e posizioni dei vari oggetti restano quelle create con il designer, non viene eseguito nessun ridimensionamento automatico, quindi se leggi le dimensioni sono quelle create da layount, se poi vuoi sapere le dimensioni della activity, ossia della superficie di base , quella dove poi andrai a mettere ogni view, allora non so risponderti, se fai un log(activity.width) prima e dopo il load layount avrai sempre lo stesso risultato ovvero la dimensione del dispositivo, invece se vai a fare il log delle dimensioni di un oggetto avrai le dimensioni inserite quando lo crei dal designer, purché tu non abbia inserito uno script di ridimensionamento, se riscontri di non averle allora controlla che non si siano script
 

udg

Expert
Licensed User
Longtime User
Un trucco che puoi sempre provare è creare al volo un pannello che abbia proprietà visible=False ed effettuare il loadlayout lì dentro per catturare le dimensioni che ti servono. Poi elimini il pannello fantasma, usi quei valori come ti occorre ed infine carichi di nuovo il layout nel pannello reale e definitivo.
Sembra laborioso ma in fondo è banale. L'unico vero inconveniente è il tempo di caricamento complessivo che per layout complessi potrebbe divenire un po' noioso.

Questo per rispondere direttamente al quesito. Se poi devo dirti la verità, non mi è ben chiaro ciò che ti prefiggi di fare.
Se disegni bene il layout, con i suoi script in modo che le posizioni dei vari oggetti siano relative tra loro, allora dovresti ottenere di default un riposizionamento generale quando quel layout viene caricato in un pannello più o meno grande.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Un trucco che puoi sempre provare è creare al volo un pannello che abbia proprietà visible=False ed effettuare il loadlayout lì dentro per catturare le dimensioni che ti servono. Poi elimini il pannello fantasma, usi quei valori come ti occorre ed infine carichi di nuovo il layout nel pannello reale e definitivo.
Sembra laborioso ma in fondo è banale. L'unico vero inconveniente è il tempo di caricamento complessivo che per layout complessi potrebbe divenire un po' noioso.
Sempre se elimini AutoScaleAll.
 

Sberla

Active Member
Licensed User
Longtime User
Grazie per le risposte, per "LordZenzo" il layout creati non sono quelli standard.

Per LucaMS ed udg sto seguendo la tua procedura, creando un layoutfile senza Autoscale:

panelinterno.Visible=False
panelinterno.LoadLayout(layoutfile)
width=panelinterno.Width
height=panelinterno.Height

però quando il compilatore in debug arriva sul width , si chiude con il seguente errore:
Log: at java.lang.reflect.Method.invokeNative(Native Method)
 

udg

Expert
Licensed User
Longtime User
Ti sei ricordato di aggiungere (addview) il panelinterno all'activity prima di cercare di leggere le sue dimensioni?
In pratica dovresti avere qualcosa del genere:
B4X:
dim pnlInterno as panel
pnlInterno.Visible = False
pnlInterno.LoadLayout(lytMyLayout)
pnlInterno.tag = "pnlxxx"
activity.addview(pnlInterno, ...)
sleep(100) ' o quello che serve per assicurarsi che il panel sia completamento aggiunto e formato nell'activity
'e poi finalmente leggi width e height
log(pnlInterno.width)

ps: il tag può essere utile se ad un certo punto vuoi rimuovere il panel interno piuttosto che averlo nascosto. A dire il vero, io farei proprio così... eheh
 

Sberla

Active Member
Licensed User
Longtime User
udg, grazie per la risposta ma facendo come fai tu con :
activity.addview(pnlInterno, ...)
il metodo "addview" vuole le dimensioni del pannello da caricare, quindi se gli passo activity.addview(panelinterno,0,0,30,30) mi ritornerà 30,30 certo perchè lo carico di quelle dimensioni e non delle dimensioni del layout creato con il design..
 

udg

Expert
Licensed User
Longtime User
Ciao, è questo il punto che non capivo dall'inizio. Tu prepari una serie di layout di dimensioni variabili. Poi vorresti caricarle in un pannello/activity e calcolarne a runtime le dimensioni.
Ma in realtà il pannello ricevente, per inserirsi correttamente in un layout "fisso" di appartenenza, nel senso di avere una prevedibile collocazione, dovrebbe essere aggiunto alla activity con delle coordinate predeterminate (anche nel senso di % rispetto all'activity). Ad esempio un header puoi stabilire che occupi il 100% della larghezza (dell'activity) e il 10& dell'altezza. Poi in questo header carichi il layout lytHeader che avendo gli elementi disposti in modo relativo tra loro si "adatta" allo spazio occupato dal pannello header nell'ambito dell'activity.

Nel caso precedente, quindi, penserei ad un activity.addview(panelInterno, 0,0, activity.width * 0.50dip, activity,height * 0.10dip) ' 50% oriz, 10% vert

Ti torna?
 

Sberla

Active Member
Licensed User
Longtime User
Si ma non voglio che si adatti, voglio semplicemente calcolare la dimensione del layout creata dal programmatore, tipo se un programmatore crea un layout non standard 200x200 voglio che b4a mi legga questa dimesione, forse sto chiedendo troppo !
 

udg

Expert
Licensed User
Longtime User
Ci devo pensare..per ora vado a pranzo. Intanto, giusto perchè io possa meglio comprendere, mi spiegheresti come utilizzeresti questa informazione?
Immagino di avere due layout: uno "standard" 320x480 scale 1, ed uno 200x200 scale1.
Come utilizzo questa informazione in un'app che magari gira su un device 1280 x 800 scale 1.5? A cosa serve?

ps: se non hai ancora pranzato, buon pranzo anche a te!
 

Sberla

Active Member
Licensed User
Longtime User
sto creando una classe dinamica, che crea un "popup view" tipo questo:

21762244_10214285369598115_4435429306294911174_n.jpg


nella creazione, o generato 2 container uno quello di sfondo "nero", e il 2 il container centrale quello più piccolino al centro, esso deve assumere il valore del layout che crea il programmatore da interfaccia design, appunto già ti dicevo, non voglio adattare il container ad un valore fisso è farlo scalare perchè la classe può essere utilizzata su più dispositivi, mobile,tablet,cellulari, quindi vorrei che il container assuma il valore del layout che disegna il programmatore stesso, in base a dove utilizza la classe. Potrei passare il valore mediante metodo, ma non mi piaceva molto idea..


Spero di averti reso le idee più chiare, buon pranzo!
Grazie, grazie,grazie per il tempo che mi dedichi!
 

LucaMs

Expert
Licensed User
Longtime User
esso deve assumere il valore del layout che crea il programmatore da interfaccia design
Veramente dovresti fare in modo che sia il layout ad adattarsi al panel centrale (diciamo la dialog), non viceversa.

Al limite il panel centrale lo crei in percentuale rispetto all'Activity o con ScaleRate impostato a 1 (e AutoScaleAll, ovviamente).
 

LucaMs

Expert
Licensed User
Longtime User
Ho l'impressione che ti stia impelagando in un problema inesistente, non l'ho mai fatto ma credo che se inserisci come dimensioni le percentuali il risultato sarà ottimizzato al layout che conterrà il pop-up
mica tanto. Se il panel-dialog ha forma quadrata ed il layout da caricare è invece rettangolare, magari con un lato molto più lungo dell'altro, anche se usi le percentuali ti impicchi.
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
mica tanto. Se il panel-dialog ha forma quadrata ed il layout da caricare è invece rettangolare, magari con un lato molto più lungo dell'altro, anche se usi le percentuali ti impicchi.
infatti non dicevo che viene "visivamente" bello o giusto ma solo ottimizzato, poi si ci sono molte differenze tra device sulle proporzioni, ma le differenze non sono mai drammatiche, cioè si esiste 16:9 il 15:9 il 17:9 ma per fortuna non esiste un device 120:9, per ora
 

Star-Dust

Expert
Licensed User
Longtime User
Ma perché ancora si vendono?
Certo, tipo gli asus e LG. Io ho LG w100 quadrato.
Volevo comprare il Fossil Q Marshall e l'ho trovato a prezzi stracciati........ Ma é anche vero che non servono a un emerito niente... lo posso dire con cognizione di causa.... non uso quasi mai il mio LG.

E' vero che puoi leggere e inviare messaggi SMS e WhatsApp senza aprire il telefono... ma quello che fa uno smarthwatch é poco per giustificare dei costi cosi elevati.
 
Top