LinearLayout nie rozwija się w ScrollView

371

Mam LinearLayoutwnętrze, ScrollViewktóre ma android:layout_height="fill_parent", ale nie rozszerza się do pełnej wysokości ScrollView. Mój układ wygląda mniej więcej tak:

level    layout    layout_width    layout_height
1    LinearLayout    fill_parent    fill_parent
2    LinearLayout    fill_parent    wrap_content
3    (some irrelevant stuff)
2    ScrollView      fill_parent    fill_parent <-- this expands full height
3    LinearLayout    fill_parent    fill_parent <-- this does not (has orientation=vertical)
(following stuff probably are irrelevant, but just to be sure:)
4    TextView        fill_parent    fill_parent
4    LinearLayout    fill_parent    wrap_content

Widzę, że LinearLayoutnie rozszerza pełnej wysokości, ScrollViewponieważ w Eclipse w Android Layout Editor, jeśli wybiorę ScrollView(w panelu Kontur), zostanie podświetlona czerwoną ramką, która wypełnia ekran do dołu, ale kiedy zaznaczę LinearLayoutjego podświetlenie nie rozwija się na dole ekranu. Jak mogę to zrobić?

Efekt, który próbuję osiągnąć, to mieć tekst i przycisk poniżej (wewnątrz LinearLayoutpoziomu 4 jest tylko przycisk). Tekst może być wystarczająco duży, aby potrzebować paska przewijania, w takim przypadku chcę, aby użytkownik musiał przewinąć w dół, aby zobaczyć przycisk. W przypadku, gdy tekst nie jest wystarczająco duży, aby przewijać pasek przewijania, chcę LinearLayout, aby przycisk zawierający znajdował się na dole ekranu.

Na początku myślałem, że nie powinienem publikować pełnego kodu XML, ponieważ zwykle jest to odrzucenie, aby zobaczyć dużą część kodu w pytaniu. Wydaje się jednak, że może to być konieczne, więc oto pełny układ.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@+id/video_layout"
        android:focusable="true"
        style="@style/VideoLayout">
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:foreground="@android:drawable/ic_media_play"
            android:foregroundGravity="center">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/video_thumb"
                android:padding="5dip"
                android:background="#454545"/>
        </FrameLayout>
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:focusable="true"
            style="@style/VideoTitle"
            android:id="@+id/video_title"
            android:layout_gravity="center"
            android:layout_weight="1"/>
    </LinearLayout>
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
        <!-- this ScrollView expands the full height of the screen.
             However, the next LinearLayout does not expand the full height of the ScrollView -->
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:layout_gravity="fill"
            android:orientation="vertical"
            android:id="@+id/info_layout">
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/info_body"
                style="@style/InfoText"/>
            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                style="@android:style/ButtonBar">
                    <Button
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:layout_weight="1"
                        android:text="@string/button_readmore"
                        android:id="@+id/btn_read_more"/>
            </LinearLayout>
        </LinearLayout>
    </ScrollView>
</LinearLayout>

W tej chwili sięgnąłem android:layout_gravity="bottom"po problem LinearLayout, który sprawia, że ​​przycisk przykleja się do dolnej części ekranu bez względu na wszystko. Ale to sprawia, że ​​tekst przykleja się do dolnej części ekranu, co nie jest dokładnie tym, czego szukałem.

Aktualizacja: podrap to, co android:layout_gravity="bottom"uniemożliwia ScrollViewprzewijanie. Inne pomysły?

Felix
źródło

Odpowiedzi:

956

W końcu sam znalazłem rozwiązanie. Problemem nie było z LinearLayout, ale z ScrollView(wydaje dziwne, biorąc pod uwagę fakt, że ScrollView było się rozwija, podczas gdy LinearLayoutnie było).

Rozwiązaniem było użycie android:fillViewport="true"na ScrollView.

Felix
źródło
4
Zauważ, że LinearLayout rozszerzy się w pionie, ale niekoniecznie musi to zostać odzwierciedlone w twoim układzie, chyba że zawiera kontrolkę zajmującą dodatkowe miejsce android:weight.
Paul Lammertsma,
To naprawdę pomaga. Dziękuję za to. Ale bez tego kodu czasami działa dobrze. Wiesz dlaczego?
Ashokchakravarthi Nagarajan
nie działa dla <LinearLayout android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: fillViewport = "true" android: background = "# 000" android: orientacja = "vertical"> </LinearLayout>
Prasad
3
Tak chory siedziałem godzinami i szukałem, co jest nie tak z moim kodem. Po co ten parametr? Kiedy chcesz ustawić to na fałsz?
MyWay
@Prasad ustaw wysokość liniowego układu w taki sposób, aby pasowała do
elementu
22

Wiem, że ten post jest bardzo stary, dla tych, którzy nie chcą go używać, android:fillViewport="true"ponieważ czasami nie wyświetla tekstu nad klawiaturą. Użyj układu względnego zamiast liniowego, to rozwiązuje cel.

Hardik4560
źródło
8

Czy możesz podać swój układ xml? Takie postępowanie pozwoliłoby ludziom odtworzyć problem przy minimalnym wysiłku.

Być może będziesz musiał ustawić

android:layout_weight="1"

dla elementu, który chcesz rozwinąć

snctln
źródło
1
Dziękuję za Twoją odpowiedź. Próbowałem twojej sugestii, ale to nie zadziałało. Zaktualizowałem również moje pytanie, aby uwzględnić układ xml.
Felix
3

Rozwiązaniem jest użyć

android:fillViewport="true"

w widoku przewijania, a ponadto spróbuj użyć

"wrap_content"zamiast "fill_parent"jak"fill_parent"

jest już przestarzałe.

Khushboo Aggarwal
źródło
2

Użyłem tego dynamicznie. Mam LinearLayout i w ramach tego ScrollView używane jako dziecko. Następnie biorę ponownie LinearLayout i dodaję to, co kiedykolwiek zobaczysz, do tego LinearLayout, a następnie ten LinearLayout dodaj do ScrollView i na koniec dodaj ten ScrollView do LinearLayout. Następnie możesz przewinąć w swoim ScrollView i nic nie pozostanie widoczne.

LinearLayout (Parent) - ScrollView (potomek LinerLayout) - LinearLayout (potomek ScrollView) - dodaj tutaj textView, przyciski, pokrętło itp. Cokolwiek chcesz. Następnie dodaj ten LinearLyout do ScrollView. Bcoz ma tylko jedno DZIECKO dla ScrollView i ostatnio dodaj ten ScrollView do LinearLyout. Jeśli zdefiniowany obszar jest większy niż rozmiar ekranu, otrzymasz ScrollView w ScrollView.

Braj
źródło
Ale to rozwiązanie sprawia, że ​​xml jest bardziej skomplikowany i zajmuje więcej czasu.
twlkyao,
1

W moim przypadku nie podałem

orientacja LinearLayout (dziecko ScrollView)

Tak więc domyślnie zajmuje ono poziomo, ale przewijanie przewija w pionie, więc sprawdź, czy „android: orientacja =„ pionowy ”” jest ustawiony na potomka twojego ScrollView (w przypadku LinearLayout).

To był mój przypadek, który ma nadzieję, że komuś to pomoże

.

Vishal Pandey
źródło