Поддерживает ли Android наследование макетов (аналогично шаблонам Django)? - PullRequest
15 голосов
/ 02 декабря 2010

Возможно, я неправильно понимаю, как работают <include> и <merge>, но согласно Простой пример использования и в XML-макетах Android , <include> означает "принять этофайл и вставьте его содержимое здесь ".

Допустим, вы хотите иметь 3 действия, которые имеют одинаковый заголовок, но разный контент.Вам все еще нужно будет иметь 3 XML-файла макета для каждого действия.Единственное различие между каждым из макетов состоит в том, что они определяют другой макет в теге <include>.Если бы я хотел добавить нижний колонтитул, мне пришлось бы менять каждый макет.

Я ищу способ достижения обратного, чтобы дочерние макеты переопределяли определенные блоки родительского элемента ( аналогичнов шаблоны Django ).Таким образом, если бы я хотел добавить этот нижний колонтитул, я просто изменил бы родительский элемент, и дети продолжили бы переопределять только содержимое.

Ответы [ 2 ]

11 голосов
/ 02 декабря 2010

Допустим, вы хотите иметь 3 действия, которые имеют одинаковый заголовок, но разный контент. Вам все еще нужно будет иметь 3 XML-файла макета для каждого действия. Единственная разница между каждым из макетов заключается в том, что они определяют другой макет в теге.

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

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

В настоящее время Android не поддерживается. Как указывает janoliver, вы можете предложить для этого собственное решение.

2 голосов
/ 30 октября 2013

Я решил эту проблему, добавив записи ViewStub в XML-макет родительского элемента и - в зависимости от типа подкласса - накачав правильную заглушку.

http://developer.android.com/reference/android/view/ViewStub.html

ViewStubЭто своего рода ленивая загрузка представления, поэтому, если вы никогда не вызовете inflate () для него или не сделаете его видимым, он не будет добавлен в иерархию макета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...