390 Stimmen

LinearLayout erweitert sich nicht innerhalb einer ScrollView

Tengo un LinearLayout innerhalb einer ScrollView Das hat android:layout_height="fill_parent" aber sie dehnt sich nicht auf die gesamte Höhe des 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 die LinearLayout erstreckt sich nicht über die gesamte Höhe des ScrollView weil in Eclipse in Android Layout Editor wenn ich die Option ScrollView (im Gliederungsfenster) wird sie mit einem roten Rahmen hervorgehoben, der den Bildschirm bis zum unteren Rand ausfüllt, aber wenn ich die Option LinearLayout Die Hervorhebung reicht nicht bis zum unteren Rand des Bildschirms. Wie kann ich es dazu bringen, dies zu tun?

Der Effekt, den ich erreichen möchte, besteht darin, dass ich einen Text und eine Schaltfläche darunter (innerhalb der LinearLayout in Level 4 gibt es nur einen Knopf). Der Text kann groß genug sein, um eine Bildlaufleiste zu benötigen. In diesem Fall möchte ich, dass der Benutzer nach unten scrollen muss, um die Schaltfläche zu sehen. Falls der Text nicht groß genug für eine Bildlaufleiste ist, möchte ich, dass die LinearLayout mit der Schaltfläche, die am unteren Rand des Bildschirms haften bleibt.

Zuerst dachte ich, ich solle nicht das komplette XML posten, weil es normalerweise ein Abtörner ist, einen großen Brocken Code in einer Frage zu sehen. Es scheint jedoch notwendig zu sein, also hier ist 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 mich auf android:layout_gravity="bottom" zur Problematik LinearLayout Dadurch bleibt die Schaltfläche auf jeden Fall am unteren Rand des Bildschirms. Aber dadurch bleibt auch der Text am unteren Rand des Bildschirms hängen, was nicht genau das ist, was ich wollte.

Aktualisierung: Streichen Sie das, android:layout_gravity="bottom" macht die ScrollView nicht in der Lage, na ja, zu blättern. Andere Ideen?

1voto

Vishal Pandey Punkte 696

In meinem Fall habe ich nicht die

Ausrichtung von LinearLayout(ScrollView's Child)

Also standardmäßig nimmt es horizontal, aber scrollview scrollt vertikal, so überprüfen Sie bitte, ob 'Android:orientation="vertical"' auf Ihre ScrollView's Child (Im Falle von LinearLayout) gesetzt ist.

Dies war mein Fall und ich hoffe, es hilft jemandem

.

1voto

chrisi1698 Punkte 21

Alle Antworten hier haben bei mir nicht (vollständig) funktioniert. Nur um zu rekapitulieren, was wir für eine vollständige Antwort tun wollen: Wir haben eine ScrollView, die den Viewport des Geräts ausfüllen soll, also setzen wir fillViewport auf "true" in der Layout-Xml. Dann haben wir innerhalb der ScrollView ein LinearLayout, das alles andere enthält, und dieses LinearLayout sollte mindestens so hoch sein wie seine übergeordnete ScrollView, so dass Sachen, die am unteren Rand (des LinearLayouts) sein sollen, tatsächlich, wie wir es wollen, am unteren Rand des Bildschirms (oder am unteren Rand der ScrollView, falls der Inhalt des LinearLayouts mehr Höhe als der Bildschirm hat.

Beispiel für ein activity_main.xml-Layout:

<ScrollView
    android:id="@+id/layout_scrollwrapper"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fillViewport="true"
    android:layout_alignParentTop="true"
    android:layout_above="@+id/layout_footer"
    >
<LinearLayout
    android:id="@+id/layout_scrollwrapper_inner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
...content which might or might not be higher than screen height...
</LinearLayout>
</ScrollView>

Dann, in der Aktivität onCreate, "warten" wir, dass das Layouting des LinearLayouts fertig ist (was bedeutet, dass das Layouting des übergeordneten Layouts auch schon fertig ist) und setzen dann seine Mindesthöhe auf die Höhe des ScrollViews. So funktioniert es auch, wenn der ScrollView nicht die gesamte Bildschirmhöhe einnimmt. Ob Sie .post(...) auf der ScrollView oder das innere LinearLayout sollte nicht so viel Unterschied machen, wenn eine nicht für Sie arbeiten, versuchen Sie die andere.

public class MainActivity extends AppCompatActivity {

@Override // Activity
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    LinearLayout linearLayoutWrapper = findViewById(R.id.layout_scrollwrapper_inner);

    ...

    linearLayoutWrapper.post(() -> {
        linearLayoutWrapper.setMinimumHeight(((ScrollView)linearLayoutWrapper.getParent()).getHeight());
    });
}
...
}

Leider ist es keine xml-only-Lösung, aber es funktioniert gut genug für mich, und ich hoffe, es hilft auch anderen gequälten Android-Entwicklern, die das Internet nach einer Lösung für dieses Problem durchsuchen ;D

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X