Я узнаю, что было не так. При вызове removeView () android пытается его анимировать, помещая дочерний вид в переменную, содержащую дочерние элементы, которые в данный момент анимируются. Затем, при попытке изменить родительский вид дочернего представления (который мы хотим иметь нулевое значение), он проверяет, анимируется ли текущее представление. Как это верно, родитель не меняется (пока, по крайней мере, я не знаю, будет ли он изменен позже). Вот почему мы не можем вызвать addView ().
Решение состоит в том, чтобы сохранить класс LayoutTransition, затем установить для него значение null, выполнить передачу и затем сбросить ее. Он не оживит детей, но, по крайней мере, сработает.
Вот небольшой фрагмент кода, который заставит это работать:
public class JavaUtils {
public static void transferChildren(@NotNull final ViewGroup depart, @NotNull final ViewGroup arrival) {
LayoutTransition transition = depart.getLayoutTransition();
depart.setLayoutTransition(null);
while(depart.getChildCount() > 0) {
View c = depart.getChildAt(0);
depart.removeViewAt(0);
arrival.addView(c);
}
depart.setLayoutTransition(transition);
}
}
И для Kotlin пользователей:
fun ViewGroup.transferChildrenTo(arrival: ViewGroup) {
val transition: LayoutTransition = layoutTransition
layoutTransition = null
while (childCount > 0) {
val c: View = getChildAt(0)
removeViewAt(0)
arrival.addView(c)
}
layoutTransition = transition
}