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"
/>
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
Hai controllato la larghezza e l'altezza del tuo schermo? Forse è lo stesso 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