В чем разница между removeAllViews () и removeAllViewsInLayout ()

Я заполняю динамическую динамическую компоновку. В зависимости от ответа мне нужно очистить прошлое взгляды и создать новые представления. Я прочитал документ, но все еще путаюсь с парами методов, все они выглядят одинаково. Какую функцию я должен использовать.

Solutions Collecting From Web of "В чем разница между removeAllViews () и removeAllViewsInLayout ()"

RemoveAllViews (): -Установите этот метод, чтобы удалить все дочерние представления из ViewGroup. RemoveAllViewsInLayout (): -Захват подкласса ViewGroup для удаления дочерних представлений от самого себя, когда он должен сначала узнать свой размер на экране, прежде чем он сможет подсчитать, сколько просмотров для него будет отображаться.

Ура!

Как указывает Скотт Биггс, разница не большая. Единственное различие заключается в том, что removeAllViews() вызывает requestLayout() и invalidate() после этого. Ключ к тому, почему эта разница здесь, заключается в понимании наименования removeAllViewInLayout() . Смутно, его смысл заключается не в «удалении всех представлений в этом макете просмотра».

Если мы посмотрим на подобный метод, removeViewInLayout (), мы сможем понять, что это означает:

Удаляет вид во время макета. Это полезно, если в вашем методе onLayout () вам нужно удалить больше просмотров.

Поэтому removeAllViewsInLayout() самом деле означает «удалить все представления, и мы вызываем этот метод во время прохода макета (то есть onLayout ())». Вот почему removeAllViewsInLayout() не вызывает requestLayout() , так как предполагается, что вы уже находитесь внутри прохода макета, поэтому запрос на другой макет не нужен.

Если вы используете removeAllViewsInLayout() , то ваша ответственность – гарантировать, что вы вызываете это во время прохода макета, или для правильного вызова requestLayout() и invalidate() мере необходимости.

Ну, глядя на источник, нет большой разницы:

 public void removeAllViews() { removeAllViewsInLayout(); // Details implemented here requestLayout(); invalidate(true); } 

Поэтому, если вы не хотите вызывать invalidate() в любое время по вашему выбору, вы также можете использовать removeAllViews() и немного сэкономить на вводе.

РЕДАКТИРОВАТЬ
Более подробное объяснение см. В ответе Дэвида Луи . Чтобы подвести итог, используйте removeAllViews() если вы не создаете представление – в этом случае вы бы removeAllViewsInLayout() .