2012-08-14 10 views
7

Sono davvero confuso con questa intera cosa di misurazione che Android fa per i layout. Fondamentalmente, voglio ottenere l'effettiva altezza e larghezza di una vista calcolata quando è stata progettata PRIMA che venga disposta. Ho bisogno di ottenere l'altezza e la larghezza calcolate perché ho un LinearLayout nascosto che voglio animare all'apertura usando viewpropertyanimator. Devo fornire la larghezza di destinazione (che è la larghezza calcolata) all'animatore prima che la animi. La larghezza di questo layout è dinamica perché si basa sul suo parametro android:weight per la larghezza, quindi non posso dare un valore statico.getMeasuredHeight() e larghezza che restituisce 0 dopo la misura()

Ecco la mia classe di attività:

package com.example.testproject; 

import android.app.Activity; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Display; 
import android.view.View; 
import android.widget.LinearLayout; 
import android.widget.LinearLayout.LayoutParams; 

public class TestActivity extends Activity 
    { 

    private LinearLayout gmailListContainer, yahooMailListContainer, windowsLiveListContainer; 
    private LinearLayout emailMessageContainer; 

    private Display display; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) 
     { 
     super.onCreate(savedInstanceState); 

     this.setContentView(R.layout.activity_test); 

     gmailListContainer = (LinearLayout) this.findViewById(R.id.email_activity_gmail_layout); 
     yahooMailListContainer = (LinearLayout) this.findViewById(R.id.email_activity_yahoo_mail_layout); 
     windowsLiveListContainer = (LinearLayout) this.findViewById(R.id.email_activity_windows_live_layout); 
     emailMessageContainer = (LinearLayout) this.findViewById(R.id.email_activity_email_content_layout); 

     gmailListContainer.setBackgroundColor(Color.CYAN); 
     yahooMailListContainer.setBackgroundColor(Color.MAGENTA); 
     windowsLiveListContainer.setBackgroundColor(Color.GREEN); 
     emailMessageContainer.setBackgroundColor(Color.RED); 

     display = getWindowManager().getDefaultDisplay(); 

     setMeasuredDimensions(); 
     } 

    private void setMeasuredDimensions() 
     { 
     View v = this.findViewById(R.id.email_activity_layout); 
     v.measure(display.getWidth(), display.getHeight()); 
     Log.v("EmailActivity", v.getMeasuredHeight() + ", " +v.getMeasuredWidth()); 
     } 

    private void setWeight(LinearLayout container, float weight) 
     { 
     LinearLayout.LayoutParams params = (LayoutParams) container.getLayoutParams(); 
     params.weight = weight; 
     container.setLayoutParams(params); 
     container.setVisibility(View.VISIBLE); 
     } 

    } 

Ecco la risorsa di layout rilevanti:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/email_activity_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" 
android:baselineAligned="false"> 

<LinearLayout 
    android:id="@+id/email_activity_gmail_layout" 
    android:layout_width="0dp" 
    android:layout_height="fill_parent" 
    android:layout_weight="1" 
    /> 
<LinearLayout 
    android:id="@+id/email_activity_yahoo_mail_layout" 
    android:layout_width="0dp" 
    android:layout_height="fill_parent" 
    android:layout_weight="1" 
    /> 
<LinearLayout 
    android:id="@+id/email_activity_windows_live_layout" 
    android:layout_width="0dp" 
    android:layout_height="fill_parent" 
    android:layout_weight="1" 
    /> 
<LinearLayout 
    android:id="@+id/email_activity_email_content_layout" 
    android:layout_width="0dp" 
    android:layout_height="fill_parent" 
    android:layout_weight="0" 
    /> 

risposta

6

aggiungere il metodo seguito per la vostra attività e chiamare il metodo da essa.

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
     setMeasuredDimensions(); 
    super.onWindowFocusChanged(hasFocus); 
} 

In onCreate() non è possibile garantire che la vista sia disegnata. Potrebbe volerci del tempo. Ma questo metodo sopra viene chiamato solo quando la vista viene disegnata completamente. Quindi YOu dovrebbe essere in grado di ottenere la larghezza e l'altezza esattamente qui.

+0

Scratch il mio commento precedente. Eccone uno modificato: Ehilà! Ho provato la tua soluzione, e funziona, comunque quando chiamo 'v.measure (display.getWidth(), display.getHeight());' di nuovo, i valori tornano ad essere 0. Ho modificato il mio codice per registrare il altezza e larghezza per prime, attiva nuovamente un comando di misura sulla vista fornendo l'altezza e la larghezza del display, quindi registra nuovamente altezza e larghezza. Nel primo registro, vengono restituiti i valori corretti. Nel secondo registro, i valori sono stati reimpostati su 0. Perché? – Neilers

+0

Hai controllato la larghezza e l'altezza del tuo schermo? Forse è lo stesso 0 –

+0

Sfortunatamente, non era 0. Inoltre, correggimi se sbaglio, ma questo approccio presuppone che le viste siano già state disegnate. Quello che sto cercando di trovare è un modo per ** 1. ** Configurare i layout lineari interni in modo che i primi 3 abbiano peso = 1 e il 4 abbia peso = 0 ** 2. ** Forza layout, misura o qualcosa in modo che possa ottenere l'altezza e il peso calcolati per ciascuno in questa modalità ** 3. ** Configurare i layout in modo che 2 dei primi 3 layout abbiano il peso = 0 e 1 con peso = 1, e il 4 abbia peso = 2 ** 4. ** ottieni larghezza e altezza per ognuna in questa seconda modalità ** 5. ** Ripristina pesi e solo in quel caso traccerò le viste – Neilers

Problemi correlati