getWidth 和 getHeight 返回零

Posted

技术标签:

【中文标题】getWidth 和 getHeight 返回零【英文标题】:getWidth and getHeight are returning a zero 【发布时间】:2011-09-02 22:51:53 【问题描述】:

我正在尝试为android制作一个简单的绘图程序。

我有一个自定义的View 类来处理绘图。当我调用它的getWidthgetHeight 方法时,我得到一个零。

但是,绘图工作正常,我对宽度和高度进行了硬编码,所以它可以工作。为什么要这样做?


我的视图类

public class cDrawing extends View

    char BitMap[];
    static final short WIDTH=160;
    static final short HEIGHT=440;
    static final char EMPTY=' ';
    int mWidthSize;
    int mHeightSize;

    static final char RED ='R';
    int y;

    public cDrawing(Context context) 
        super(context);

        y=3;
        // set up our bitmap
        BitMap=new char[WIDTH*HEIGHT];
        for(int i=0; i<WIDTH*HEIGHT; i++)
                BitMap[i]=EMPTY;


        // returns zero why???????
        int h=getHeight();
        h=400;
        int w=getWidth();
        w=320;
        mWidthSize=w/WIDTH;
        mHeightSize=h/HEIGHT;


        // TODO Auto-generated constructor stub
    

Activity 类

public class cCanves extends Activity  implements OnClickListener 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.canves);
        cDrawing board=new cDrawing(this);


        LinearLayout layout = (LinearLayout)findViewById(R.id.parent2);
        layout.addView(board);


        // set up buttons
        View mEraser = findViewById(R.id.buteraser);
        mEraser.setOnClickListener(this);

        View mBlack = findViewById(R.id.butblack);
        mBlack.setOnClickListener(this);

        View mWhite = findViewById(R.id.butwhite);
        mWhite.setOnClickListener(this);

        View mRed = findViewById(R.id.butred);
        mRed.setOnClickListener(this);

     // end function

    public void onClick(View v) 
        Intent i;
        switch(v.getId())
        
        case R.id.buteraser:
            break;
        case R.id.butblack:
            break;
        case R.id.butwhite:
            break;
        case R.id.butred:
            break;
         // end switch

       // function


xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/parent"
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_
  android:orientation="vertical"
  android:layout_>

    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_
      android:orientation="horizontal"
      android:layout_>

    <ImageButton android:id="@+id/buteraser"
      android:src="@drawable/icon"
      android:layout_
      android:layout_/>

    <ImageButton android:id="@+id/butblack"
      android:src="@drawable/icon"
      android:layout_
      android:layout_/>

    <ImageButton android:id="@+id/butwhite"
      android:src="@drawable/icon"
      android:layout_
      android:layout_/>

    <ImageButton android:id="@+id/butred"
      android:src="@drawable/icon"
      android:layout_
      android:layout_/>
    </LinearLayout>

    <LinearLayout android:id="@+id/parent2"
      android:layout_
      android:orientation="vertical"
      android:layout_>
    </LinearLayout>


</LinearLayout>

【问题讨论】:

我会推荐你​​到this answer。 你必须等到你的视图被实例化并给出它的尺寸。一切都应该由 onDraw 函数准备好。 How do you to retrieve dimensions of a view? Getheight() and Getwidth() always return zero的可能重复 【参考方案1】:

直到视图实际渲染到屏幕上才定义宽度和高度。

使用protected abstract void onLayout (boolean changed, int l, int t, int r, int b)(您在活动中覆盖)知道尺寸何时准备就绪。

【讨论】:

谢谢,我有另一个程序可以正常工作,我会在显示视图 iks 后看看我是否这样做 正如下面 Ginsan 的回答,onLayout 是调用 getHeight 和 getWidth 方法的最佳位置。【参考方案2】:

补充 Mah 的回答,我发现您可以从参数中获取值,如下面的代码:

ImageView imageProcess = (ImageView) li.inflate(
    R.layout.andamento_sinistro_imageprocess, centerLayout, false);
imageProcess.setBackgroundResource(
    (isActive)?(R.drawable.shape_processon):(R.drawable.shape_processoff));
RelativeLayout.LayoutParams imageProcessParams = 
    (RelativeLayout.LayoutParams)imageProcess.getLayoutParams();
imageProcessParams.leftMargin = 
    (int) (centerPosition - 0.5*imageProcessParams.width);
imageProcessParams.addRule(RelativeLayout.CENTER_VERTICAL);
centerLayout.addView(imageProcess);

这里真正的问题是 LayoutParams 的使用,它具有尚未被元素处理的规则。

【讨论】:

【参考方案3】:

我不确定,但这可能与代码在您活动的lifecycle 中的位置有关。如果您在视图显示在屏幕上之前调用getWidth()getHeight(),您将得到值 0。我也遇到过这种情况。

我不确定是否有办法解决这个问题。我不得不依靠获取硬件屏幕的宽度和高度,而不是视图的宽度和高度。您最终可能不得不估计视图的宽度和高度并对其进行硬编码。

【讨论】:

布局在屏幕上的绘制与Activity生命周期直接相关。【参考方案4】:

您应该在重写的方法 onLayout 中调用 getWidth()getHeight()

【讨论】:

这应该是正确的答案。【参考方案5】:

只需使用 getViewTreeObserver() 侦听器,在这里面就 计算高度和宽度。

按照代码:

getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() @Override public void onGlobalLayout() //Do your Stuff calculation , like view.getWidth() ... );

【讨论】:

【参考方案6】:

视图只有第一次显示蜜蜂后的尺寸。

其他:

int h=getHeight();
h=400;

没有用吗?只是为了测试吗?

【讨论】:

以上是关于getWidth 和 getHeight 返回零的主要内容,如果未能解决你的问题,请参考以下文章

查看 getHeight() 和 getWidth() 返回值太大

查看 getHeight 返回 1 但 getWidth 是正确的

bitmap.getWidth()或bitmap.getHeight()的单位是多少

Bitmap通过getWidth和getHeight获取尺寸不符

自定义视图的getWidth()和getHeight()给出错误的值[重复]

为啥我无法访问面板的 getWidth() 和 getHeight() 函数?