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"
/>
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
¿Comprobó cuál era el ancho y la altura de su pantalla? Tal vez es 0 en sí –
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