Как получить размеры вида? - PullRequest
207 голосов
/ 10 ноября 2010

У меня есть представление, составленное из TableLayout, TableRow and TextView. Я хочу, чтобы это выглядело как сетка. Мне нужно получить высоту и ширину этой сетки. Методы getHeight() и getWidth() всегда возвращают 0. Это происходит, когда я динамически форматирую сетку, а также когда я использую версию XML.

Как получить размеры для вида?


Вот моя тестовая программа, которую я использовал в Debug для проверки результатов:

import android.app.Activity;
import android.os.Bundle;
import android.widget.TableLayout;
import android.widget.TextView;

public class appwig extends Activity {  
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.maindemo);  //<- includes the grid called "board"
      int vh = 0;   
      int vw = 0;

      //Test-1 used the xml layout (which is displayed on the screen):
      TableLayout tl = (TableLayout) findViewById(R.id.board);  
      tl = (TableLayout) findViewById(R.id.board);
      vh = tl.getHeight();     //<- getHeight returned 0, Why?  
      vw = tl.getWidth();     //<- getWidth returned 0, Why?   

      //Test-2 used a simple dynamically generated view:        
      TextView tv = new TextView(this);
      tv.setHeight(20);
      tv.setWidth(20);
      vh = tv.getHeight();    //<- getHeight returned 0, Why?       
      vw = tv.getWidth();    //<- getWidth returned 0, Why?

    } //eof method
} //eof class

Ответы [ 16 ]

0 голосов
/ 15 марта 2019

Высота и ширина равны нулю, поскольку представление не было создано к тому времени, когда вы запрашиваете его высоту и ширину. Одним из самых простых решений является

view.post(new Runnable() {
    @Override
    public void run() {
        view.getHeight(); //height is ready
        view.getWidth(); //width is ready
    }
});

Этот метод хорош по сравнению с другими методами, поскольку он короткий и четкий.

0 голосов
/ 25 сентября 2017

Вы можете использовать трансляцию, которая вызывается в OnResume ()

Например:

int vh = 0;   
int vw = 0;

public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.maindemo);  //<- includes the grid called "board"

      registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                TableLayout tl = (TableLayout) findViewById(R.id.board);  
                tl = (TableLayout) findViewById(R.id.board);
                vh = tl.getHeight();       
                vw = tl.getWidth();               
            }
      }, new IntentFilter("Test"));
}

protected void onResume() {
        super.onResume();

        Intent it = new Intent("Test");
        sendBroadcast(it);

}

Вы не можете получить высоту представления в OnCreate (), onStart () или даже в onResume () по причине того, что kcoppock ответил

0 голосов
/ 21 января 2014

Простой ответ: Это сработало для меня без проблем. Кажется, ключ в том, чтобы убедиться, что представление имеет фокус, прежде чем вы получите getHeight и т. Д. Сделайте это с помощью метода hasFocus (), а затем с помощью метода getHeight () в этом порядке. Требуется всего 3 строки кода.

ImageButton myImageButton1 =(ImageButton)findViewById(R.id.imageButton1); myImageButton1.hasFocus();

int myButtonHeight = myImageButton1.getHeight();

Log.d("Button Height: ", ""+myButtonHeight );//Not required

Надеюсь, это поможет.

0 голосов
/ 21 августа 2013

ИСПРАВЛЕНИЕ: Я узнал, что вышеуказанное решение ужасно. Особенно, когда ваш телефон работает медленно. И тут я нашел другое решение: вычислите значение px элемента, включая поля и отступы: dp to px: https://stackoverflow.com/a/6327095/1982712

или размеры. От xml до px: https://stackoverflow.com/a/16276351/1982712

sp to px: https://stackoverflow.com/a/9219417/1982712 (отменить решение)

или размеры в px: https://stackoverflow.com/a/16276351/1982712

и все.

0 голосов
/ 14 ноября 2010

Вам лучше взглянуть на жизненный цикл View: http://developer.android.com/reference/android/view/View.html Как правило, вы не должны знать ширину и высоту, пока ваша активность не перейдет в состояние onResume.

0 голосов
/ 10 ноября 2010

Используйте getMeasuredWidth () и getMeasuredHeight () для вашего просмотра.

Руководство разработчика: просмотр

...