2012-08-14 9 views
7

Estoy realmente confundido con todo esto de medición que hace Android para los diseños. Básicamente, quiero obtener la altura y el ancho computados reales de una vista cuando se ha dispuesto ANTES de que se diseñe. Necesito obtener la altura y el ancho calculados porque tengo un LinearLayout oculto que quiero animar cuando abro usando viewpropertyanimator. Necesito proporcionar el ancho del objetivo (que es el ancho calculado) al animador antes de que lo anime. El ancho de este diseño es dinámico porque depende de su parámetro android:weight para el ancho, por lo que no puedo dar un valor estático.getMeasuredHeight() y el ancho que devuelve 0 after measure()

Aquí es mi clase de actividad:

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); 
     } 

    } 

Aquí está el diseño de recursos relevantes:

<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" 
    /> 

Respuesta

6

Añadir el método siguiente para su actividad y llame a su método de ella.

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

En onCreate() no puede asegurar que su vista esté dibujada. Puede llevar algo de tiempo. Pero este método anterior se llama solo cuando la vista se dibuja por completo. Así que debería poder obtener el ancho y la altura exactamente aquí.

+0

Scratch mi comentario anterior. Aquí hay uno editado: ¡Hola! Intenté su solución, y funciona, sin embargo, cuando llamo 'v.measure (display.getWidth(), display.getHeight());' de nuevo, los valores vuelven a ser 0. He modificado mi código para iniciar sesión alto y ancho primero, ejecute un comando de medición en la vista suministrando de nuevo el alto y el ancho de la pantalla, y la altura y el ancho registrados de nuevo. En el primer registro, se devuelven los valores correctos. En el segundo registro, los valores se han restablecido a 0. ¿Por qué? – Neilers

+0

¿Comprobó cuál era el ancho y la altura de su pantalla? Tal vez es 0 en sí –

+0

Desafortunadamente, no era 0. Además, corrígeme si estoy equivocado, pero este enfoque asume que las vistas ya se han dibujado. Lo que estoy tratando de encontrar es una forma de ** 1. ** Configure los diseños lineales internos de modo que los primeros 3 tengan peso = 1 y el cuarto tenga peso = 0 ** 2. ** Forme el diseño, mida o algo para que pueda calcular la altura y el peso de cada uno en este modo ** 3. ** Configure los diseños de modo que 2 de los 3 primeros diseños tengan peso = 0 y 1 con peso = 1, y el 4º tenga peso = 2 ** 4. ** obtenga ancho y alto para cada uno en este 2 ° modo ** 5. ** Revertir pesos y solo entonces dibujaré las vistas – Neilers

Cuestiones relacionadas