Подтвердить что ты не робот

Как узнать, когда действие завершает макет?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 3

Вы можете использовать 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
        });