Android: Breite des Layouts programmatisch mit fill_parent in seinem xml

8

Ich habe das a LinearLayout mit der Breite in xml als fill_parent gesetzt, jetzt brauche ich seine Breite zur Laufzeit programmatisch. Also habe ich das getan:

%Vor%

Aber width Wert beim Debugging wurde gefunden -1 , jeder mit Idee, warum kann ich nicht die genaue Breite zur Laufzeit für LinearLayout mit fill_parent im Layout xml gesetzt.

    
Najeebullah Shah 06.08.2013, 13:03
quelle

5 Antworten

27

Jens Vossnacks Ansatz funktioniert gut. Ich habe jedoch festgestellt, dass die onGlobalLayout () -Methode von GlobalLayoutListener wiederholt aufgerufen wird, was in bestimmten Fällen nicht angemessen ist.

Ich habe einen einfacheren Ansatz.

%Vor%     
Tony 10.12.2013, 07:29
quelle
4

Sie können versuchen, das globalLayout-Ereignis anzuhören und die Breite dort einzutragen. Sie erhalten wahrscheinlich die -1, weil Sie versuchen, die Breite zu erhalten, bevor die Ansichten angeordnet sind.

%Vor%

(vto ist die Ansicht, für die Sie die Breite erhalten möchten)

    
Jens Vossnack 06.08.2013 13:09
quelle
1

Wenn Sie sich den Wert für FILL_PARENT anschauen (Sie sollten MATCH_PARENT verwenden, da FILL_PARENT jetzt veraltet ist), werden Sie feststellen, dass der Wert -1 ist. LayoutParams sind einfach Attribute für die Ansicht Ihrer Ansicht. Sobald die Ansicht aufgebläht ist und so aussieht, wie die Parameter angeben, kehrt die Ansicht nicht zurück und ändert diese Parameter so, dass sie die tatsächlichen Werte der Ansicht (Breite / Höhe / etc) widerspiegeln.

Wenn Sie die tatsächliche Breite Ihrer Ansicht erhalten möchten, müssen Sie getWidth() in Ihrer Ansicht aufrufen, sobald das Layout aufgebläht und angezeigt wurde. Wenn Sie getWidth() aufrufen, bevor Ihr Layout angezeigt wurde, wird 0 angezeigt.

%Vor%     
dymmeh 06.08.2013 13:09
quelle
0

layoutGet.getWidth() sollte funktionieren

    
Onur A. 06.08.2013 13:09
quelle
0

Als erstes sollten Sie match_parent anstelle von fill_parent (veraltet) verwenden.

Wenn du int width=layParamsGet.width; machst, nimmst du das richtige Ergebnis, das ist -1 korrespondierend bei fill_parent . Wenn Sie die tatsächliche Breite erhalten möchten, müssen Sie onMesure() call warten und

verwenden %Vor%     
Sergio Carvalho 06.08.2013 13:15
quelle