wake-up-neo.com

Hinzufügen einer Ansicht am unteren Rand des Layouts in einer Bildlaufansicht

Mein Layout sieht also grundsätzlich so aus:

<ScrollView>
    <RelativeLayout>
        <BunchOfViews/>
        <ImageView Android:layout_alignParentBottom="true"/>
    </RelativeLayout>
</ScrollView>

Ich habe die ScrollView, so dass das gesamte Layout unabhängig von der Höhe des Bildschirms immer sichtbar ist. Das Problem ist, dass ich auf einem sehr hohen Bildschirm immer noch möchte, dass meine ImageView unten ist. Ein Kind eines ScrollView scheint jedoch keinen definierten Boden zu haben. View wird oben im Layout platziert. Wie kann ich dieses Problem ordentlich lösen?

58
pgsandstrom

Ich bin auf die gleiche Ausgabe gestoßen. Ich konnte nie eine sehr angenehme Lösung finden, aber so habe ich es gemacht. Vielleicht hat jemand anderes einen besseren Weg, ich hasse es, Layouts hinzuzufügen, die nichts tun.

Mein Hack bestand darin, ein Dummy-Lineallayout am unteren Rand des Bildlaufs hinzuzufügen, das fill_parent enthält, um den gesamten Raum zu beanspruchen, und den Bildlauf durch den Bildlauf zwingen. Fügen Sie dann dem linearen Layout die gewünschte Komponente hinzu.

Hier ist eines meiner Layouts, das dies tut:

<ScrollView
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:layout_weight="1"
    Android:fillViewport="true" >

    <RelativeLayout
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:layout_marginTop="15px" >

        <!-- bunch of components here -->

        <LinearLayout
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent"
            Android:layout_below="@+id/spinner"
            Android:layout_marginTop="5px"
            Android:gravity="center_horizontal|bottom"
            Android:paddingTop="2px" >

            <Button
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:paddingLeft="20px"
                Android:paddingRight="20px"
                Android:text="Delete" />
        </LinearLayout>
    </RelativeLayout>
</ScrollView>
134
dweebo

Ich hatte das gleiche Problem und fand diese Seite:

http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/

Grundsätzlich setzen Sie den Android:fillViewport der ScrollView auf true, wodurch die untergeordnete Ansicht auf die gleiche Höhe wie die ScrollView selbst erweitert werden kann und den Platz ausfüllt. Sie müssen dann nur noch eines der untergeordneten Steuerelemente 'layout_height' auf fill_parent und layout_weight auf 1 setzen, wodurch dieses Steuerelement "springt", um den leeren Platz zu füllen.

Wenn der Inhalt der ScrollView-Ansicht bereits groß genug ist, um die ScrollView-Ansicht zu füllen, hat Android:fillViewport keine Auswirkungen, sodass die Einstellung nur bei Bedarf aktiviert wird.

Mein endgültiges XML sieht ungefähr so ​​aus:

<ScrollView
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:fillViewport="true">
    <LinearLayout
        Android:orientation="vertical"
        Android:layout_height="wrap_content">
        <LinearLayout
            Android:layout_height="fill_parent"
            Android:layout_weight="1">
            <!-- this expands to fill the empty space if needed -->
        </LinearLayout>

        <!-- this sits at the bottom of the ScrollView,
        getting pushed out of view if the ScrollView's
        content is tall enough -->
        <ImageView
            Android:layout_height="wrap_content"
            Android:src="@drawable/footer_image">
        </ImageView>
    </LinearLayout>
</ScrollView>
64
Joel Malone

es scheint, dass das lineare Layout nicht notwendig ist, alles, was wichtig ist, ist der FillViewPort ..__ 

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignBottomParent="true">

nachdem Sie nun festgelegt haben, dass das relative Layout mindestens der Bildschirmgröße entspricht.

20
Laurent

seine Arbeit für mich perfekt Android: fillViewport = "true"

12
Shohel Rana

Joel Malones Antwort Hinzufügen einer Ansicht am unteren Rand des Layouts in einer Bildlaufansicht führt diesen Trick aus. Meine Lösung ist fast die gleiche, außer dass ich das Space-Widget benutze, um die Resthöhe im übergeordneten Layout auszufüllen. So was:

<ScrollView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent
    Android:fillViewport="true"
    >
    <LinearLayout
        Android:orientation="vertical"
        Android:layout_height="wrap_content"
        >
        <Android.support.v4.widget.Space
            Android:layout_height="match_parent"
            Android:layout_weight="1"
            />
    <ImageView
        Android:layout_height="wrap_content"
        Android:src="@drawable/footer_image"
        />
    </LinearLayout>
</ScrollView>

Beachtung:

  • fill_parent in den anderen Antworten wird für lange Zeit als veraltet eingestuft;
  • Vergleiche mit einer leeren Variable LinearLayout, um den Rest des übergeordneten Layouts auszufüllen. Ich denke, Space ist viel geeigneter (es ist für diese Aufgabe gedacht)
  • Vergessen Sie schließlich nicht das wichtige Attribut am Anfang von ScrollView: Android:fillViewport="true". Sie machen zusammen diesen Trick.
6
Anthonyeef

Aus Ihrer Sicht, dass Sie unten sein wollen, verwenden Sie Android: Gravity = "bottom"

1
hitch45

Von: http://code.google.com/p/k9mail/source/browse/k9mail/trunk/res/layout/account_setup_basics.xml?r=1314

Das sollte Ihnen helfen:

<RelativeLayout
        Android:layout_marginTop="-45dip" 
        Android:padding="0dip"
        Android:layout_alignParentBottom="true"
        Android:gravity="bottom|right" 
        Android:background="@Android:drawable/bottom_bar"
        Android:layout_height="fill_parent"
        Android:layout_width="fill_parent">
        <Button
            Android:id="@+id/manual_setup"
            Android:text="@string/account_setup_basics_manual_setup_action"
            Android:minWidth="@dimen/button_minWidth"
            Android:layout_height="wrap_content"
            Android:layout_width="wrap_content"
            Android:layout_marginBottom="-4dip" 
            Android:layout_alignParentLeft="true"
            Android:layout_centerVertical="false" 
            />
        <Button
            Android:id="@+id/next"
            Android:text="@string/next_action"
            Android:minWidth="@dimen/button_minWidth"
            Android:layout_height="wrap_content"
            Android:layout_width="wrap_content"
            Android:drawableRight="@drawable/button_indicator_next"
            Android:layout_marginBottom="-4dip" 
            Android:layout_alignParentRight="true"
            Android:layout_centerVertical="false" 
            />
    </RelativeLayout>
0
Pentium10
ScrollView view = new ScrollView( this );
ScrollView.LayoutParams lps = new FrameLayout.LayoutParams( FILL_PARENT, FILL_PARENT, Gravity.CENTER );
LinearLayout layout = new LinearLayout( this );
// what ever you want in the Layout 
view.addView( layout, lps );
0
Shibly