在Android中获取布局的宽度/高度

时间:2012-01-16 20:06:32

标签: android android-layout

我想知道如何测量视图的尺寸。就我而言,它是绝对布局。我已经阅读了有关这些问题的答案,但我仍然没有得到答案。

这是我的代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);      

    AbsoluteLayout layoutbase = (AbsoluteLayout) findViewById(R.id.layoutbase);       

    drawOval(); 

}
public void drawOval(){ //, int screenWidth, int screenHeight){ 
    AbsoluteLayout layoutbase = (AbsoluteLayout) findViewById(R.id.layoutbase);     

    int screenWidth = layoutbase.getWidth();
    int screenHeight = layoutbase.getHeight();
    Log.i("MyActivity", "screenWidth: " + screenWidth + ", screenHeight: " +screenHeight);

    Coordinates c = new Coordinates(BUTTONSIZE,screenWidth,screenHeight);

    ...some code ...

    ((ViewGroup) layoutbase ).addView(mybutton, new AbsoluteLayout.LayoutParams(BUTTONSIZE, BUTTONSIZE, c.mX, c.mY));


    mybutton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            showText(mybutton);
        }
    });
}

public void showText(View button){      

    int x = findViewById(LAYOUT).getWidth();
    int y = findViewById(LAYOUT).getHeight(); 

    Toast message = Toast.makeText(this, "x: " + x , Toast.LENGTH_SHORT);       
    message.show();     


}

getWidth()命令在showText()中效果很好但在drawOval()中确实。我知道它看起来有点不同但我在int x = findViewById(LAYOUT).getWidth();中使用了drawOval()版本,而x / y总是0。我真的不明白为什么在前一点似乎没有宽度/高度。即使我实际在绝对布局上绘制了一个按钮,getWidth()也会返回0。显然,我想测量drawOval()中的尺寸。

6 个答案:

答案 0 :(得分:10)

我认为会对你有帮助。

   LinearLayout headerLayout = (LinearLayout)findviewbyid(R.id.headerLayout);
    ViewTreeObserver observer = headerLayout .getViewTreeObserver();
            observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            // TODO Auto-generated method stub
            int headerLayoutHeight= headerLayout.getHeight();
        int headerLayoutWidth = headerLayout.getWidth();
        headerLayout .getViewTreeObserver().removeGlobalOnLayoutListener(
                this);
    }
});


}  

答案 1 :(得分:7)

getWidth()给你0,因为在布局实际发生之前调用了onCreate。由于视图能够基于属性或其他元素(例如fill_parent)具有动态位置和大小,因此对于任何给定视图或布局,没有固定大小。在运行时,有一个时间点(实际上它可以根据许多因素重复发生),其中一切都是实际测量和布局的。如果你真的需要高度和宽度,你必须在以后发现它们。

答案 2 :(得分:3)

这特别处理Dimension s

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth(); 
int height = display.getHeight();

这可以帮助您管理维度。

注意:这会返回显示尺寸(以像素为单位) - 正如预期的那样。但不推荐使用getWidth()和getHeight()方法。相反,您可以使用:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
马丁库比克也建议道。

答案 3 :(得分:2)

如果您的目标只是在屏幕上绘制一个椭圆形,那么请考虑创建自己的自定义View而不是弄乱AbsoluteLayout。您的自定义View必须覆盖onDraw(android.graphics.Canvas),当视图呈现其内容时,系统会调用public class MainActivity extends Activity { private final Paint mPaint = new Paint(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new SampleView(this)); } // create a nested custom view class that can draw an oval. if the // "SampleView" is not specific to the Activity, put the class in // a new file called "SampleView.java" and make the class public // and non-static so that other Activities can use it. private static class SampleView extends View { public SampleView(Context context) { super(context); setFocusable(true); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.CYAN); // smoothen edges mPaint.setAntiAlias(true); mPaint.setColor(Color.RED); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(4.5f); // set alpha value (opacity) mPaint.setAlpha(0x80); // draw oval on canvas canvas.drawOval(new RectF(50, 50, 20, 40), mPaint); } } }

以下是一些非常简单的示例代码,可帮助您入门:

{{1}}

答案 4 :(得分:2)

这可以为您提供屏幕分辨率:

 WindowManager wm = (WindowManager)context.getSystemService(context.WINDOW_SERVICE);
 Display display = wm.getDefaultDisplay();
 Point outSize = new Point();
 display.getSize(outSize);

答案 5 :(得分:1)

kabuko的回答是正确的,但可能会更清楚,所以让我澄清一下。

getWidth()getHeight()(正确)给你0,因为在你调用它们时没有在布局中绘制它们。尝试在addView()之后调用按钮上的两个方法(在绘制视图并在布局中出现之后),看看是否能给出预期结果。

有关详细信息,请参阅此post