2013-09-04 29 views
6

Tôi nhận thấy rằng khung nhìn của ứng dụng trả về 0 cho getWidth() và getHeight() sau khi onMeasure() đã được gọi. Điều này chỉ xảy ra trên một số ít thiết bị, đối với hầu hết các thiết bị Android, mã sau hoạt động tốt. Hàm checkViewAndLoad() của tôi tải một bitmap được chia tỷ lệ phụ thuộc vào kích thước của khung nhìn.getWidth() và getHeight trả về số không sau onMeasure() (thiết bị cụ thể)

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    Log.d("widthMeasureSpec", Integer.toString(MeasureSpec.getSize(widthMeasureSpec))); 
    Log.d("heightMeasureSpec", Integer.toString(MeasureSpec.getSize(heightMeasureSpec))); 
    Log.d("viewWidth", Integer.toString(getWidth())); 
    Log.d("viewHeight", Integer.toString(getHeight())); 

    checkViewAndLoad(); 
} 

Đây là một bản ghi của một thiết bị (Motorola Droid Razr Maxx) trả về zero cho getWidth()/getHeight() sau khi onMeasure():

09-03 20:55:58.359: D/widthMeasureSpec(29496): 540 
09-03 20:55:58.359: D/heightMeasureSpec(29496): 720 
09-03 20:55:58.359: D/viewWidth(29496): 0 
09-03 20:55:58.359: D/viewHeight(29496): 0 

Tôi cũng đã cố gắng để setMeasuredDimensions() bằng tay, nhưng bàn tay đó không ảnh hưởng đến nhật ký.

Ai đó có thể cho tôi biết những gì tôi đang làm sai ở đây, hoặc làm thế nào để có được chiều rộng/chiều cao của SurfaceView sau khi onMeasure() đã được gọi?

Trả lời

9

Sử dụng getMeasuredWidth/Height() tại đây. getWidth/Height() không hợp lệ cho đến sau khi bố cục.

1

Hãy thử cách này

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)); 

    Log.d("widthMeasureSpec", Integer.toString(MeasureSpec.getSize(widthMeasureSpec))); 
    Log.d("heightMeasureSpec", Integer.toString(MeasureSpec.getSize(heightMeasureSpec))); 
    Log.d("viewWidth", Integer.toString(getWidth())); 
    Log.d("viewHeight", Integer.toString(getHeight())); 

    if(getMeasuredWidth()!=0 && getMeasuredHeight()!=0){ 
       checkViewAndLoad(); 
    } 

} 
Các vấn đề liên quan