如何在活动加载时找到布局宽度和高度?

时间:2014-05-05 13:00:08

标签: android layout height width

在我的应用程序中,我应该在活动加载时找到框架布局的宽度和高度。当我尝试这个时,我得到空指针异常显示宽度和高度必须大于零。请帮我怎么样在我的xml.Thanks中预先找到框架布局的宽度和高度。

我的主要活动是

  import android.app.Activity;
  import android.graphics.Bitmap;
  import android.graphics.BitmapFactory;
   import android.os.Bundle;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.view.ViewTreeObserver.OnGlobalLayoutListener;
   import android.widget.Button;
   import android.widget.FrameLayout;
  import android.widget.ImageView;

  public class MainActivity extends Activity {
ImageView  image;
FrameLayout frame;
  int width,height;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    image=(ImageView)findViewById(R.id.imageView2);
    frame=(FrameLayout)findViewById(R.id.frame);


    frame.getViewTreeObserver().addOnGlobalLayoutListener( 
            new OnGlobalLayoutListener(){
                @Override
                public void onGlobalLayout() {                   
                    width=frame.getWidth();
                    height = frame.getHeight(); 

                    frame.getViewTreeObserver().removeGlobalOnLayoutListener( this );                               
                }

        });



    Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
      Bitmap scaled=Bitmap.createScaledBitmap(bitmap, width, height, true);
    image.setImageBitmap(scaled);
    image.setOnTouchListener(new myTouchListener());

       }
       }

我的主要xml是

   <LinearLayout 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="@android:color/black"
   android:orientation="vertical" 
   android:weightSum="3"
   >  
   <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="vertical" 
    android:id="@+id/top_linear"
    android:layout_weight="1"
   >
  </LinearLayout>

   <FrameLayout
    android:layout_width="match_parent"
    android:layout_height="380dp"
    android:id="@+id/frame" 
     >
     <ImageView
    android:id="@+id/imageView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:scaleType="matrix"
     />    
  </FrameLayout>    
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="36dp"
    android:orientation="horizontal" 
    android:background="@android:color/black"
     android:id="@+id/bottom_linear">

   </LinearLayout>


   </LinearLayout>

2 个答案:

答案 0 :(得分:3)

将Bitmap处理的代码移动到ViewTreeObserver的块中。在执行此代码块之前,宽度和高度为0。

frame.getViewTreeObserver().addOnGlobalLayoutListener( 
        new OnGlobalLayoutListener(){
            @Override
            public void onGlobalLayout() {                   
                width=frame.getWidth();
                height = frame.getHeight(); 

                Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
                Bitmap scaled=Bitmap.createScaledBitmap(bitmap, width, height, true);
                image.setImageBitmap(scaled);
                image.setOnTouchListener(new myTouchListener());

                frame.getViewTreeObserver().removeGlobalOnLayoutListener( this );                               
            }

    });

答案 1 :(得分:-1)

当布局宽度和高度设置为match_parent和wrap_content时,

getWidth()和getHeight()方法返回0。尺寸未测量。

获取测量尺寸的正确方法是getMeasuredWidth()和getMeasuredHeight()。

正确的方式:

FrameLayout frmlayout = (FrameLayout)findViewById(R.id.svtest);
ViewTreeObserver vto = frmlayout.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        scrollView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        int width  = frmlayout.getMeasuredWidth();
        int height = frmlayout.getMeasuredHeight(); 

    } 
});