Подтвердить что ты не робот

Просмотр в ScrollView не соответствует родительским настройкам

У меня есть ViewPager и ActionBar с вкладками. Одна из этих вкладок имеет ListView, и когда я использую один из параметров в этом ListView, я добавляю дочерний фрагмент, который является подробным представлением для этой строки.

Этот подробный вид представляет собой ScrollView с LinearLayout внутри него. ScrollView - match_parent/match_parent, а LinearLayout внутри - width=match_parent и height=wrap_content. На эмуляторе размера телефона детальный вид заполняет экран по своему желанию, но на планшете подробный вид охватывает только часть ширины экрана... хотя ширина ScrollView и ширина LinearLayout оба match_parent.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rootView" style="@style/RootScrollView">

    <LinearLayout android:id="@+id/scrollContentView" style="@style/ScrollViewContent">
        ...
    </LinearLayout>
</ScrollView>

Вот стиль прокрутки:

<style name="RootScrollView">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">match_parent</item>
</style>

Вот стиль для контента LinearLayout:

<style name="ScrollViewContent">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:paddingLeft">15dp</item>
    <item name="android:paddingRight">15dp</item>
    <item name="android:orientation">vertical</item>
    <item name="android:background">@drawable/image_legal_paper_tile</item>
</style>

В представлении содержимого есть повторяющийся фон image_legal_paper_tile, который:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/legal_paper_tile" 
    android:gravity="fill_horizontal"
    android:tileMode="repeat" />

Итак, изображение должно растягиваться горизонтально и повторяться, что создает желтую легальную бумажную панель в фоновом режиме.

Это то, что список и подробный вид выглядят как эмулятор телефона:

enter image description here

Вот что выглядит список и подробный вид на реальном планшете. Желтый юридический фрагмент площадки ДОЛЖЕН заполнять всю ширину экрана, но это не так.

enter image description here

EDIT:

Вот фоновая документальная фотография:

enter image description here

Это 320 пикселей шириной. Эмулятор телефона имеет ширину 480 пикселей, и изображение правильно растягивается, чтобы заполнить ширину экрана. Затем он повторяется вертикально по назначению. Однако он не растягивается, чтобы заполнить ширину экрана на планшете.

Ширина, указанная на планшете, НЕ является внутренним размером изображения, поскольку она изменяет размер на основе содержимого. Когда первый фрагмент загружается, он имеет одну ширину. Затем я заполняю поля и выполняю расчет, который добавляет некоторый текст в нижней части содержимого. Этот текст шире, чем существующий контент, поэтому, когда текст установлен, ширина фрагмента увеличивается, чтобы поддерживать более широкий контент.

Итак, короче говоря, нет, ширина на планшете не является собственным размером изображения. Изображение растягивается, просто не растягивается полностью.

4b9b3361

Ответ 1

В ScrollView используйте android:fillViewport="true" а для потомка ScrollView android:height="wrap_content". Если вы хотите иметь много дочерних элементов с разными атрибутами, сделайте основной дочерний элемент контейнером. Установите его как wrap_content и его дочерний как match_parent.

пример:

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:fillViewport="true">

    <LinearLayout
        android:id="@+id/dynamic_frame"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/dimrix_sub_child"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:visibility="gone" >
        </LinearLayout>

        <LinearLayout
             android:id="@+id/dimrix_sub_child_21"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:visibility="gone" >
        </LinearLayout>
    </LinearLayout>
</ScrollView>

В этом примере я могу установить видимость в коде для каждого дочернего элемента, и он будет соответствовать родительскому, как вы пожелаете.

Ответ 2

Попробуйте добавить android: fillViewport = "true" в свой ScrollView

помните, что android: layout_height = "fill_parent" означает "установить высоту в высоту родителя". Это явно не то, что вы хотите, используя ScrollView. В конце концов, ScrollView станет бесполезным, если его содержимое всегда будет таким же высоким, как и сам. Чтобы обойти это, вам нужно использовать атрибут ScrollView под названием android: fillViewport. Если установлено значение true, этот атрибут заставляет дочерние элементы прокрутки расширяться до высоты ScrollView, если это необходимо. Когда ребенок выше ScrollView, атрибут не имеет эффекта.

Ответ 3

Я выяснил обходное решение, но я не буду принимать этот ответ и, надеюсь, кто-то найдет реальный ответ.

В моем фрагменте просмотра списка, обработчик onListItemClick(), я установил пару свойств (minWidth и minHeight) на фрагменте детали. Затем в методе onCreateView() фрагмента детали я устанавливаю минимальную ширину и высоту для этого значения.

Детальный фрагмент затем правильно заполняет пространство и позволяет прокручивать и т.д.