scrollviewの重力はありません。スクロールビュー内のコンテンツを中央にする方法


104

scrollView内のコンテンツを中央に配置します。

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

注:android:gravity scrollvew には属性はありません。

任意のゾル:-

回答:


175

私は同じ問題を抱えていて、ついにそれを理解しました。これは、垂直向けScrollViewです。

あなたのScrollView内側を入れて、RelativeLayoutそれをの中央に置きますRelativeLayout。これが機能するためにScrollViewは、

android:layout_height="wrap_content"

最終的なコードは次のようになります。

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

29
これは受け入れられた答えよりも私にとってはうまくいくようです。ありがとうございました!
Patrick Boos 2013年

理想的には、レイアウトの階層がある場合、androidはこの問題を調べる必要があります。また、両方のスクロール(水平/垂直)のオプションを提供しなければならない1つのscrollview.BTWのおかげ@hadi
mayank_droid

2
これはちょっとしたハックなので、これはうまく機能しますが、間違っている感じます。
DariusL 2015

3
ちょっと動作しますが、キーボードが表示されているときにスクロールしません。マニフェストを追加しようとしましたandroid:windowSoftInputMode="stateHidden|adjustResize"が、スクロールしないでください。助けてください
Helio Soares Junior

3
RelativeLayoutルートビューとして重いものを使用する必要はありません。それは可能FrameLayoutandroid:layout_gravity="center_vertical"のためにScrollView
GrafOrlov

148

これはどう?

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

2
うん!どのようにそのことについて!これは私にとっては素晴らしく機能したので、どうもありがとうございました。
RileyE 2013年

驚くばかり!これも私を救った!ありがとう:)
marienke

101
これには1つの問題があります。ScrollViewのコンテンツがscrollviewよりも大きい場合でも、それは中央に表示され、コンテンツは上部で切り取られます(ただし、理由はまだわかりません)。スクロールできません。
Patrick Boos

7
PatrickBoosは正しいです。これは機能していないようです。以下のhadiの回答を使用して、RelativeLayoutのスクロールビューを垂直方向の中央に配置します。
メイソン・リー

はい、この方法にはバグがあり、コンテンツがscrollViewよりも大きく、コンテンツが上にスクロールされません。彼のトップは負の数です、奇妙です:(
Kross

98

よりエレガントな解決策は、ScrollViewandroid:fillViewportプロパティを使用することだと思います。A ScrollViewは、コンテンツビューの処理方法が少し異なります(1つのみを持つことができます)。これにmatch_parentfill_parent)を設定しても、ScrollViewコンテンツビューにそれほど多くのスペースが与えられない代わりに、デフォルトの動作はScrollView、そのビューに何を指定するかに関係なく、コンテンツ。何android:fillViewport行うことは教えてくれているScrollView(ビューポートを埋めるために、その内容を伸ばすことhttp://developer.android.com/reference/android/widget/ScrollView.html#attr_android:fillViewport)。したがって、この場合、LinearLayoutビューポートに一致するように引き伸ばされ、高さがビューポートの後ろになると、スクロール可能になり、まさに望みどおりの結果になります。

受け入れられた回答は、コンテンツがそれを超えて拡張されると正しく機能しません。ScrollViewこれは、コンテンツビューが最初に中央に配置され、ビューの一部が切り取られるためです。またScrollView、別のレイアウトで中央に配置されても機能しますが、正しくないだけです。私はそれがlintエラーにもなると思います(役に立たない親またはそれらの線に沿った何か)。

次のようなものを試してください:

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

ただ、それが今ここにセンタリングされている理由が原因であることを覚えているandroid:gravityLinearLayoutため、ScrollViewストレッチしますLinearLayoutので、心の中であなたがレイアウトに追加するものに応じていることを続けます。

ScrollViewセンタリングについてでfillViewportはなく、についての良い読み物はhttp://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/です


11
これは最も適切な実装のように見え、追加のビューは必要ありません。
DariusL 2015

1
素敵な解決策は、私にとって最もきれいなもののようです。ありがとう
Benjamin Scharbau

2
受け入れられた答えよりもうまく機能し、あなたは私に多くの時間を節約しました!本当によくできたブライアン・エティエ!
Mattia Ruggiero 2016

これで説明されているすべての理由から、これは正しい解決策です。上記の解決策を試して、スクロールビューが画面よりも広い場合、実際にはスクロールビューの一部に到達できず、スクロールビューにスクロールできません。 。これは適切なソリューションとして受け入れられるべきです
Speckpgh

1
典型的なStackoverflow ..正しい解決策は、多くの場合、途中のどこかにあります。
Teovald 2018

14

ScrollViewでこの属性を使用する

android:fillViewport="true"

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

上の例のRelativelayoutと同じように、ScrollViewで単一の子を必ず使用してください。


@JoshuaKingは7年前の質問で、最近9か月前にこの回答を投稿した可能性があります。
Abhishek Garg

ハ!ああ..真実。😆まあ、それは完璧に機能しました!ほんとありがと!
ジョシュアキング

1
これは間違いなく受け入れられる答えになるはずです!コンテンツがコンテナーのサイズよりも小さい場合は、完全に機能し、ScrollViewを中央に配置します。ScrollViewとHorizo​​ntalScrollViewの両方で機能します。どうもありがとうございます!💝💖
レイリー

これは、スクロールビュー内でコンテンツを引き伸ばすという意図しない影響をもたらす可能性があります
martinseal1987

@ martinseal1987効果は子コンポーネント、レイアウトデザインの作成方法に依存すると思いますが、これが機能しない場合は、デザインと作業のニーズに応じて独自のカスタムスクロールビューコンポーネントを作成できます。また、希望する結果のスクリーンショットを私と共有してください。そうすれば、より優れた実用的なソリューションを調査して提供できます。助ける準備ができています。乾杯。
Abhishek Garg

9

@Patrick_Bossの場合-アプリケーションでコンテンツが切り取られなくなったのは、LinearLayoutの重力とlayout_gravityをcenter_horizo​​ntalに変更したためです。

それは私のために働いた...それがあなたのために働くかどうかわからない。

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

1
これにより、トップオフの問題を解決できます。しかし、このソリューションにはまだ1つの問題があります。ScrollViewコンテンツが垂直方向の中央に配置されていませんでした。しかし、これはScrollViewの次の値を設定することで修正できます。android:layout_height = "wrap_content" android:layout_gravity = "center_vertical"
Patrick Boos 14

これを他のレイアウト内で機能させるには、上部のScrollViewをFrameLayout内に埋め込む必要があることがわかりました。
Theo

1

考慮すべき1つのことは、何を設定しないかです。子コントロール、特にEditTextコントロールにプロパティセットがないことを確認してくださいRequestFocus

これは、レイアウトで最後に解釈されたプロパティの1つである可能性があり、その親layoutまたはScrollView)の重力設定オーバーライドします


0

ConstraintLayout内のスクロールビューを使用します。私のために働いています

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

スクロールビューの高さはwrap_contentにする必要があります

<ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.