2013-06-13 3 views
2

Я создаю свою иерархию представлений по коду, а затем я делаю setContentView() в Управлении с моим корневым представлением как аргумент.Когда android рассчитать ширину и высоту просмотров

Мне нужно знать ширину и высоту одного вида во время выполнения, но если я делаю getWidth() или getHeight(), я получаю 0. Если я подожду несколько секунд, я получу правильную ширину или высоту.

Я только хочу знать, в какой момент андроид рассчитает ширину/высоту просмотров. Мой код не является выдающимся

Спасибо!

+0

http://stackoverflow.com/questions/4074937/android-how-to-get-a-custom-views-height-and-width – Sam

ответ

2

Вы не говорите, где вы пытаетесь измерить мнение, но я думаю, это в OnCreate() или onResume()>

Попробуйте это в OnCreate().

// set a global layout listener which will be called when the layout pass is completed and the view is drawn 
    mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() { 
      public void onGlobalLayout() { 
       // measure your views here 
      } 
    } 

Здесь mainLayout является ссылкой на группу корневого представления макета.

Это также будет вызываться, если макет будет изменен после его первого рисования (представления добавлены в код, изменения ориентации и т. Д.), Чтобы вы всегда получали правильные значения.

+0

Спасибо за обучение мне что-то новое. view.post, похоже, не работает на всех устройствах. Другое обсуждение на эту тему здесь: http://stackoverflow.com/a/13944263/969325 – Warpzit

3

Это потому, что в onCreate() макеты еще не рассчитаны. Поэтому вам нужно добавить GlobalLayoutListener, чтобы знать, когда раскладки были рассчитаны и размещены на экране.

final View view = findViewById(R.id.root); 
ViewTreeObserver vto = view.getViewTreeObserver(); 
      vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
       @Override 
       public void onGlobalLayout() { 
        ViewTreeObserver vto = view.getViewTreeObserver(); 
        vto.removeGlobalOnLayoutListener(this); 
       } 
      }); 

где корень есть корень макета (LinearLayout, RelativeLayout т.е.). Назначьте корневой макет с помощью @ + id/root.

+0

Вы все еще печатали, как я писал :) – Simon

+0

Ха-ха, вы ответили пару секунд назад: P – Carnal

+0

+1 есть здесь нет авторских прав на код. Гуд ответил ... –

0

Для ясности, в соответствии с этим Android documentation

Когда активность получает фокус, будет предложено разработать свой макет.

... а также размеры измерений.

Фокус получает после onResume и теряет его после метода.

0

Вы можете использовать некоторый класс вида. добавить следующее:

@Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 

     super(w,h,oldw,oldh); 
     if(oldw == 0 && w !=0){ 
     ... 
     // w and h is what you want 
    }