В свой XML-файл макета я включил другой XML-файл макета (каждый с другим идентификатором Android).
<include layout="@layout/view_contact_name" android:id="+id/test1"/>
<include layout="@layout/view_contact_name" android:id="+id/test2"/>
Но когда я запускаю его в эмуляторе и запускаю Hierarchy Viewer, каждый макет по-прежнему показывает «NO_ID», и в моем коде у меня есть
findViewById(R.id.test1)
и findViewById(R.id.test2)
оба возвращают значение null.
Может ли кто-нибудь помочь мне с моей проблемой?
android
android-layout
hap497
источник
источник
@
символ.Ответы:
Укажите идентификатор в
<include>
Затем используйте два
findViewById
для доступа к полям в макетеИспользуя этот подход, вы можете получить доступ к любому полю в любом включении, которое у вас есть.
источник
merge
даже теоретически, потому что результатом включенияmerge
является не одно представление, а их множество. Так что все нормально.Я выяснил, что если вы используете
<merge>
тег в макете включения, то идентификатор включения передается в тег слияния, который не является реальным представлением.Так что либо удалите слияние, либо замените его каким-нибудь макетом.
Тор Норбай писал :
источник
Ромен Гай указывает, что вы можете переопределить идентификатор включенного макета, поместив
android:id
атрибут внутри<include>
тега.источник
Я думаю, что главный ответ упускает из виду самый важный момент и может ввести людей в заблуждение, думая, что
<include/>
тег создает представление, содержащее включаемое содержимое.Ключевой момент является то, что включает в себя'S идентификатор будет принят в корневых зрения включаемого'S файл макет.
Это означает:
Становится это:
источник
Да, это похоже на это, но будьте осторожны, когда макет, вставленный в поле включения, является настраиваемым, и вы хотите получить доступ к этому корневому макету. Этот макет в этом случае @ layout / test test фактически возвращается в первой строке.
источник
источник
Проблема в том, что мы пытаемся использовать идентификатор, который не объявлен в текущем файле макета. Вместо повторного объявления id можно просто указать с помощью
@+id/
. Если вы реорганизуете исходное имя идентификатора через Android Studio, оно также выполнит рефакторинг во включенном макете.источник
В случае использования
<RecyclerView>
find id of<include>
с помощью экземпляра завышенного представления, иначе он вернет null .источник
Если вы установили id для корневого тега включенного макета, вы можете использовать этот идентификатор или установить id для включенного макета.
Но вы не можете установить id для обоих, это может вызвать исключение.
Или
источник
Когда речь идет о включении, у вас либо есть идентификатор в корневом представлении внутри включаемого файла макета, либо в самой строке включения, но не в обоих. Например:
Макет 1 файл
Приведенный выше пример неверен, потому что технически у вас есть два идентификатора, объявленных для одного и того же макета. Итак, что вам нужно сделать, это выбрать, какой элемент будет иметь идентификатор.
источник
Вау, я не могу поверить, что на этот вопрос пока нет правильного ответа. Это простые теги - отстой. Вы можете изменить только вещи , которые начинаются с
android:layout_
которыхandroid:id
не совпадает. Итак, ответ - вы не можете. Сожалею. Вместо этого вы можете создать класс, который будет ViewGroup, который будет раздувать включенные представления внутри, а затем добавить это как тег в свой макет, но об этом.источник