所有Android UI对象的getHeight返回0

我正在构build一个UI,它在XML中都是静态定义的。 所有的地方都有重量,虽然看起来不错,但我想看看事情确实拥有合适的高度。 问题是,不pipe我在哪里调用.getHeight()我的格式布局我得到0.我尝试在onCreate()和onStart()。 一样。 也适用于所有UI对象。 任何想法?

package com.app.conekta; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Window; import android.widget.Button; import android.widget.FrameLayout; import android.widget.Toast; public class Conekta extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onStart() { super.onStart(); } @Override public void onResume() { super.onResume(); FrameLayout fl1 = (FrameLayout) findViewById(R.id.headerFrameLayout); FrameLayout fl2 = (FrameLayout) findViewById(R.id.footerFrameLayout); Button b=(Button) findViewById(R.id.searchButton); Log.d("CONEKTA", String.valueOf(b.getHeight())); } } 

XML:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <FrameLayout android:id="@+id/headerFrameLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.05" android:background="#597eAA" > <ImageView android:id="@+id/logoImage" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#7ba1d1" android:src="@drawable/logo_conekta" /> </FrameLayout> <LinearLayout android:id="@+id/bodyLinearLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.7" android:background="#f3f3f3" android:orientation="horizontal" > <FrameLayout android:id="@+id/leftBlankFrameLayout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="0.15" android:background="#f3f3f3" > </FrameLayout> <LinearLayout android:id="@+id/centerVerticalLayout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="0.7" android:orientation="vertical" > <FrameLayout android:id="@+id/topCenterFrameLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.35" > </FrameLayout> <TextView android:id="@+id/venueLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.025" android:text="What are you looking for?" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="#000000" /> <EditText android:id="@+id/venueTextField" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.025" > <requestFocus /> </EditText> <FrameLayout android:id="@+id/middleCenterFrameLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.05" > </FrameLayout> <TextView android:id="@+id/locationLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.025" android:text="Where?" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="#000000" /> <AutoCompleteTextView android:id="@+id/locationTextField" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.025" android:text="" /> <LinearLayout android:id="@+id/buttonLinearLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.05" android:background="#f3f3f3" android:orientation="horizontal" > <FrameLayout android:id="@+id/leftButtonLinearLayout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="0.1" > </FrameLayout> <Button android:id="@+id/searchButton" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="0.8" android:background="#6fa8dc" android:text="Search" /> <FrameLayout android:id="@+id/rightButtonLinearLayout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="0.1" > </FrameLayout> </LinearLayout> <FrameLayout android:id="@+id/bottomCenterFrameLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.35" > </FrameLayout> </LinearLayout> <FrameLayout android:id="@+id/rightBlankFrameLayout" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_weight="0.15" android:background="#f3f3f3" > </FrameLayout> </LinearLayout> <FrameLayout android:id="@+id/footerFrameLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.15" android:background="#7ba1d1" > </FrameLayout> </LinearLayout> 

简而言之,视图不是在onCreate(),onStart()或onResume()中构build的。 由于它们在技术上不存在(就ViewGroup而言),它们的维数是0。

总之,你可以到这里来更好地解释如何处理它。

如何检索视图的维度?

这是0,因为在onCreate和onStart中,视图还没有被绘制。 您可以通过侦听实际绘制的视图来解决这个问题:

 final TextView tv = (TextView)findViewById(R.id.venueLabel); final ViewTreeObserver observer= tv.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { tv.getHeight() observer.removeGlobalOnLayoutListener(this); } }); 

调用来移除监听器是为了防止在布局变化时重复调用您的自定义处理程序…如果您想获取这些,可以省略它。

通过在View中获取button,您可以轻松获取其高度等。您可以像这样定义一个onClickListener

 Button b=(Button) findViewById(R.id.searchButton); b.setOnClickListener(ButtonClick); android.view.View.OnClickListener ButtonClick= new android.view.View.OnClickListener() { public void onClick(View v) { v.getHeight(); }}; 

希望这可以帮助。

使用此function获取高度或宽度的视图

 private int getHeightOfView(View contentview) { contentview.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); //contentview.getMeasuredWidth(); return contentview.getMeasuredHeight(); }