LinearLayout wird in einer ScrollView nicht erweitert

371

Ich habe ein LinearLayoutInneres ScrollView, das hat android:layout_height="fill_parent", aber es dehnt sich nicht auf die volle Höhe des aus ScrollView. Mein Layout sieht ungefähr so ​​aus:

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

Ich kann sehen, dass das LinearLayoutnicht die volle Höhe des vergrößert, ScrollViewda in Eclipse in Android Layout Editor, wenn ich das ScrollView(im Gliederungsbedienfeld) auswähle, es mit einem roten Rand hervorgehoben wird, der den Bildschirm bis zum unteren Rand ausfüllt, aber wenn ich das LinearLayoutHervorheben auswähle wird nicht bis zum unteren Bildschirmrand erweitert. Wie kann ich das dazu bringen?

Der Effekt, den ich erreichen möchte, besteht darin, Text und eine Schaltfläche darunter zu haben ( LinearLayoutin Stufe 4 befindet sich nur eine Schaltfläche). Der Text kann groß genug sein, um eine Bildlaufleiste zu benötigen. In diesem Fall muss der Benutzer nach unten scrollen, um die Schaltfläche zu sehen. Falls der Text nicht groß genug für eine Bildlaufleiste ist, soll LinearLayoutdie Schaltfläche mit dem unteren Rand des Bildschirms angezeigt werden.

Zuerst dachte ich, ich sollte nicht das vollständige XML veröffentlichen, da es normalerweise eine Ablehnung ist, einen riesigen Codeabschnitt in einer Frage zu sehen. Es scheint jedoch notwendig zu sein, daher hier das vollständige Layout.

<?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>

Im Moment habe ich android:layout_gravity="bottom"auf das Problem zurückgegriffen LinearLayout, bei dem der Knopf am unteren Bildschirmrand haftet, egal was passiert. Aber das bringt den Text auch dazu, am unteren Rand des Bildschirms zu bleiben, was nicht genau das ist, wonach ich gesucht habe.

Update: Scratch das, android:layout_gravity="bottom"macht die ScrollViewnicht in der Lage, gut zu scrollen. Andere Ideen?

Felix
quelle

Antworten:

956

Ich habe die Lösung am Ende selbst gefunden. Das Problem war nicht mit der LinearLayout, aber mit dem ScrollView(seltsam scheint, angesichts der Tatsache , dass das ScrollView war erweitert, während das LinearLayoutnicht war).

Die Lösung war android:fillViewport="true"auf dem zu verwenden ScrollView.

Felix
quelle
4
Beachten Sie, dass das LinearLayout vertikal erweitert wird. Dies muss sich jedoch nicht unbedingt in Ihrem Layout widerspiegeln, es sei denn, es enthält ein Steuerelement, das diesen zusätzlichen Speicherplatz verwendet android:weight.
Paul Lammertsma
Das hilft wirklich. Dank dafür. Aber ohne diesen Code funktioniert manchmal gut. Wissen Sie, warum?
Ashokchakravarthi Nagarajan
funktioniert nicht für <LinearLayout android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: fillViewport = "true" android: background = "# 000" android: orientierung = "vertikal"> </ LinearLayout>
Prasad
3
So krank, dass ich stundenlang saß und suchte, was mit meinem Code nicht stimmt. Wofür dieser Parameter? Wann möchten Sie es jemals falsch setzen?
MyWay
@Prasad machen Sie Ihre Höhe des linearen Layouts, um Eltern
goonerDroid
22

Ich weiß, dass dieser Beitrag sehr alt ist. Für diejenigen, die ihn nicht verwenden möchten, android:fillViewport="true"weil er manchmal den Edittext über der Tastatur nicht aufruft. Verwenden Sie das relative Layout anstelle von LinearLayout, um den Zweck zu lösen.

Hardik4560
quelle
8

Können Sie Ihr Layout-XML bereitstellen? Auf diese Weise können Benutzer das Problem mit minimalem Aufwand neu erstellen.

Möglicherweise müssen Sie einstellen

android:layout_weight="1"

für das Element, das Sie erweitern möchten

snctln
quelle
1
Vielen Dank für Ihre Antwort. Ich habe Ihren Vorschlag ausprobiert, aber er hat nicht funktioniert. Ich habe meine Frage auch aktualisiert, um die Layout-XML einzuschließen.
Felix
3

Die Lösung ist zu verwenden

android:fillViewport="true"

in der Bildlaufansicht und versuchen Sie außerdem zu verwenden

"wrap_content"statt "fill_parent"als"fill_parent"

ist jetzt veraltet.

Khushboo Aggarwal
quelle
2

Ich habe es dynamisch verwendet, um dies zu bekommen. Ich habe ein LinearLayout und habe darin ScrollView als Kind verwendet. Dann nehme ich wieder LinearLayout und füge diesem LinearLayout die gewünschte Ansicht hinzu. Dann füge ich dieses LinearLayout zu ScrollView hinzu und füge diese ScrollView schließlich zu LinearLayout hinzu. Dann können Sie in ur ScrollView scrollen und nichts bleibt sichtbar.

LinearLayout (übergeordnet) - ScrollView (untergeordnetes Element von LinerLayout) - LinearLayout (untergeordnetes Element von ScrollView) - fügen Sie hier Textansicht, Schaltflächen, Drehfeld usw. hinzu, was immer Sie möchten. Fügen Sie dann dieses LinearLyout zu ScrollView hinzu. Bcoz nur ein KIND für ScrollView anwendbar und zuletzt diese ScrollView zu LinearLyout hinzufügen. Wenn der definierte Bereich von der Bildschirmgröße überschritten wird, erhalten Sie einen Scroll in ScrollView.

Braj
quelle
Diese Lösung macht die XML-Datei jedoch komplizierter und benötigt mehr Zeit zum Aufblasen.
Twlkyao
1

In meinem Fall habe ich das nicht gegeben

Ausrichtung von LinearLayout (ScrollView's Child)

Standardmäßig wird also horizontal gearbeitet, aber die Bildlaufansicht wird vertikal gescrollt. Überprüfen Sie daher, ob "android: Orientierung =" vertikal "" auf das untergeordnete Element Ihrer ScrollView eingestellt ist (im Fall von LinearLayout).

Dies war mein Fall hofft, dass es jemandem hilft

.

Vishal Pandey
quelle