GridLayout опускает свои дочерние элементы и переполняется, когда для параметра fill_parent задана высота - PullRequest
5 голосов
/ 03 февраля 2012

Как кажется, GridLayout всегда будет подталкивать своих дочерних элементов к макету, соответствующему их потребностям. например, следующее объявление:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:columnCount="3"
    android:orientation="vertical"
    android:rowCount="4"
    android:useDefaultMargins="true" >
...
    <ImageView
        android:id="@+id/main_image"
        android:layout_column="1"
        android:layout_columnSpan="2"
        android:layout_row="3"
        android:scaleType="fitStart" />
</GridLayout>

GridLayout объявляет fill_parent, и поэтому я ожидаю, что он не переполнится. GridLayout должен принимать размер родительского элемента, который в данном случае является окном (полная высота). Однако в средстве просмотра иерархии GridLayout устанавливается как Wrap_content как для вертикального, так и для горизонтального.

Таким образом, ImageView (который представляет собой большое изображение) или любое текстовое представление будет выдвигаться, чтобы подогнать себя под себя и, как таковое, переполнит контейнер.

Это можно увидеть в средстве просмотра иерархии, где представление сетки контейнера соответствует родительскому элементу:

container grid view

при переполнении изображения

image view

Читая документацию, я понимаю, что необходимо установить гравитацию. Насколько я могу судить, я использовал все виды параметров гравитации и масштабирования изображения без особого эффекта. Удаление полей с помощью useDefaultMargins="false" меняет переполнение макета, что приводит к проблеме в сетке.

Мой вопрос следующий:

  • Это ошибка или я неправильно использую GridLayout
  • Как я могу заставить детей GridLayout уместить свой контейнер и заполнить оставшиеся пробелы

1 Ответ

0 голосов
/ 27 апреля 2012

Хитрость в других макетах состоит в том, чтобы дать первому элементу андроид: layout_weight = "1.0" и ничего другим элементам. Почему это работает, я понятия не имею, но это так. Вот простой XML, который отображает ImageView, TextView и Button. Без параметра layout_weight, назначенного для ImageView, текст и кнопка были сдвинуты вниз.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/white"
    android:orientation="vertical"
    android:keepScreenOn = "true" >

    <ImageView
        android:id="@+id/imageView_surprise"
        android:layout_width="wrap_content"
        android:layout_height="0dip"
        android:scaleType="centerInside"
        android:contentDescription="@string/accessibility_imageView_surprise"
        android:layout_weight="1.0" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="bottom" >

        <TextView
            android:id="@+id/textView_message"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textColor="@color/black"
            android:textSize="24sp"
            android:gravity="center_horizontal" />

        <Button
            android:id="@+id/button_share"
            style="@style/button_text"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>

</LinearLayout>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...