Как получить или вычислить ширину / высоту раздутого вида

Как вычислить ширину и высоту раздутого представления, если родителем является PopupWindow, а не ViewGroup? Я не могу использовать LayoutInflator.inflate(int resId, ViewGroup parent, attachToRoot boolean) потому что PopupWindow не является ViewGroup, поэтому вместо этого я использую LayoutInflator.inflate(int resId) , но после этого я getWidth () и getHeight () возвращает ноль 🙁

Мне нужно изменить размер PopupWindow, чтобы он соответствовал представлению, но не может сделать этого, пока вид не будет иметь родителя. У меня проблема с курицей и яйцом?

Кстати, представление является подклассом RelativeView, поэтому его вычисление вручную не может быть и речи.

Спасибо заранее, Барри

Фактически popupWindow поддерживает «wrap content», поэтому, если вы хотите, чтобы всплывающее окно было точным в вашем представлении, используйте это:

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

другие варианты

getWidth() и getHeight() возвращает ноль, потому что вид имеет размер только после рисования на экране. Вы можете попытаться получить значения из LayoutParams с раздутым представлением.

Если есть значение fill_parent – вы находитесь в ситуации с яйцом.

Если есть значения в px или dp вы можете вручную вычислить размер в пикселях:

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

Если значение wrap_content – вы можете использовать view.measure() – будут измерены все дети и сам вид, и вы можете получить view.getMeasuredHeight() и view.getMeasuredWidth() .

Как сказал Jin35, ваша проблема заключалась в том, что ширина и высота представления еще не рассчитаны … размеры не вычисляются до тех пор, пока макет не пройдет.

Использование фиксированной ширины и высоты из ресурсов измерения (например, из файла values ​​/ dimens.xml) является одним из способов обхода, поскольку вам не нужно ждать появления onMeasure в представлении – вы можете получить значение того же размера Ресурс, который вы использовали для представления, которое вас интересует, и используйте его.

Лучшее решение – просто отложить свои вычисления до тех пор, пока не произойдет onMeasure. Вы можете сделать это, переопределив onMeasure, но более элегантным решением является использование временного OnGlobalLayoutListener следующим образом:

 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); } } }); } } 

Попробуйте следующее:

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