Находит ли поддержка макета поддержки Android (похожая на шаблоны Django)?
Возможно, я не понимаю, как работают <include>
и <merge>
, но согласно Простой пример <merge> и <include> использование в XML-макетах Android, <include>
означает "взять этот файл и вставить его содержимое здесь".
Предположим, вы хотите иметь 3 действия, которые имеют один и тот же заголовок, но имеют различный контент. Вам нужно будет иметь 3 файла макета XML для каждого вида деятельности. Единственное различие между каждым из макетов будет заключаться в том, что они определяют другой макет в теге <include>
. Если бы я хотел добавить нижний колонтитул, мне пришлось бы менять каждый макет.
Я ищу способ достижения обратного, поэтому макеты детей будут переопределять определенные блоки родителя (похожие на шаблоны Django). Таким образом, если бы я хотел добавить этот нижний колонтитул, я бы просто изменил родительский элемент, и дети продолжали бы переопределять только содержимое.
Ответы
Ответ 1
Предположим, вы хотите иметь 3 действия, которые имеют один и тот же заголовок, но имеют различный контент. Вам нужно будет иметь 3 файла макета XML для каждого вида деятельности. Единственное различие между каждым из макетов будет заключаться в том, что они определяют другой макет в теге.
Если вы хотите иметь три действия, все из которых имеют один и тот же заголовок, у вас будет один файл макета для каждого действия. Этот файл будет иметь виджеты, уникальные для этого действия, и элемент <include>
для общего заголовка.
Таким образом, если бы я хотел добавить этот нижний колонтитул, я бы просто изменил родительский элемент, и дети продолжали бы переопределять только содержимое.
Это не поддерживается Android в это время. Как указывает janoliver, вы можете свернуть свое решение для этого.
Ответ 2
Я решил это, добавив записи ViewStub в макет xml родителя и - в зависимости от типа подкласса - раздувая правильный заглушку.
http://developer.android.com/reference/android/view/ViewStub.html
ViewStub - это своего рода ленивая загрузка представления, поэтому, если вы никогда не называете inflate() на нем или никогда не делаете его видимым, он не будет добавлен в иерархию макета.