У меня есть GridLayout
содержащий ListView
и TextView
. Когда элементы добавляются в ListView
он будет расти в размерах и подталкивает TextView
под ним из экрана. Я думал, что, установив layout_gravity="fill"
в ListView, он не будет расти вообще, а займет все свободное место.
Как настроить ListView
для захвата свободного места вместо того, чтобы расти и подталкивать представления под ним из экрана?
Я ищу решение с помощью GridLayout
. Я знаю, что в моем случае LinearLayout
будет работать. Однако это всего лишь минимальный тестовый пример, чтобы проиллюстрировать мою проблему.
Я не хочу устанавливать высоту программно, если это возможно.
<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:columnCount="1" app:useDefaultMargins="true" > <ListView app:layout_gravity="fill" /> <TextView android:text="TextView" /> </android.support.v7.widget.GridLayout>
Этот ответ расширяет мои комментарии к вопросу и пытается объяснить, why this cannot be done with XML via GridLayout's attributes
.
Добавление GridLayout
в структуру позволило разрешить ряд недостатков относительно вложенных макетов, одним из которых является "inability to control alignment along both horizontal and vertical axes simultaneously"
как описано в статье « Новые макеты виджета: пространство и сетка » Филиппа Милна.
Этот контроль выравнивания выполняется параметром layout_gravity
, в description
которого указано, что параметр "specifies how a component should be placed
in its group of cells",
( NOT within a root layout
). В принципе, это то же самое, что и у LinearLayout
, о котором также упоминалось в статье: "Alignment/gravity also works just like gravity in LinearLayout..."
И, как мы знаем, для LinearLayouts
, как только представление LinearLayouts
всю высоту Экран (например, ListView
в вашем случае), то под ним вид экрана ниже, если ориентация макета установлена на "vertical"
.
Если мы посмотрим на документацию GridLayout.LayoutParams, мы не найдем ни одного параметра, который позволил бы компоненту внутри группы ячеек придерживаться определенной позиции родительского макета и оставаться в позиции независимо от размера других компонентов в одном и том же группа; Аналогично параметрам layout_align[...]
RelativeLayout.
Мое лучшее предположение об отсутствии таких параметров в GridLayout
– лучший контроль выравнивания по сравнению с вложенными макетами.
Я уверен, что вы знаете решение (ы) для своей проблемы, используя подход, отличный от атрибутов GridLayout's
. Я просто предлагаю сделать это, чтобы сделать ответ выполненным:
<GridLayout ... > <RelativeLayout ... > <TextView ... android:id="@+id/tv" android:layout_alignParentBottom="true" /> <ListView ... android:layout_above="@id/tv"> </ListView> </RelativeLayout> </GridLayout>
Вы можете программно установить высоту ListView следующим образом:
ListView listView = (ListView) findViewById(R.id.listview); LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) listView.getLayoutParams(); layoutParams.height = listHeight; listView.setLayoutParams(layoutParams); listView.setAdapter(listAdapter);
Тем не менее, я не могу придумать способ сделать этот масштаб хорошо для нескольких устройств.
Единственный способ ограничить размер ListView конвейерным контентом как высоты – это расширить класс, переопределив метод onMeasure и установив для вас лимит высоты. Я не знаю никаких параметров xml, которые бы дали вам желаемый эффект.
Если вы хотите, вы можете установить TextView внутри нижнего колонтитула, а затем ListView не будет его выталкивать. Хотя я не уверен, что это то, что вы хотите
<?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- Footer aligned to bottom --> <RelativeLayout android:id="@+id/footer" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@drawable/background" android:gravity="center" > <!-- TextView Here --> </RelativeLayout> <!-- Content below header and above footer --> <RelativeLayout android:id="@+id/content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@id/footer" android:gravity="center" > <!-- ListView Here --> </RelativeLayout> </GridLayout>
Вы должны использовать другой макет в качестве родителя для ListView
и TextView
и TextView
их так, как хотите.
<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:columnCount="1" app:useDefaultMargins="true" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_above="@+id/text_view_id" /> <TextView android:id="@+id/text_view_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="TextView" /> </RelativeLayout> </android.support.v7.widget.GridLayout>