Android merge and include

Android merge and include

Освой программирование играючи

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей — и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Читайте на здоровье!

Статья проплачена кошками — всемирно известными производителями котят.

Если статья вам понравилась, то можете поддержать проект.

В секции Custom можно увидеть компонент . Если вы имели дело с PHP, то данный тег вам уже знаком. Он позволяет вставить заранее подготовленный кусок разметки в вашу разметку. Зачем это нужно? Представьте себе, что у вас сложное приложение, состоящее из нескольких активностей. И в каждой активности есть один и тот же одинаковый элемент, например, футер для отображения логотипа компании или текста. Чтобы не повторять одинаковый блок в каждой активности по отдельности, можно создать отдельную разметку и через include добавлять в нужное место.

Подготовим заранее нужную разметку и сохраним его в отдельном файле папки res/layout:

res/layout/excerpt_content.xml

Теперь возвращаемся к основной активности, где уже есть кнопки, метки и текстовое поле, и добавляем подготовленную разметку через include:

Как видите, вам нужно указать в атрибуте layout нужную разметку и его содержимое отобразится на экране активности. Подобный подход может существенно сэкономить ресурсы для сложной разметки.

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

Если вы выберете в режиме дизайна, то появится диалоговое окно, в котором нужно выбрать созданный вами макет.

Тег помогает устранить избыточную группировку, когда один шаблон включается в другой. Например, если ваш основной шаблон – вертикальный LinearLayout, в котором два последовательных компонента могут быть повторно использованы в различных других разметках, то повторно используемый шаблон, в котором вы размещаете два компонента, требует свой корневой элемент. Однако, использование другого LinearLayout как корневого элемента для повторно используемого Layout приведет к вертикальному LinearLayout внутри вертикального LinearLayout. Вложенный LinearLayout уменьшает производительность работы пользовательского интерфейса и не нужен для работы.

Чтобы избежать избыточной группировки элементов View, вы можете использовать как корневой элемент для повторного использования шаблона. Например:

Теперь, когда вы подключает шаблон в другой с использованием тега , система игнорирует элемент и помещает две кнопки непосредственно в разметку на месте тега .

Источник

Android merge and include

In Android, for reusing the complete layouts we can use the and tags to embed another layout inside the current layout. Android offers a variety of widgets to provide small and reusable interactive elements. In some cases we might also need to reuse larger components that require a special layout.

Reusing layouts is powerful as it allows us to create reusable complex layouts. It also means that any elements of our application that are common across multiple layouts can be extracted, managed separately and then included in each layout. For example, in many cases we need custom title bar with description text and icon, then we can create a custom title bar layout and use this tag (i.e. and ) to re-use the same layout in multiple activities.

Table Of Contents

Include Tag:

The tag helps us to include the xml content’s in our xml file. This is a nice way to share layout parts between different layout’s. Suppose we need to show the custom title in many layouts, for that we simply create a custom layout for title bar and then reuse the layout by using tag.

Читайте также:  Как форматировать андроид через кнопки

Basic include Tag XML code in Android:

Merge Tag:

The tag helps us to eliminate redundant view groups in our view hierarchy when including one layout within another. For example, if our main layout is LinearLayout with vertical orientation in which two consecutive views can be re-used in multiple layouts, then the re-usable layout in which you place the two views requires its own root view. However, using another LinearLayout as the root of the re-usable layout would result in a vertical LinearLayout inside a vertical LinearLayout. The nested LinearLayout serves no real purpose other than to slow down our UI performance. To avoid including such a redundant view group, we can instead use the element as the root view for the re-usable layout.

Basic merge Tag XML code:

Now, when we include this layout in another layout (using the tag), the system ignores the element and places the two Buttons directly in the layout, in place of the tag.

Difference between ViewStub and include tag:

The include tag will just include the xml content’s in our xml file. It’s a nice way to share layout parts between different layout’s. The ViewStub tag is a little bit different because it is not directly included, and will be loaded only when you actually need it, i.e when you set ViewStub’s visibility to “true”. This is a nice optimization because you could have a complex layout with tons of small views, complex views or headers anywhere, and still have your Activity load up really fast. Once you use one of those views, it’ll be loaded.

Attributes of include:

Now let’s we discuss some common attributes of a include tag that helps us to configure it in our layout (xml).

1. id: This attribute is used to uniquely identify a include tag.

Below we set the “custom_title_bar” id of the include tag that is used to uniquely identify it.

2. layout: This attribute is used to supply an identifier for the layout resource to include a custom layout in our main layout.

Below we include a custom layout i.e custom _title in our main layout using include tag.

include and merge Tag Example In Android Studio:

Below is the example of include and merge tag in which firstly we create a custom layout with a ImageView and a Button by using merge tag and then include that layout in our main layout using include tag. Finally we access the custom layout’s view’s in our Activity and perform click event on Button. Whenever a user click on Button a toast with message “ Custom Layout’s Button Clicked ” displayed.

Below you can download code, see final output and step by step explanation of the example:

Step 1: Create a new project and name it IncludeTagExample

Step 2: Open res -> layout ->activity_main.xml (or) main.xml and add following code:

In this step we open xml file and then create a TextView and also include a custom_layout file using include tag.

Step 3: Create a new xml file i.e custom_layout.xml inside layout and add the below code:

In this file we create a Button and a ImageView using merge tag to display in other activities.

Step 4: Open src -> package -> MainActivity.java

In this step Firstly we get the reference of included layout’s Button and ImageView and finally perform click event on Button. Whenever a user click on Button a toast with message “ Custom Layout’s Button Clicked ” displayed.

Источник

Русские Блоги

Подробное объяснение использования Include, merge и ViewStub в Android

Подробное объяснение использования Include, merge и ViewStub в Android

  • Вкратце, давайте кратко поговорим об основных функциях сегодняшних трех главных героев. Include реализует повторное использование файлов макета, слияние может снизить уровень вложенности в процессе повторного использования, а ViewGroup может загружаться лениво (то есть производительность загрузки страницы может быть улучшена в особых сценариях). Ниже мы расскажем вам, как использовать этих трех приятелей в виде примеров кода, и на какие моменты нужно обращать внимание в процессе использования, чтобы вы не наступили на ямы в будущем.
Читайте также:  The developer guide android developers

Во-первых, использование Include

Используйте атрибут макета тега include в файле макета, который необходимо повторно использовать для вызова других файлов макета

Вот наш файл макета повторного использования: activity_head.xml


Здесь представлены два дополнительных текстовых поля.

Если корневой менеджер компоновки повторно используемого файла компоновки не выполняет слияние, тогда, если атрибут id установлен в тег include, этот атрибут id переопределит атрибут id модуля повторного использования и менеджера компоновки.

решение:
1. Получите корневой диспетчер компоновки повторно используемых файлов напрямую через идентификатор include;
2. Не устанавливайте атрибут id для включения

Если существует конфликт между значением идентификатора компонента в повторно используемом модуле и идентификатором компонента в вызывающей стороне, то идентификатор компонента, определенный в макете, переопределит последний идентификатор.

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

Ситуация 1. Мы видим, что идентификатор третьего текстового поля покрывает первое текстовое поле с тем же идентификатором, введенным с помощью include.

Ситуация 2: мы изменяем позицию импорта включения, и вы можете видеть, что идентификатор текстового поля в включении имеет более высокий приоритет.

Во-вторых, использование слияния

Тег слияния используется как вспомогательное расширение тега include, то есть его необходимо использовать с include.Его основная функция заключается в предотвращении избыточного вложения макета при обращении к файлам макета.
означает уменьшение уровня вложенности. Вы должны понимать, как его использовать, когда напрямую загружаете приведенный ниже код. Мы заменили метку корневого макета LinearLayout в последнем файле activity_head.xml на merge,
Остальные конфигурации остаются без изменений, а конечный эффект аналогичен описанному выше, но существенно на один уровень вложенности меньше, что повышает производительность.

Вы можете видеть, что эффект аналогичен приведенному выше примеру, но уровень вложенности существенно снижен.

  1. быть осторожен:
  • Поскольку слияние не является представлением, атрибуты исходной ViewGroup недействительны (все атрибуты, установленные для тега слияния, недействительны), например, цвет фона не может отображаться нормально. Просто попробуйте, и вы узнаете.

В-третьих, использование ViewStub

ViewStub можно загружать с задержкой, то есть он вызывается, когда его нужно использовать, и здесь он должен использоваться с кодом java. А здесь я положу
Внимание также поясняется напрямую, что удобно для демонстрации.

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

Inflate ViewStub можно вызвать только один раз, второй вызов вызовет исключение.

Хотя ViewStub не занимает места, в каждом макете должны быть указаны атрибуты layout_width и layout_height, иначе будет сообщено об ошибке.

Ситуация 1: нормально загружать ViewStub только один раз.При нажатии первой кнопки ViewStub загружается, и визуализируются два компонента кнопки внутри.

Случай 2: Поскольку ViewStub можно загрузить только один раз, он будет уничтожен, а повторная загрузка ViewStub вызовет ненормальную проблему. Здесь при первом нажатии кнопки загружается ViewStub, а при втором нажатии кнопки ViewStub загружается снова, но на самом деле ViewStub был уничтожен при первом нажатии кнопки.

Источник

Русские Блоги

Использование и анализ исходного кода include, merge и ViewStub в android

При разработке проекта макет пользовательского интерфейса — это проблема, с которой мы все сталкиваемся. Если макет слишком сложный, а иерархия слишком глубокая, это не только повлияет на удобочитаемость, но и приведет к снижению производительности. Официальный представитель Android предоставил несколько оптимизированных методов, включая, слияние и ViewStub. Здесь мы кратко представляем использование, меры предосторожности и анализируем их преимущества и меры предосторожности с точки зрения исходного кода.

Include:
include — наш наиболее часто используемый тег. Он немного похож на файл заголовка include в C. Мы инкапсулируем набор макетов и используем тег include для его импорта, когда мы его используем. Это улучшает возможность повторного использования кода.
Нет необходимости писать его каждый раз. Сначала посмотрите на пример кода:
включаемый файл: include_layout.xml

Читайте также:  Как сделать андроид айфоном через настройки

Ссылка в файле макета activity_main.xml MainActivity

Тег include очень прост в использовании, но вам нужно обратить внимание на следующие два момента:

  1. Здесь мы устанавливаем Id тега include в include_layout, этот идентификатор будет охватывать включаемый файл: идентификатор корневого тега в include_layout.xml: my_layout_root_id; поэтому при использовании метода findViewByid (R.id.my_layout_root_id) корневой View не может быть найден. Обращение внимания сообщит об исключении нулевого указателя.
  2. Если вы хотите использовать android: **, эти атрибуты устанавливаются в теге include, вы должны сначала layout_width и layout_height. В противном случае эти атрибуты не вступят в силу

Затем мы анализируем эти два соображения с точки зрения исходного кода. Метод setContentView Activity в конечном итоге будет передан методу rInflate LayoutInflater для анализа XML-файла. Давайте посмотрим на метод rInflate.

Этот метод на самом деле предназначен для обхода дерева представления и добавления его к корневому представлению. Если это тег включения, вызовите parseInclude

Метод состоит в том, чтобы проанализировать тег включения, сначала проанализировать атрибуты тега включения, а затем проанализировать файл макета для получения представления, если параметры include! = null перезапишет исходные параметры представления, если мы установим идентификатор включения, исходный идентификатор будет перезаписан. Затем проанализируйте дочерний View макета. Наконец, добавьте это представление к родительскому View parent. Примечания 1 и 2 соответственно объясняют причины наших мер предосторожности при использовании.

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

См. Activity_main для использования тега слияния

Анализ тега слияния перейдет к методу rInflate

С тегом слияния в качестве тега будет вызываться viewGroup.addView (view, params) для добавления своего дочернего представления непосредственно в родительский контейнер слияния, уменьшая один уровень макета.
Обратите внимание, что при использовании тега слияния LayoutInflate.inflate (ресурс @LayoutRes int, корень @Nullable ViewGroup, логическое attachToRoot)
root! = null attachToRoot == true; в противном случае будет создано исключение InflateException

ViewStub :
Самым большим преимуществом тега ViewStub является то, что он будет загружаться только тогда, когда он вам нужен. Его использование не повлияет на производительность инициализации пользовательского интерфейса. Различные нечастые макеты, такие как индикаторы выполнения, сообщения об ошибках отображения и т. Д., Могут использовать тег ViewStub для уменьшения использования памяти и ускорения рендеринга. ViewStub — это невидимое представление нулевого размера, которое эквивалентно «элементу управления-заполнителя». Затем, когда ViewStub установлен как видимый или вызывается ViewStub.inflate (), макет, на который указывает ViewStub, будет создан с помощью inflate, и этот файл макета напрямую заменит текущий ViewStub, а затем свойство макета ViewStub (layout_margin ***, layout_width и т. д.) будут переданы макету, на который он указывает. Таким образом, вы можете использовать ViewStub для динамического отображения макета во время выполнения, экономя ресурсы памяти. Сначала посмотрите на пример кода:
viewstub_layout.xml:

Для использования см. Activity_main.xml:

Есть два способа отобразить загруженный макет, вызвать метод inflate или установить VISIBLE для просмотра MainActivity.

ViewStub обновил метод setVisibility

Давайте посмотрим на метод inflate ViewStub.

Из примечания 1 мы видим, что метод inflate не может быть вызван снова, потому что объект ViewStub был удален, а полученный viewParent имеет значение null. В это время, когда будет принято решение, исключение IllegalStateException будет отброшено: ViewStub должен иметь ненулевую ViewGroup viewParent.
При использовании ViewStub обратите внимание, что ViewStub — это просто «заполнитель» для достижения эффекта отложенной загрузки. Когда макет, на который он указывает, загружается, он будет удален родительским контейнером, но из Примечание 2 Вы видите, что параметры макета файла макета основаны на ViewStub, а другие атрибуты макета основаны на самом файле макета.

Источник

Оцените статью