В чем смысл ViewStub, когда я также могу лениво раздувать представление без него?

#android

#Android

Вопрос:

После прочтения документов я не уверен, чего ViewStub может достичь, чего я не могу, создав XML с представлением, а затем раздув его во время выполнения.

В документе говорится, что используйте ViewStub для раздувания представлений во время выполнения. Я не уверен, почему это полезно, кроме того, что синтаксис немного проще.

Или я совершенно не прав в этом?

Ответ №1:

Основное использование ViewStub заключается в том, чтобы выступать в качестве «заполнителя» для элемента, который позже не понадобится, без дополнительной предварительной нагрузки на производительность. Теперь ваш вопрос, почему бы тогда просто не раздувать его динамически?

Они служат для обеих целей одинаково, только при использовании ViewStub вы разделяете и уже определяете весь свой пользовательский интерфейс в отдельном XML, так что это разделение задач. Теперь, если у вас динамический пользовательский интерфейс, было бы лучше программно увеличить ваш пользовательский интерфейс.

Итак, в целом,

  • определенный пользовательский интерфейс: предпочитаю ViewStub

  • динамический пользовательский интерфейс: предпочитаю программно раздувать Views

Что касается моего опыта, я использовал его для проекта, который мне приходилось поддерживать и который требовал преодоления сложной иерархии Views , загрузка которой занимала слишком много времени. ViewStub помог в отложенной загрузке определенного пользовательского интерфейса, улучшив запуск пользовательского интерфейса.

Комментарии:

1. Вы думаете, мне следует использовать ViewStubs для отображения индикатора прогресса? Или это плохая практика?

2. Если ProgressBar это определенный пользовательский интерфейс на экране, то с ним можно работать ViewStub . Однако было бы гораздо лучше изначально установить для вашей ‘ProgressBar’ значение INVISIBLE or GONE в вашем макете, поскольку использование ViewStub в этом сценарии не окажет существенного влияния на производительность.

Ответ №2:

Допустим, у вас есть некоторый фрагмент экрана, который должен быть одним из 3 разных пользовательских интерфейсов, но вы не узнаете, какой именно, до выполнения. Вы можете использовать ViewStub и раздувать правильный во время выполнения. И поскольку ViewStub находится там, он не будет принудительно отображать ваш экран, потому что вы уже зарезервировали для него место. Да, это звучит немного как фрагмент, но это существовало до fragments и имеет меньший вес, чем кодирование фрагмента. Его также можно использовать рекурсивно таким образом, что фрагментам было бы сложно это сделать — например, древовидная структура могла бы иметь ViewStub, который вы могли бы раздуть для не-конечных узлов, но оставить как есть для конечных узлов.

Это не то, что вам следует использовать часто, но у него есть некоторые применения.

Комментарии:

1. Это хороший ответ. Я подумываю использовать это для отображения индикатора прогресса. В середине экрана перед загрузкой содержимого. Тогда, по-вашему, ViewStub — это хорошая вещь для использования здесь?

2. Я бы согласился с ответом @deubaka ниже — вероятно, лучше просто использовать видимость, чтобы скрыть и отобразить ее для чего-то такого простого.