Я хочу иметь сетку 2х2 с кнопками внутри. Это только ICS, поэтому я пытаюсь использовать новый GridLayout.
Вот XML моего макета:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/favorites_grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00"
android:rowCount="2"
android:columnCount="2">
<Button
android:text="Cell 0"
android:layout_row="0"
android:layout_column="0"
android:textSize="14dip" />
<Button
android:text="Cell 1"
android:layout_row="0"
android:layout_column="1"
android:textSize="14dip" />
<Button
android:text="Cell 2"
android:layout_row="1"
android:layout_column="0"
android:textSize="14dip" />
<Button
android:text="Cell 3"
android:layout_row="1"
android:layout_column="1"
android:textSize="14dip" />
</GridLayout>
Проблема в том, что мои взгляды не растягиваются равномерно для каждой строки. Это вызывает много дополнительного пространства справа от моего GridLayout.
Я попытался установить, layout_gravity="fill_horizontal"
но это относится только к последнему виду в строке. Это означает, что ячейка 1 растягивается полностью, чтобы освободить достаточно места для ячейки 0.
Мысли о том, как справиться с этим?
Ответы:
ОБНОВЛЕНИЕ : веса поддерживаются с API 21. См . Ответ PaulT для более подробной информации. КОНЕЦ ОБНОВЛЕНИЯ При использовании GridLayout существуют ограничения, следующая цитата взята из документации .
Вот небольшой пример, который использует подвиды LinearLayout. (Я использовал Space View, который занимает неиспользуемую область и перемещает кнопки в нужное положение.)
источник
Начиная с API 21, понятие веса было добавлено к GridLayout. Для поддержки старых устройств Android вы можете использовать GridLayout из библиотеки поддержки v7.
Следующий XML дает пример того, как вы можете использовать веса для заполнения ширины экрана.
источник
FrameLayout
который содержалButton and an
ImageView` (чтобы иметь значок, наложенный на кнопку, которая показывала визуальную обратную связь при прикосновении ... длинная история) как часть клавиатуры. НастройкаcolumnWeight
иgravity
на всех остальныхButton
работала нормально, но сломалась наFrameLayout
. Оставляя это только дляFrameLayout
сделанного, все выкладывают равномерно, как и ожидалось.Appcompat21 GridLayout имеет веса столбцов и строк, которые можно использовать, как показано ниже, для равномерного создания каждого элемента сетки в раскладке сетки, как на рисунке выше.
источник
compile "com.android.support:gridlayout-v7:$supportVersion"
app:columnCount="2"
):xmlns:app="http://schemas.android.com/apk/lib/android.support.v7.widget.GridLayout"
Начиная с API 21 без библиотеки поддержки v7 с ScrollView:
XML:
источник
Вы можете установить ширину каждого дочернего элемента динамически:
источник
useDefaultMargins="true"
- прекрасно работает с ними установленнымиfalse
Попробуйте добавить следующее в вашу спецификацию GridLayout. Это должно работать.
источник
Это правильный ответ
источник
Я наконец нашел решение. Как сказал Ротеммиз, вы должны делать это динамически после этого. Этот код растягивает кнопки, чтобы заполнить представление по горизонтали, но то же самое можно сделать для по вертикали.
(20 для внутренней и внешней прокладки и полей. Это можно сделать более универсально, но это намного чище)
Тогда это можно назвать так:
Это должно быть сделано с наблюдателем, потому что нам нужно подождать, пока представление будет нарисовано, прежде чем мы вызовем представления.
источник
В моем случае я добавлял кнопки динамически, поэтому для моего решения требовалась часть XML и часть Java. Я должен был найти и смешать решения из нескольких разных мест и подумал, что поделюсь им здесь, чтобы кто-то другой, ищущий подобное решение, мог бы найти его полезным.
Первая часть моего файла макета XML ...
grid:useDefaultMargins="true"
не требуется, но я добавил, потому что это выглядело лучше для меня, вы можете применять другие визуальные эффекты (например, отступы), как упомянуто в некоторых ответах здесь. Теперь о кнопках, поскольку я должен добавлять их динамически. Вот Java-часть моего кода для создания этих кнопок, я включаю только те строки, которые связаны с этим контекстом. Предположим, мне нужно сделать кнопки из такого количества,myOptions
которые доступны для моего кода, и я также не копирую код OnClickListener.Поскольку мы используем GridLayout из библиотеки поддержки, а не стандартный GridLayout, мы должны сообщить об этом в
YourProject.grade
файле.источник
Вы можете сделать это намного быстрее, переопределив метод ViewGroup onLayout. Это мое универсальное решение:
РЕДАКТИРОВАТЬ: не забудьте матч_парень для детей
источник
getChildAt(i).layout(viewWidth * columnIndex + margin, viewHeight * rowIndex + margin, viewWidth * columnIndex + viewWidth - margin, viewHeight * rowIndex + viewHeight - margin);
Лучшее решение, которое я мог бы найти, - это использовать линейный макет (горизонтальный) для каждой строки, которую вы хотите, и в ней назначить ширину кнопки (ячейки) 0dp, а вес - 1. Для каждого из линейных макетов (рядов) назначить высоту до 0dp и вес до 1. Найдите код ниже - также android: layout_gravity = "center_vertical" используется для выравнивания кнопок в ряду в случае, если они содержат текст переменной длины. Использование 0dp и веса это довольно аккуратный, но не очень известный трюк.
источник
Вот, пожалуйста :
источник
Я хотел иметь центрированную таблицу с выравниванием по правому краю и выравниванием по левому краю. Дополнительное пространство должно быть вокруг стола. После долгих экспериментов и не следуя указаниям документации, которые я должен делать, я нашел кое-что, что работает. Вот что я сделал:
Кажется, это работает, но GridLayout показывает сообщение:
«Этот макет GridLayout или его родитель LinearLayout бесполезен»
Не уверен, почему это «бесполезно», когда это работает для меня.
Я не уверен, почему это работает или это хорошая идея, но если вы попробуете это и сможете предложить лучшую идею, небольшое улучшение или объяснить, почему это работает (или не будет работать), я буду благодарен за отзыв.
Спасибо.
источник
Это довольно старый вопрос, но, очевидно, интересный для многих людей. При такой простой раскладке из 4 кнопок кажется, что TableLayout - это самый простой способ достичь желаемого результата.
Вот пример кода, показывающего первые 2 строки таблицы с 6 столбцами, охватывающими ширину ее родителя. LinearLayout и ImageView в каждой ячейке используются для «включения и выключения» изображения внутри ячейки при сохранении цвета ячейки.
источник
Старый вопрос, но хотел добавить свое решение. Я создал «линейный макет сетки», который имитирует сетку, но с использованием вложенных линейных макетов. Это позволяет ему растягиваться, чтобы заполнить пространство.
источник
Я хотел бы, чтобы это помогло кому-то
результат
Код:
источник
Результат:
Попробуйте что-то вроде этого:
Если вам нужна конкретная ширина и высота для ваших ячеек, используйте:
источник
Это код для более стандартного приложения без кнопок, это очень удобно для меня
источник
У меня та же проблема, и я думаю, просто установить ширину и высоту программно:
установить ширину кнопки с метриками. metrics.widthPixels / 2 является объектом DisplayMetrics.
источник
Вы можете найти все учебники здесь, Android Grid Layout с CardView и OnItemClickListener
источник
Вот что я сделал, и я счастлив сказать, что это сработало для меня. Я тоже хотел, чтобы сетка элементов размером 2x2, 3x3 и т. Д. Покрывала весь экран. Gridlayouts не придерживаются ширины экрана. LinearLayouts работает, но вы не можете использовать вложенные веса.
Лучший вариант для меня , чтобы использовать фрагменты я использовал этот уроке, чтобы начать то, что я хотел сделать.
Вот некоторый код:
Основное занятие:
Activity_main_6 XML (раздувает 3 фрагмента)
Расположение базового фрагмента
Класс фрагмента (обрабатывает только инициализацию пользовательского представления) раздувает 2 фрагмента на фрагмент
}
Это оно!
По сути, это странная работа с использованием вложенных весов. Это дает мне идеальную сетку 2х3, которая заполняет весь экран моего 10-дюймового планшета и ДНК моего дроида HTC. Дайте мне знать, как у вас дела!
источник