2012-01-20 6 views
11

Se dichiaro LinearLayout linearLayout e guardo linearLayout.getLayoutParams(), mi dà ViewGroup.LayoutParams, non LinearLayout.LayoutParams.Perché l'istanza di LinearLayout instance.getLayoutParams sembra avere una classe errata?

Quindi devo usare la ripetizione (e quindi cattivo) Stile della costruzione di:

int lm = ((LinearLayout.LayoutParams) linearLayout.getLayoutParams()).leftMargin? 

Devo veramente usarlo, se voglio raggiungere i margini, ad esempio?

È la mia incomprensione di Android o Java, o di entrambi o qualcos'altro?

risposta

20

Credo che la vostra comprensione 'LayoutParams' non è corretto. Una vista (o il layout) LayoutParams deve essere un'istanza di "LayoutParams della vista principale".

Ad esempio, ecco un LinearLayout in RelativeLayout. I LayoutParam di LinearLayout devono essere RelativeLayout.LayoutParams. Questa cosa ci consente di impostare correttamente gli attributi, come "centerInParent", ecc.

Quando si chiama getLayoutParams(), restituisce varie istanze di LayoutParams che corrispondono al tipo ViewGroup padre. Di conseguenza, abbiamo bisogno di trasmettere ripetutamente il tipo di layoutParams di una vista quando si chiama getLayoutParams().

+1

Spiacente, il tipo che restituisce da linearLayout.getLayoutParams non ha nulla in comune con la classe di layout che contiene linearLayout. Per quanto riguarda la praticità, assegnarmi la classe padre 'LayoutParams è insensato - se ne ho bisogno, potrei trasmettere linearLayout a ViewsGroup e prendere i suoi getLayputParams e renderli universali. Ma Android mi dà * solo * ViewsGroup.LayoutParams. – Gangnus

+1

Poiché è ambiguo, non può essere restituito un tipo specifico di LayoutParams mentre non è un tipo generico. Il sistema non può sapere di che tipo si tratta. La tua domanda non ha senso per me. – lulumeya

+0

Se linearLayout ha una classe di LinearLayout, la funzione linearLayout.getLayoutParams è quella della classe LinearLayout e potrebbe facilmente restituire la classe LinearLayout.LayoutParams. Dov'è l'errore? – Gangnus

1

Si sta utilizzando Eclipse e si utilizza semplicemente l'opzione 'Organizza le importazioni' di Eclipse per importare le librerie Android? Se è così, ci sono alcune librerie diverse chiamate LayourParams, Eclipse sembra importare la framelayout e non la linearlayout di cui hai bisogno.

Quindi basta cambiare le importazioni nella parte superiore della classe.

+0

Nella classe uso ViewGroups.getLayoutParams e LinearLayout.getLayoutParams. Non riesco a inserire l'importazione android.widget.LinearLayout.LayoutParams anziché importare android.view.ViewGroup.LayoutParams. Potrei usare in qualche modo entrambi? – Gangnus

2

Non inoltrare LinearLayout.LayoutParams a LinearLayout.LayoutParams. Non ha senso. Inoltre, non è chiaro se linearLayout nel codice sia una variabile di istanza ... In ogni caso, puoi semplicemente consultare LayoutParams all'interno di una vista che si estende da un certo tipo di vista per ottenere i layoutParam della vista. Per esempio, se sei dentro di una classe che si estende da RelativeLayout, quindi

LayoutParams params = new LayoutParams(200, LayoutParams.WRAP_CONTENT); 

si RelativeLayout.LayoutParams ottiene. Altrimenti, dovrai qualificare lo LayoutParams che stai cercando. Per ricevere/applicare LinearLayout LayoutParams, è sufficiente

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(); 

EDIT

linearLayout.getLayoutParams() restituisce il layoutParams che hai fornito quando hai chiamato setLayoutParams, quindi assicuratevi prima di farlo. Quindi, una volta fatto ciò, devi semplicemente trasmettere lo LayoutParams che è stato restituito a LayoutParams. so

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linearLayout.getLayoutParams() 

Inoltre, perché è necessario ottenere i parametri come questo? Cosa stai cercando di realizzare in definitiva? Chiedo perché potrebbe esserci un modo più semplice per fare ciò che stai cercando di fare ...

In effetti, la risposta alla tua domanda è SÌ, devi lanciare i LayoutParam che ottieni da getLayoutParams perché questo è un metodo derivato dalla classe View che restituisce la superclasse di LayoutParams che è ViewGroup.LayoutParams che, a causa del polimorfismo, può essere convertito nel tipo che si sa essere.

+0

@Gangnus non so di cosa stai parlando. Non esiste una cosa come LinearLayout.LayoutParams.rightMargin. Basta chiamare params.setMargins (int, int, int, int). – LuxuryMode

+0

Spiacente, ho perso tre lettere nel nome della funzione – Gangnus

+0

+1 per l'aiuto nella ricerca di errori nella variante iniziale della domanda. Grazie. Ma per favore, se aiuterai ulteriormente la domanda, fai un'altra risposta - la domanda è cambiata in modo significativo. – Gangnus

0

Non è necessario ottenere l'oggetto Params LinearLayout dallo stesso LinearLayout. Puoi crearne uno nuovo da solo.

// Set up the height and width of the layout, you can set FILL_PARENT 
// or even WRAP_CONTENT 
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width, height); 
// Set up your margins 
lp.setMargins(left, top, right, bottom); 

Ora utilizzare questo oggetto lp sul tuo LinearLayout istanza dell'oggetto

linearLayout.setLayoutParams(lp); 
+0

Se vuoi leggere leftMargin, non è necessario impostare un nuovo parametro. Ancora di più, anche se è necessario * set * leftMargin, non si vuole veramente cancellare tutti gli altri parametri di layout. – Gangnus

6

Proprio per dirla in un modo molto semplice:

Si prega di tenere presente che quando si ottiene il LayoutParams di vista, la loro classe è determinata dalla classe della vista padre di questa visione.

Questo implica molto importante fatto:

Bisogna lanciare i LayoutParams di una vista perché non si può sapere in anticipo che cosa è la classe del genitore. Quindi, se genitore vista s' è un LinearLayout, è LayoutParams saranno di tipo LinearLayout.LayoutParams e ANCORA si devono lanciare a questo tipo!


non sono sicuro del codice sorgente e come va. Ma è molto logico dal momento che RelativeLayout.LayoutParams, ad esempio, ha proprietà come ABOVE e BELOW che non si trovano in un LinearLayout.LayoutParams. E questi parametri sono in realtà dipendenti dal genitore.

+0

Il campo protetto mLayoutParams utilizzato per dare il risultato di questa funzione, appartiene alla Vista stessa, non al suo genitore. I valori di ritorno, ad esempio i margini, appartengono a questa stessa vista. Il genitore può essere di qualsiasi tipo, il risultato della funzione è sempre della classe ViewsGroup.LayoutParams, non dipende dalla classe del genitore. La funzione esiste anche per il layout radice e non ha genitori, lo schermo è il suo genitore. Perché pensi che la loro classe sia determinata dal genitore? Non vedo alcun senso in quel pensiero - tutto è contro di esso. – Gangnus

+0

Non sono sicuro del codice sorgente e di come va. Ma è molto logico dal momento che RelativeLayout.LayoutParams, ad esempio, ha proprietà come ABOVE e BELOW che non si trovano in un LinearLayout.LayoutParams. E questi parametri sono in realtà dipendenti dal genitore. –

+0

Vedo ora. E poiché per i genitori diversi i campi potrebbero essere diversi, ottengo il riferimento per i parametri del genitore più primitivo possibile e successivamente lo lancio alla classe, che so, soddisferà tutti i campi di cui ho bisogno. Molto complicato, ma ha senso. --- Lulumeia me l'ha detto prima, ma la tua spiegazione era comprensibile. Grazie, e ho il jackpot :-) – Gangnus

Problemi correlati