Как включить макет дважды в Android? - PullRequest
27 голосов
/ 04 декабря 2010

Элемент <include /> в Android позволяет включать другие макеты XML. Полезно для общего заголовка по нескольким действиям.

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

Есть ли какой-нибудь механизм для этого?

(Я правильно объяснил?)

Ответы [ 4 ]

55 голосов
/ 30 мая 2012

Сообщение в блоге на http://www.coboltforge.com/2012/05/tech-stuff-layout/ (которое сейчас недоступно, но можно найти на https://web.archive.org/web/20160425233147/http://www.coboltforge.com/2012/05/tech-stuff-layout/), объясняет именно эту проблему (один и тот же XML-макет включен несколько раз) и как ее решить!

Редактировать

При поиске по идентификатору вы всегда находите первые элементы, поэтому вторые виджеты скрыты.

Однако, это можно решить

<include> -- id1
    -- stuff
</include>
<include> -- id2
    -- stuff
</include>

Таким образом, мы можем найти подэлементы, сначала просмотрев id2 / id1.

View include_1 = findViewById(R.id.id1); 
View include_2 = findViewById(R.id.id2); 

и, наконец,

include_2.findViewById(R.id.elementx );
5 голосов
/ 04 декабря 2010

Есть ли какой-нибудь механизм для этого?

Создать кастом View. Вот проект , где у меня есть ColorMixer пользовательский виджет, например.Если хотите, вы можете включить несколько таких ColorMixers в один макет.Каждый может иметь свои собственные параметры для настройки своей работы.

3 голосов
/ 04 декабря 2010

Другой способ - установить макет «шаблона» в xml и накачать его с помощью LayoutInflater , добавить в ваше представление столько раз, сколько вам нужно, и вставить в него пользовательские значения. Здесь - пример для создания пользовательского тост-представления с помощью всплывающего макета.

2 голосов
/ 04 декабря 2010

Вы можете использовать android:id, чтобы указать идентификатор корневого представления включенного макета; он также переопределит идентификатор включенного макета, если он определен. Точно так же вы можете переопределить все параметры макета.

На основании предоставленного android:id вы можете получить раздел по идентификатору, а затем снова получить элемент по идентификатору на основе только что полученного раздела. Таким образом, вы сможете искать все дочерние представления с одинаковыми идентификаторами в каждом родительском представлении с разными идентификаторами в два этапа.

...