getMeasuredHeight()和measure()后返回0的宽度

我真的很困惑这整个测量的东西,android的布局。 基本上,我想获得实际计算的高度和宽度的视图,当它被布置之前,它被布置。 我需要得到计算的高度和宽度,因为我有一个隐藏的LinearLayout ,我想在使用viewpropertyanimator打开时设置animation。 我需要提供目标宽度(这是计算的宽度)animation之前animation。 这个布局的宽度是dynamic的,因为它依赖于其宽度的android:weight参数,所以我不能给出一个静态值。

这是我的活动课:

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

以下是相关的布局资源:

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

Solutions Collecting From Web of "getMeasuredHeight()和measure()后返回0的宽度"

将下面的方法添加到您的活动并从中调用您的方法。

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

在onCreate()你不能保证你的视图被绘制。 这可能需要一些时间。 但是,只有当视图完全绘制时才会调用上述方法。 所以你应该能够在这里得到宽度和高度。