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?
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>
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>
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.
seine Arbeit für mich perfekt Android: fillViewport = "true"
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;LinearLayout
, um den Rest des übergeordneten Layouts auszufüllen. Ich denke, Space
ist viel geeigneter (es ist für diese Aufgabe gedacht)ScrollView
: Android:fillViewport="true"
. Sie machen zusammen diesen Trick.Aus Ihrer Sicht, dass Sie unten sein wollen, verwenden Sie Android: Gravity = "bottom"
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>
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 );