View.getWidth()在onCreate方法中不起作用?

时间:2013-06-11 10:17:07

标签: android android-layout measure

为什么lColorWheel.getWith()方法返回0?我想这与onMeasure事件有关,但我真的无法从文档中了解它是如何工作的。 我必须为mDrawable设置维度吗?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_light);

    ShapeDrawable mDrawable;
    ivColorWheel=(ImageView)findViewById(R.id.ivColorWheel);
    lColorWheel=findViewById(R.id.lColorWheel);
    ld=(LayerDrawable)getResources().getDrawable(R.drawable.colorwheel);  

    mDrawable = new ShapeDrawable(new OvalShape());

    mDrawable.setIntrinsicWidth(lColorWheel.getWidth());
    mDrawable.setIntrinsicHeight(lColorWheel.getHeight());
    Log.d("lColorWheel.getWidth()",Integer.toString(lColorWheel.getWidth())); //returns 0, why?
    Log.d("lColorWheel.getHeight()",Integer.toString(lColorWheel.getHeight())); //returns 0, why ?

并且适当的XML文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:gravity="center_horizontal"
android:addStatesFromChildren="true" >

<RelativeLayout
    android:id="@+id/lColorWheel"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="20dp" 
    android:layout_centerHorizontal="true" 
    android:adjustViewBounds="true">

     <ImageView
        android:id="@+id/ivColorWheel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:adjustViewBounds="true"
        android:paddingBottom="0dp"
        android:paddingTop="0dp"
        android:src="@drawable/iconwheel"
        />

      <ImageView
          android:id="@+id/ivCenterButton1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_centerHorizontal="true"
          android:layout_centerVertical="true"
          android:maxHeight="5dp"
          android:maxWidth="5dp"
          android:onClick="clc"
          android:paddingBottom="0dp"
          android:paddingLeft="0dp"
          android:paddingRight="0dp"
          android:paddingTop="0dp"
          android:src="@drawable/center3" />

</RelativeLayout>

<SeekBar
     android:id="@+id/sbColorIntensity"
     android:layout_width="match_parent"
     android:layout_height="50dp"
     android:layout_alignParentLeft="true"
      android:layout_below="@id/lColorWheel"
     android:layout_marginLeft="20dp"
     android:layout_marginRight="20dp"
     android:layout_marginTop="20dp"
     android:background="@drawable/colorintensitystrip"
     android:max="255"
     android:maxHeight="-25dp"
     android:thumb="@drawable/thumb"
     android:thumbOffset="0dp"
 />



<SeekBar
    android:id="@+id/sbOrientation"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_alignParentLeft="true"
    android:layout_below="@id/sbColorIntensity"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="20dp"
    android:background="@drawable/orientationstrip"
    android:max="255"
    android:maxHeight="-25dp"
    android:thumb="@drawable/thumb"
    android:thumbOffset="0dp"
     />

<SeekBar
    android:id="@+id/sbWhiteIntensity"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_alignParentLeft="true"
    android:layout_below="@id/sbOrientation"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="20dp"
    android:background="@drawable/whiteintensitystrip"
    android:max="255"
    android:maxHeight="-25dp"
    android:thumb="@drawable/thumb"
    android:thumbOffset="0dp"
     />
 </RelativeLayout>

THX

4 个答案:

答案 0 :(得分:15)

如果要在渲染完成之前使用它们,则需要测量视图的高度和宽度。

以下代码可帮助您测量任何视图的高度和宽度。

imgView.measure(
    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
imgView.layout(0, 0,
    imgView.getMeasuredWidth(),
    imgView.getMeasuredHeight());

在使用视图的高度和宽度之前编写此代码。

有时这种方法不会给出正确的结果。还有其他选择。下面的代码将在屏幕上绘制之前计算高度和宽度。

ViewTreeObserver viewTree = imgView.getViewTreeObserver();
viewTree.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    public boolean onPreDraw() {
        finalHeight = imgView.getMeasuredHeight();
        finalWidth = imgView.getMeasuredWidth();
        //print or do some code
        return true;
    }
});

答案 1 :(得分:1)

执行onCreate方法时,Android尚未完成布局传递或测量传递。

您可以使用measure方法衡量视图的大小,但我强烈建议您在ViewTreeObserver上实施回调,尤其是因为您正在使用RelativeLayout布局沿树传递。)

使用ViewTreeObserver.OnGlobalLayoutListenerlink),您可以在确切了解每个项目的放置位置及相应尺寸后对布局进行任何调整。

答案 2 :(得分:0)

您过早调用getwidth(),UI尚未准备好获取此值。你需要一个观察者。 我认为这个值是在UI的第一个画面之后设置的。 在onCreate()方法中尝试这个:

    final ViewTreeObserver vto = myView.getViewTreeObserver();
    if (vto.isAlive()) {
       vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

           public void onGlobalLayout() {

              int witdth = lColorWheel.getWith() 
              // remove the listener... or we'll be doing this a lot.
                ViewTreeObserver obs = promotionSub_ly.getViewTreeObserver();
                obs.removeGlobalOnLayoutListener(this);
          }
      });
   }

答案 3 :(得分:0)

引用CommonsWare here

  

您过早地调用getWidth()。用户界面尚未调整大小   屏幕上还摆放着。

     

我怀疑你想要做你正在做的事情 - 无论如何 - 小部件   动画不会改变他们的可点击区域,所以按钮   无论如何,我们仍会对原始方向的点击做出响应   它是如何旋转的。

     

话虽如此,您可以使用维度资源来定义按钮   size,然后从布局文件中引用该维度资源   你的源代码,以避免这个问题。