Не могу понять, как получить вид / ширину макета / высоту - PullRequest
3 голосов
/ 27 августа 2010

Я новичок в Android. Это должно быть самой простой вещью в мире, но от ее разгадки у меня хватит сил: как мне получить размеры вида или макета?

Стандартный подход выглядит примерно так:

((LinearLayout) this.findViewById (R.id.MyLayout)) GetWidth ();.

За исключением того, что это всегда возвращает ноль, так как я пытаюсь сделать это, когда Activity запускается (onCreate), а геометрия еще не установлена. Я попытался установить режим сна, чтобы дать ему возможность настроить макет, за исключением того, что не будет настраивать макет до тех пор, пока не вернется onCreate. Так что это явно не нарезное. : P

Я нашел кучу страниц, рассказывающих о переопределении всех видов различных функций обратного вызова, чтобы быть уверенным, что макет загружается при вызове getWidth - но все они выдают ошибки, когда я пытался поместить переопределения в свою активность , Таким образом, я могу предположить, что это были обратные вызовы для измеряемых макетов и / или представлений. Проблема в том, что я не использую пользовательские классы вида / макета - только стандартные. Насколько я знаю, я не могу просто добавить переопределение.

Кто-нибудь знает, что мне делать? Я потратил около 8 часов на эту проблему и ничего не получил. И это обычно бывает тривиально в большинстве сред разработки!

Ответы [ 5 ]

21 голосов
/ 27 августа 2010
final View view = .....; // your view

view.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {

      @Override
      public void onGlobalLayout() {
        // make sure it is not called anymore 
        view.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        // your code to get dimensions of the view here:
        // ...
      }
    });
1 голос
/ 13 июня 2012

Два года опаздывает, но выкладываю это сюда для других.Попробуйте переопределить onWindowFocusChanged.Вы должны быть в состоянии получить измеренную ширину / высоту вида.

1 голос
/ 18 января 2012

Почему бы не View.getLayoutParams()? Он имеет public int height и public int width.

0 голосов
/ 08 июля 2011

У меня есть обходной путь, где я использую:

view.postDelayed(new MyRunnable(), 500); 

, который запускает логику в MyRunnable через 500 мс.Это позволяет onCreate или какому-либо методу жизненного цикла возвращаться и выполнять рисование, чтобы я мог получить правильную высоту и ширину.Но это также ужасно, так как пользователь видит задержку.

0 голосов
/ 27 августа 2010

Как насчет того, чтобы сделать это во время onStart()?Этот метод вызывается после того, как onCreate() завершил выполнение, что означает, что макет был раздут. жизненный цикл Android

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...