2013-08-06 17 views
7

Ho il LinearLayout con larghezza impostato in xml come fill_parent, ora ho bisogno della sua larghezza in fase di esecuzione in modo programmatico. Quindi ho fatto questo:Android: larghezza del layout programmaticamente con fill_parent nel suo xml

LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); 
    LayoutParams layParamsGet= layoutGet.getLayoutParams(); 
    int width=layParamsGet.width; 

Ma width valore sul debug è risultata essere -1, chiunque con un'idea perché non posso ottenere la larghezza esatta in fase di esecuzione per LinearLayout con fill_parent impostata nel layout xml.

risposta

27

Jens Vossnack funziona bene. Tuttavia, ho trovato che il metodo onGlobalLayout() di GlobalLayoutListener è chiamato ripetutamente, che potrebbe non essere appropriato in alcuni casi.

Ho un approccio più semplice che funziona.

myLayout = (RelativeLayout) findViewById(R.id.my_layout); 
myLayout.post(new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      Log.i("TEST", "Layout width : "+ myLayout.getWidth()); 

     } 
    }); 
+1

+1 per la bella risposta –

+0

Questa è stata la risposta che cercavo, ho bisogno di misurare la vista e utilizzare mentre la vista non è ancora posato-fuori, è sempre restituito 0 fino a quando ho trovato la tua risposta, grazie –

+2

Perché funziona bene all'interno di un thread ma all'esterno dei resi 0? –

0

layoutGet.getWidth() dovrebbe funzionare

4

Si può cercare di ascoltare l'evento globalLayout, e ottenere la larghezza in là. Probabilmente ottieni il -1 perché stai cercando di ottenere la larghezza prima che le viste siano tracciate.

vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     //Do it here 
     LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); 
     LayoutParams layParamsGet= layoutGet.getLayoutParams(); 
     int width=layParamsGet.width; 
     removeOnGlobalLayoutListener(layoutGet, this); // Assuming layoutGet is the View which you got the ViewTreeObserver from 
    } 
}); 

@SuppressLint("NewApi") 
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){ 
    if (Build.VERSION.SDK_INT < 16) v.getViewTreeObserver().removeGlobalOnLayoutListener(listener); 
    else v.getViewTreeObserver().removeOnGlobalLayoutListener(listener); 
} 

(VTO è la vista che si desidera ottenere la larghezza di)

1

Se si guarda il valore per FILL_PARENT (si dovrebbe utilizzare MATCH_PARENT dal FILL_PARENT è ora sconsigliato) si noterà il valore per è -1. LayoutParams sono semplicemente attributi per come dovrebbe apparire la tua vista. Una volta che la vista è gonfiata e guarda come specificano i parametri, la vista non torna indietro e cambia quei Params per riflettere i valori effettivi della vista (larghezza/altezza/ecc.).

Se si desidera ottenere la larghezza effettiva della propria vista, è necessario chiamare getWidth() sulla vista una volta che il layout è stato gonfiato e visualizzato. Chiamando getWidth() prima che il layout è stato visualizzato si tradurrà in 0.

LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); 
int width = layoutGet.getWidth(); 
0

Prima di tutto, è necessario utilizzare match_parent invece di fill_parent (sconsigliato).

Quando si esegue int width=layParamsGet.width;, si ottiene il risultato corretto che corrisponde a -1 corrispondente a fill_parent. Se wan't per ottenere la larghezza vera, è necessario attendere onMesure() chiamata e utilizzare l'approccio di

LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); 
int width = layoutGet. getMeasuredHeight(); 
Problemi correlati