2015-05-10 2 views
4

Примечание:Android: Можно ли вычислить высоту представления перед ее нарисованием?

  • Я не хочу использовать какие-либо getViewTreeObserver() слушатель или любые слушатель вообще. Я хочу рассчитать высоту обзора ПЕРЕД НАЧАЕМ это нарисовано.
  • Я пробовал getMeasuredHeight(), но он возвращает 0 каждый раз.

Любые предложения?

+0

попробовал первый 'View # мера (int widthMeasureSpec, int heightMeasureSpec) '? – pskink

+0

сначала измерьте свой вид, затем получите измеренную высоту – pskink

+0

Хорошо, я просто попробовал, и я получаю неправильные значения ... Я прочитал объяснение Java о мерах, но до сих пор не нашел способ рассчитать правильную высоту после розыгрыша. Интересно, почему люди говорят, что это невозможно. –

ответ

0

Вы должны использовать getViewTreeObserver(). Одна вещь, которую вы можете сделать, - иметь видимость в представлении, установленном на видимое или невидимое для начала (только для того, чтобы создать высоту), а затем изменить его на невидимое/ушедшее в код. Пример:

private int mHeight = 0; 
private View mView; 

class... 

// onCreate or onResume or onStart ... 
mView = findViewByID(R.id.someID); 
mView.getViewTreeObserver().addOnGlobalLayoutListener( 
new OnGlobalLayoutListener(){ 

    @Override 
    public void onGlobalLayout() { 
     // gets called after layout has been done but before display 
     // so we can get the height then hide the view 


     mHeight = mView.getHeight(); 

     mView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     mView.setVisibility(View.GONE); 
    } 

}); 
+0

Это именно то, чего я не хотел ... –

+0

Нет другого пути. –

0

На самом деле Существует еще один способ, я использовал, чтобы использовать его для пользовательского материала, но это будет определенно работать для вас

final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
     void run() { 
      if(view.getHeight() == 0) { 
       handler.postDelayed(this, 50); 
      } else { 
       // you're all set 
      } 
     } 
}, 50); 

надеюсь, что это помогает

+0

Это точно так же, как вызов onGlobalLayoutListener(). Вид нарисован, а затем обработчик возвращает свою высоту. Я хочу рассчитать высоту до того, как будет нарисован вид. –

+0

, тогда ПОЧЕМУ вы хотите сделать это так? может быть, есть другой рабочий стол, потому что это не имеет никакого смысла. –

+0

Я пытаюсь установить пользовательскую высоту для элементов Gridview. Установка параметров в GridView.AUTO_FIT или simillars приводит к беспорядочным изменениям размера в пользовательском интерфейсе, поскольку каждый элемент загружает изображение. Я пробовал все: от установки источника изображения фиксированного размера по умолчанию для воспроизведения с помощью типов масштабирования ImageView, но никто не работал. Теперь я устанавливаю фиксированное число как высоту GridView. В моем телефоне это выглядит хорошо, но в других это не всегда. * О, да, я использую Пикассо. –

Смежные вопросы