Как узнать, когда действие завершает макет?
У меня есть фоновый поток, который обновляет пользовательский интерфейс моей активности после onCreate()
. Это может быть добавление макетов или изменение размера других.
Я просто хочу определить, когда в моем действии закончен макет, чтобы иметь возможность вручную обновлять позиции других представлений, которые напрямую зависят от макетов, которые были просто добавлены или изменены.
В настоящее время я просто использую Handler
с postDelayed runnable
, который выполняет задание после небольшой задержки около 50-100 мс после модификаций, запускающих requestLayout()
.
Это работает, но мы можем видеть задержку. Я хотел бы сделать работу как можно скорее. В коде зрения легко обнаружить прохождение измерений, но я не нахожу, как решить это непосредственно в этой операции.
Ответы
Ответ 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
});