У меня были серьезные проблемы с тем, чтобы LayoutInflater работал должным образом, как и другие люди: как использовать layoutinflator для добавления представлений во время выполнения? ,
Почему LayoutInflater игнорирует параметры макета, которые я указал? Например, почему значения layout_width
и layout_height
мои ресурсы XML не соблюдаются?
android
android-layout
andig
источник
источник
Ответы:
Я исследовал эту проблему, ссылаясь на документы LayoutInflater и создав небольшой демонстрационный проект. В следующих руководствах показано, как динамически заполнить макет с помощью
LayoutInflater
.Прежде чем мы начнем, посмотрим, как
LayoutInflater.inflate()
выглядят параметры:R.layout.main_page
)attachToRoot
естьtrue
), или просто объект, который предоставляет наборLayoutParams
значений для корня возвращаемой иерархии (еслиattachToRoot
естьfalse
.)attachToRoot : должна ли завышенная иерархия быть присоединена к корневому параметру? Если false, root используется только для создания правильного подкласса
LayoutParams
для корневого представления в XML.Возвращает : корневой вид завышенной иерархии. Если root был указан и
attachToRoot
естьtrue
, это root; в противном случае это корень завышенного XML-файла.Теперь для примера макета и кода.
Основной макет (
main.xml
):В этот контейнер добавлен отдельный TextView, видимый в виде маленького красного квадрата, если параметры макета успешно применяются из XML (
red.xml
):Теперь
LayoutInflater
используется с несколькими вариантами параметров вызоваФактические результаты изменений параметров задокументированы в коде.
ОПИСАНИЕ: Вызов
LayoutInflater
без указания корня приводит к раздутому вызову, игнорирующему параметры макета из XML. Вызов inflate с root не равенnull
иattachRoot=true
загружает параметры макета, но возвращает корневой объект снова, что предотвращает дальнейшие изменения макета загруженного объекта (если вы не можете найти его с помощьюfindViewById()
). Поэтому соглашение о вызовах, которое вы, скорее всего, хотели бы использовать, таково:Чтобы помочь с проблемами макета, настоятельно рекомендуется инспектор макета .
источник
Activity
является подклассом,Context
и примеры ответа находятся в области видимостиActivity
, поэтому, чтобы упростить его, я заменилgetBaseContext()
на,this
поскольку, ради этого ответа, это эквивалентно.andig правильно, что общая причина игнорирования LayoutInflater ваших layout_params была бы, потому что корень не был указан. Многие люди думают, что вы можете передать null для root. Это приемлемо для нескольких сценариев, таких как диалог, когда у вас нет доступа к root во время создания. Однако следует соблюдать хорошее правило: если у вас есть root, передайте его LayoutInflater.
Я написал подробное сообщение в блоге об этом, которое вы можете проверить здесь:
https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/
источник
This is acceptable for a few scenarios such as a dialog
это было все, что мне было нужнохочу добавить к основному ответу выше,
я пытался следовать ему, но мой recyclerView начал растягивать каждый элемент на экран, который
я должен был добавить следующую строку после надувания для достижения цели
Я уже добавил эти параметры в xml, но это не сработало правильно,
и с этой строкой все в порядке
источник