#android #android_layout
Пытаюсь сделать приложение, которое будет показывать наверху в заголовке фото (для красоты), потом на нижней границе заголовка FloatingActionButton (для показа списка всех BLE beacon, найденных рядом) и внизу две строчки текста (имя и MAC-адрес выбранного BLE beacon) и кнопку "Удалить". Bluetooth-код работает хорошо, а вот с layout не могу разобраться, пожалуйста, помогите. Я отметил красными стрелками, куда собственно должны встать элементы: Вот мой activity_main.xml, почему layout_gravity="bottom" не опускает 2 строчки текста и кнопку вниз?И styles.xml: ОБНОВЛЕНИЕ: Перешел на RelativeLayout, как предложено в этом ответе, но не понимаю, как опустить кнопку "Delete" вниз - чтобы лучше использовать место на экране:
Ответы
Ответ 1
UPD2 В библиотеке поддержки добавилось несколько новых компоновочных контейнеров: PercentRelativeLayout и PercentFrameLayout (библиотека android.support:percent) - компоновщики имеют все те же атрибуты, что и их "родители", кроме того появилась возможность указывать отступы, расстояния и размеры для вложенных в контейнер виджетов в процентах от размеров самого контейнера. Пример FlexboxLayout (библиотека com.google.android:flexbox) - по свойствам схож с LinearLayout,виджеты располагаются друг за другом, однако имеет существенное отличие - когда виджеты доходят до границы контейнера, они переносятся "на следующую строку", а не теряются за его границей (аналогичен FlowLayout на десктопе). Так же имеет несколько атрибутов позиционирования и взаиморасположения виджетов между собой и в контейнере. Пример ConstraintLayout - (библиотека поддержки android.support.constraint:constraint-layout) - контейнер похож на RelativeLayout, поддерживается только начиная с Android Studio 2.2, где для его использования переписали визуальный редактор. Принцип позиционирования основан на "резиновой" верстке, где вы можете указать расстояния между виджетами, границы для них и взаимное расположение, при этом относительные размеры в верстке будут сохранятся при поворотах или разных размерах и плотностях экрана Описать это очень сложно, поэтому скриншот должен внести ясность. В виду повышенной сложности Google даже сделала официальный анимированный туториал по использованию UPD Существует отдельная группа контейнеров, не так давно добавленная гугл в виде библиотек поддержки, которые относятся не столько к компоновщикам элементов на экране, сколько к организации их взаимодействия между собой. Например, CoordinatorLayout используется для анимированного взаимодействия элементов. Всякие выдвигающиеся или там всплывающие штуки. По сути это FrameLayout с возможностями связывания элементов в динамике. Он позволяет связывать двигающиеся элементы внутри себя так, что они не теряют связи при движении и могут взаимодействовать. Использовать можно в любых типах анимации, например всплывающий SnackBar - при его появлении остальные элементы смещаются, чтобы он не перекрывал их или выдвигающаяся при скроллинге вниз картинка. Так как это модифицированный FrameLayout, то для группировки элементов внутри него, если их несколько, необходимо использовать другие контейнеры, чтобы разместить элементы так, как требуется. В общем то аналогичного поведения можно добиться и при использовании основных контейнеров, но ранее для этого приходилось их определенным образом модифицировать, как, например, в этом ответе - теперь гугл сделала собственный механизм, включенный в API Android. Основной ответ FrameLayout не подходит для выбранной вами компоновки, так как этот контейнер (по умолчанию) размещает все вложенные в него элементы в верхний левый край, с наложением одних на другие. Это самый простой из контейнеров и позиционирование внутри него ограничено свойством gravity, то есть кроме верхнего левого края, элементы можно разместить по центру или привязать к другим краям (правый, верх, низ), также возможны отступы от краев - padding и\или margin - на этом возможности компоновки в данном контейнере заканчиваются. Как видите этого недостаточно для размещения элементов последовательно - один за другим, либо еще какого-то относительного связывания вложенных элементов между собой внутри данного контейнера. Для более сложных компоновок используются контейнеры: LinearLayout- вложенные элементы идут друг за другом по вертикали или горизонтали. TableLayout - вложенные элементы размещаются в структуру таблицы. По сути это горизонтальные LinearLayout вложенные в вертикальный LinearLayout в более удобном представлении. Поскольку ячейки таблицы могут иметь разный размер и в каждой строке может быть разное количество ячеек, то с его помощью можно скомпоновать довольно сложные разметки,составные элементы которой можно разбить на ячейки ( а это почти все в реальности) GridLayout - технически повторяет TableLayout, но более функциональный и имеет дополнительные возможности в части позиционирования элементов ( можно указать номер конкретной ячейки, где разместить элемент), также позволяет размещать несколько элементов в одной ячейке и некоторые другие возможности. RelativeLayout - вложенные элементы связываются друг с другом линками между собой и\или границами контейнера - это самый сложный (и самый ресурсоемкий) компоновщик, позволяет практически произвольно размещать элементы внутри себя, в том числе и с наложением один на другой, без центровки по осям и прочие чудеса. Существует еще несколько менее популярных контейнеров на которых я останавливаться не буду. Выбирать контейнер надо из соображений достаточной функциональности. Выше они расположены в порядке приоритета, то есть если для компоновки достаточно LinearLayout, то использовать RelativeLayout будет излишним расточительством ресурсов устройства, так как это намного более ресурсоемкий контейнер. Отдельно нужно заметить по поводу вложения одного контейнера в другой - если есть возможность скомпоновать виджеты в один контейнер, то это предпочтительнее, чем использовать вложенные контейнеры, то есть RelativeLayout будет предпочтительнее трех вложенных LinearLayout, чем линейней получается структура компоновки, тем лучше для производительности, как правило.Ответ 2
К кнопке delete добавь свойство android:layout_alignParentBottom="true"
Комментариев нет:
Отправить комментарий