2011-06-21 47 views
16

Làm cách nào để tính toán chiều rộng và chiều cao của Chế độ xem được tăng cao nếu cha mẹ là PopupWindow, không phải là một ViewGroup? Tôi không thể sử dụng LayoutInflator.inflate(int resId, ViewGroup parent, attachToRoot boolean) vì PopupWindow không phải là một ViewGroup, vì vậy tôi sử dụng LayoutInflator.inflate(int resId) thay vào đó, nhưng sau đó tôi getWidth() và getHeight() trả về zero :(Cách nhận hoặc tính toán chiều rộng/chiều cao của chế độ xem được tăng cao

tôi cần phải thay đổi kích thước PopupWindow để phù hợp với View, nhưng không thể làm vì thế cho đến khi View có cha mẹ. tôi có một vấn đề con gà và quả trứng?

Bằng cách này View là một lớp con của RelativeView để tính toán nó bằng tay thực chất là ra câu hỏi.

Cảm ơn trước, Barry

+0

Bạn có thể nhận được kích thước của bạn Xem sau khi gọi 'LayoutInflator.inflate (int resid, ViewGroup mẹ , boolean attachToRoot) '? –

Trả lời

17

Trên thực tế popupWindow hỗ trợ "nội dung bọc" CONSTANS, vì vậy nếu bạn muốn cửa sổ bật lên được chính xác như tầm nhìn của bạn - sử dụng này:

popup = new PopupWindow(context); 
popup.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); 
popup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); 

- lựa chọn khác -

getWidth()getHeight() trả về 0, vì chế độ xem chỉ có kích thước sau khi vẽ trên màn hình. Bạn có thể thử lấy các giá trị từ LayoutParams của chế độ xem được tăng cường.

Nếu có giá trị fill_parent - bạn đang ở trong tình huống trứng gà.

Nếu có giá trị trong px hoặc dp bạn có thể tự tính toán kích thước bằng pixel:

Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpSize, context.getResources().getDisplayMetrics())); 

Nếu có wrap_content giá trị - bạn có thể sử dụng view.measure() phương pháp - tất cả trẻ em và xem bản thân sẽ được đo, và bạn có thể nhận được view.getMeasuredHeight()view.getMeasuredWidth().

+0

Có Tôi đang sử dụng fill_parent. Tôi vết thương bằng cách sử dụng một giá trị tính toán cho kích thước PopupWindow (hiển thị chiều rộng - padding). Nó hoạt động tốt đủ. –

-3

Hãy thử cách này:

Display display = getWindowManager().getDefaultDisplay(); 
Log.e("", "" + display.getHeight() + " " + display.getWidth()); 
+1

Tôi cần chiều rộng và chiều cao của Chế độ xem, không cần hiển thị. –

+1

Tôi đang tìm kiếm điều này, cảm ơn! – paiego

+1

Điều này không trả lời câu hỏi của OP – Gerard

6

Như Jin35 đã nói, vấn đề của bạn là chiều rộng và chiều cao của khung nhìn chưa được tính ... kích thước không được tính cho đến sau khi vượt qua bố cục.

Sử dụng chiều rộng và chiều cao cố định từ tài nguyên tham số (ví dụ: từ tệp giá trị/tệp dimens.xml) là một cách giải quyết, do đó bạn không cần phải chờ xem sự kiện onMeasure xảy ra - bạn có thể nhận được giá trị của cùng một tài nguyên tham số bạn đã sử dụng cho chế độ xem mà bạn quan tâm và sử dụng tài nguyên đó.

Giải pháp tốt hơn là chỉ trì hoãn các phép tính của bạn cho đến sau khi onMeasure xảy ra. Bạn có thể làm điều đó bằng cách ghi đè onMeasure, nhưng một giải pháp thanh lịch hơn là sử dụng một OnGlobalLayoutListener tạm thời như thế này:

View popup = LayoutInflator.inflate(int resId); 
if(popup != null) { 

    // set up an observer that will be called once the listView's layout is ready 
    android.view.ViewTreeObserver viewTreeObserver = listView.getViewTreeObserver(); 
    if (viewTreeObserver.isAlive()) { 

     viewTreeObserver.addOnGlobalLayoutListener(new android.view.ViewTreeObserver.OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 

       //Log.v(TAG, "onGlobalLayoutPondYouOldPoop"); 

       // This will be called once the layout is finished, prior to displaying. 

       View popup = findViewById(resId); 

       if(popup != null) { 
        int width = popup.getMeasuredWidth(); 
        int height = popup.getMeasuredHeight(); 

        // don't need the listener any more 
        popup.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       } 
      } 
     }); 
    } 
} 
Các vấn đề liên quan