getWidth 和 getHeight 返回零
Posted
技术标签:
【中文标题】getWidth 和 getHeight 返回零【英文标题】:getWidth and getHeight are returning a zero 【发布时间】:2011-09-02 22:51:53 【问题描述】:我正在尝试为android制作一个简单的绘图程序。
我有一个自定义的View
类来处理绘图。当我调用它的getWidth
和getHeight
方法时,我得到一个零。
但是,绘图工作正常,我对宽度和高度进行了硬编码,所以它可以工作。为什么要这样做?
我的视图类
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获取尺寸不符