Keine Schwerkraft für die Bildlaufansicht. So erstellen Sie Inhalte in der Bildlaufansicht als Mitte

104

Ich möchte den Inhalt in der scrollView als Mitte.

<ScrollView
    android:id="@+id/scroller"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay"
    android:layout_gravity="center" >

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="check" 
        android:gravity="center_vertical|center_horizontal"/>

</ScrollView>

Hinweis: Es gibt kein android:gravityAttribut für scrollvew.

jedes Sol: -

Padma Kumar
quelle

Antworten:

175

Ich hatte das gleiche Problem und fand es schließlich heraus. Dies ist für eine Vertikale ScrollView.

Legen Sie Ihre ScrollView Inneres ein RelativeLayoutund zentrieren Sie es in der RelativeLayout. Damit dies funktioniert, ScrollViewsollten Sie haben

android:layout_height="wrap_content"

So sollte der endgültige Code aussehen:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:layout_centerVertical="true" >

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b1"/>
            <Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b2"/>
            <Button
                android:id="@+id/button3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b3"/>
        </LinearLayout>

    </ScrollView>

</RelativeLayout>
Hadi
quelle
29
Dieser scheint für mich besser zu funktionieren als die akzeptierte Antwort. Danke dir!
Patrick Boos
Idealerweise sollte sich Android mit diesen Problemen befassen, wenn es eine Hierarchie von Layouts gibt. Außerdem sollten beide Bildlaufoptionen (horizontal / vertikal) in einer Bildlaufansicht bereitgestellt werden. Übrigens, danke @hadi
mayank_droid
2
Dies ist ein bisschen wie ein Hack. Obwohl dies gut funktioniert, fühlt es sich falsch an.
DariusL
3
Hey, es funktioniert, aber es wird nicht gescrollt, wenn die Tastatur sichtbar ist. Ich habe versucht, im Manifest hinzuzufügen, android:windowSoftInputMode="stateHidden|adjustResize"aber nicht gescrollt, hilf mir bitte
Helio Soares Junior
3
Keine Notwendigkeit, schwer RelativeLayoutals Root-Ansicht zu verwenden. Es kann sein FrameLayoutund android:layout_gravity="center_vertical"fürScrollView
GrafOrlov
148

Wie wäre es damit?

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay" >


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:layout_gravity="center"
        android:gravity="center">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check" 
            android:gravity="center_vertical|center_horizontal"/>
    </LinearLayout>

</ScrollView>
Geist
quelle
2
Ja! Wie wär es damit! Das hat fantastisch für mich funktioniert, also vielen Dank, gütiger Herr.
RileyE
Genial! Das hat mich auch gerettet! Danke :)
Marienke
101
Hier gibt es ein Problem. Wenn Ihr Inhalt in der Bildlaufansicht größer als die Bildlaufansicht ist, wird er weiterhin zentriert und der Inhalt oben abgeschnitten (noch nicht sicher, warum). Das heißt, Sie können dort nicht scrollen.
Patrick Boos
7
PatrickBoos hat recht; das scheint nicht zu funktionieren. Verwenden Sie die Antwort von hadi unten und zentrieren Sie die Bildlaufansicht vertikal in einem RelativeLayout.
Mason Lee
Ja, auf diese Weise haben Fehler, Inhalt größer als scrollView, der Inhalt wird nicht nach oben scrollen, sein Top ist negative Zahl, seltsam :(
Kross
98

Ich denke , eine elegantere Lösung wäre es , die zu verwenden ScrollViewist android:fillViewportEigentum. A unterscheidet ScrollViewsich ein wenig darin, wie es die Inhaltsansicht behandelt (kann nur eine haben), selbst wenn Sie match_parent( fill_parent) auf setzen ScrollView, gibt es der Inhaltsansicht nicht so viel Abstand, stattdessen ist das Standardverhalten das ScrollViewUmschließen der Inhalt, unabhängig davon, was Sie für diese Ansicht angeben. Sie android:fillViewportmüssen den ScrollViewInhalt erweitern, um das Ansichtsfenster zu füllen ( http://developer.android.com/reference/android/widget/ScrollView.html#attr_android:fillViewport ). In diesem Fall LinearLayoutwürden Sie also gedehnt, um mit dem Ansichtsfenster übereinzustimmen. Wenn die Höhe hinter dem Ansichtsfenster liegt, kann es gescrollt werden, was genau das ist, was Sie wollen!

Die akzeptierte Antwort funktioniert nicht richtig, wenn der Inhalt über das hinausgeht, ScrollViewda die Inhaltsansicht immer noch zuerst zentriert wird, wodurch ein Teil der Ansicht abgeschnitten wird, und dieScrollView zentriert wird, in einem anderen Layout zentrierte Funktion funktioniert, fühlt sich aber einfach nicht richtig an Ich denke, es wird auch zu einem Flusenfehler führen (nutzloser Elternteil oder etwas in dieser Richtung).

Versuchen Sie so etwas:

<ScrollView
    android:id="@+id/scroller"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay"
    android:fillViewport="true">

    <LinearLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center">

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check" />

    </LinearLayout>

</ScrollView>

Denken Sie daran , dass der Grund , warum es hier wird jetzt wegen der zentriert ist android:gravityauf die LinearLayoutseit dem ScrollViewdehnen dieLinearLayout so halten , dass, je nachdem , was Sie mit dem Layout hinzuzufügen.

Eine weitere gute lesen Sie weiter , ScrollViewobwohl nicht über Zentrierung aber etwa fillViewportist http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/

Brian Ethier
quelle
11
Dies scheint die korrekteste Implementierung zu sein, es sind keine zusätzlichen Ansichten erforderlich.
DariusL
1
Schöne Lösung, scheint die sauberste für mich zu sein. Danke dafür
Benjamin Scharbau
2
Funktioniert besser als die akzeptierte Antwort, du hast mir viel Zeit gespart! Wirklich gut gemacht Brian Ethier!
Mattia Ruggiero
Dies ist aus dem darin beschriebenen Grund die richtige Lösung. Wenn Sie die oben beschriebene Lösung ausprobieren und Ihre Bildlaufansicht breiter als Ihr Bildschirm ist, ist ein Teil Ihrer Bildlaufansicht in der Tat nicht erreichbar und kann nicht dorthin scrollen. Dies sollte als die richtige Lösung akzeptiert werden
Speckpgh
1
Typischer Stackoverflow. Die richtige Lösung befindet sich oft irgendwo in der Mitte.
Teovald
13

Verwenden Sie dieses Attribut in ScrollView

android:fillViewport="true"

Beispiel

 <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarStyle="outsideOverlay"
android:fillViewport="true"
>
   <RelativeLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content">

         <!--Your Code goes here-->

   </RelativeLayout>

</ScrollView>

Stellen Sie sicher, dass Sie in ScrollView Single Child verwenden, genau wie im obigen Beispiel Relativelayout.

Abhishek Garg
quelle
@JoshuaKing kann, weil es eine 7 Jahre alte Frage ist und ich diese Antwort vor 9 Monaten gepostet habe.
Abhishek Garg
Ha! Oh ... Wahrheit. »Nun, es hat perfekt funktioniert! So danke!
Joshua King
1
Dies sollte definitiv die akzeptierte Antwort sein! Es funktioniert perfekt und zentriert eine ScrollView, wenn der Inhalt kleiner als die Containergröße ist. Funktioniert sowohl für ScrollView als auch für HorizontalScrollView. Ich danke dir sehr! 💝💖
Ray Li
Dies kann den unbeabsichtigten Effekt haben, dass Sie Ihren Inhalt in der
Bildlaufansicht dehnen
@ martinseal1987 Ich denke, der Effekt hängt von Ihrer untergeordneten Komponente ab, von der Art und Weise, wie Sie Ihr Layout entwerfen. Wenn dies für Sie jedoch nicht funktioniert, können Sie Ihre eigene benutzerdefinierte Scroll-Ansichtskomponente gemäß Ihren Design- und Arbeitsanforderungen erstellen. und bitte teilen Sie mir auch den gewünschten Ergebnis-Screenshot mit, damit ich Ihre bessere und funktionierende Lösung prüfen und bereitstellen kann. bereit zu helfen. Prost.
Abhishek Garg
9

Für @Patrick_Boss - was das Ausschneiden des Inhalts in meiner Anwendung verhinderte, war die Änderung der Schwerkraft und der Layout-Schwerkraft in center_horizontal für das LinearLayout.

Es hat bei mir funktioniert ... aber ich bin mir nicht sicher, ob es bei Ihnen funktionieren wird.

Änderung der Antwort von @ Ghost -

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay" >


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:layout_gravity="center_horizontal"
        android:gravity="center_horizontal">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check" 
            android:gravity="center_vertical|center_horizontal"/>
    </LinearLayout>

</ScrollView>
ProgDevCode
quelle
1
Dies löst das Problem des Abschneidens des Verdecks. Bei dieser Lösung gibt es jedoch noch ein Problem. Der ScrollView-Inhalt wurde nicht vertikal zentriert. Dies kann jedoch behoben werden, indem die folgenden Werte von ScrollView festgelegt werden: android: layout_height = "wrap_content" android: layout_gravity = "center_vertical"
Patrick Boos
Ich habe festgestellt, dass die oberste ScrollView in ein FrameLayout eingebettet sein muss, damit dies in anderen Layouts funktioniert.
Theo
1

Eine zu berücksichtigende Sache ist, was NICHT eingestellt werden soll . Stellen Sie sicher, dass Ihre untergeordneten Steuerelemente, insbesondere EditTextSteuerelemente, nicht über die Steuerelemente verfügenRequestFocus Eigenschaftssatz.

Dies ist möglicherweise eine der zuletzt interpretierten Eigenschaften des Layouts und überschreibt die Schwerkrafteinstellungen der übergeordneten Elemente ( layoutoder ScrollView).

Epsilon3
quelle
0

Verwenden der Bildlaufansicht im ConstraintLayout. Es ist für mich gearbeitet

<androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white">

            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" />
            </ScrollView>
        </androidx.constraintlayout.widget.ConstraintLayout>

Die Höhe der Bildlaufansicht sollte wrap_content sein

<ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
Hariharan Kanakaraja
quelle