Как узнать, когда действие завершает этап макета? - PullRequest
23 голосов
/ 07 декабря 2011

У меня есть фоновый поток, который обновляет пользовательский интерфейс моей деятельности после onCreate(). Это может быть добавление макетов или изменение размера других.

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

Сейчас я просто использую Handler с postDelayed runnable, который выполняет работу после небольшой задержки, примерно через 50-100 мс после модификаций, которые запускают requestLayout().

Это работает, но мы можем видеть задержку. Я хотел бы сделать работу как можно скорее. В коде представления легко определить проход измерения, но я не нахожу, как решить это непосредственно в упражнении.

Ответы [ 3 ]

44 голосов
/ 07 декабря 2011

GlobalLayoutListener запустит событие по завершении макета. Будет ли это соответствовать вашим потребностям?

View myView=findViewById(R.id.myView);
  myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //At this point the layout is complete and the 
                //dimensions of myView and any child views are known.
            }
        });
2 голосов
/ 22 ноября 2013

в дополнение к принятому ответу Филиппа Фитцсиммонса, который является правильным, я бы также отметил, что если кому-то нужно знать размер в самом представлении, метод:

protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  super.onSizeChanged(w, h, oldw, oldh);
  // your code here
}

может быть переопределено и будет вызвано после прохода макета.

0 голосов
/ 03 декабря 2018

Вы можете использовать ViewTreeObserver.OnPreDrawListener

за документы на https://developer.android.com/reference/android/view/ViewTreeObserver.OnPreDrawListener

На этом этапе все виды в дереве были измерены и им дан кадр.

Только если представление в вашем дереве запрашивает еще один проход макета, любые границы макета изменятся. Вы также можете использовать подобную технику, используя ViewTreeObserver.OnDrawListener, чтобы получить обратный вызов даже позже

myView.getViewTreeObserver().addOnPreDrawListener(
    new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            myView.getViewTreeObserver().removeOnPreDrawListener(this);
            // view is measured and laid out
        });
...