Как обернуть представления контента, а не рисовать фон? - PullRequest
19 голосов
/ 30 ноября 2010

Как я могу заставить LinearLayout (или любую другую ViewGroup) принять размер своих дочерних представлений, а не размер фонового изображения?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/large_image300x300pix">

 <TextView android:id="@+id/TextView01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Hello world!"/>
</LinearLayout>

Линейный макет становится такого же размера, какфоновое изображение.Как я могу получить мой линейный макет, чтобы принять тот же размер, что и текстовое представление?

Ответы [ 5 ]

21 голосов
/ 16 октября 2013

ОК, так что эта тема немного старая, но у меня есть решение, которое кто-нибудь может найти полезным.Я думаю, что у Android есть проблемы с масштабированием больших изображений, поэтому размер LinearLayout в конечном итоге ограничивается растровым растровым изображением фона, а ImageView в конечном итоге увеличивает размер родительского контейнера.

Если вы не используете относительную компоновку,Вы можете сделать ImageView относительно положения LinearLayout, даже если ImageView находится позади макета в родительском элементе.Мое решение выглядит примерно так:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
    android:src="@drawable/activation_popup"
    android:scaleType="fitXY"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_alignTop="@+id/activation_layout"
    android:layout_alignBottom="@id/activation_layout"
    android:layout_alignLeft="@id/activation_layout"
    android:layout_alignRight="@id/activation_layout"
    android:contentDescription="@string/act_code_label" />
<LinearLayout
    android:id="@id/activation_layout"
    android:clipToPadding="true"
    android:padding="25dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <!-- LinearLayout wraps a bunch of smallish views here -->
</LinearLayout>
</RelativeLayout>

Я пробовал это на вершине размеров дисплея и версий ОС, похоже, отлично работает.Обратите внимание, что заполнение в LinearLayout - это хитрость, позволяющая выделить место для теневой границы в фоновом изображении.LinearLayout не нуждается в относительном позиционировании, потому что предполагается верхний левый угол.

4 голосов
/ 30 ноября 2010

Вы можете создать FrameLayout и поместить туда ImageView и ваш LinearLayout.Таким образом, вы сможете настроить макет вашего фонового изображения.

1 голос
/ 08 июля 2015

Это происходит потому, что представление Android вычисляет свой минимальный размер на основе размера фона для рисования.

Отметьте мой ответ здесь в этом другом посте, посвященном той же проблеме, которая поможетдостичь вашей конфигурации макета.

0 голосов
/ 11 февраля 2012

Я считаю, что лучшее решение здесь - установить android: clipToPadding = "true". Это исключает заполнение основного макета и переносит его в дочерние элементы.

0 голосов
/ 30 ноября 2010

Если ваше изображение поддается преобразованию в масштабируемое изображение с 9-фрагментами, то это приведет к масштабированию фона вокруг TextView.

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