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

Какая разница между removeAllViews() и removeAllViewsInLayout()

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

4b9b3361

Ответ 1

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

Ура!

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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