scrollview에 중력이 없습니다. 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내부 a를 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 년

이상적으로 안드로이드는 레이아웃 계층이있을 때이 문제를 조사해야합니다. 또한 모두 스크롤 (수평 / 수직) 옵션을 제공해야 하나 개 scrollview.BTW 덕분 @hadi
mayank_droid

2
이것은 약간의 해킹이므로 잘 작동하지만 잘못된 느낌 입니다.
DariusL

3
키보드가 표시되지 스크롤 할 때 헤이의 작업은, 그러나, 나는 매니페스트에 추가하려 않는 android:windowSoftInputMode="stateHidden|adjustResize"날하시기 바랍니다하지만, 그나마 스크롤, 도움
힐리오 소아레스 주니어

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

대박! 이것은 저도 구했습니다! 감사합니다 :)
marienke 2013

101
이것에는 한 가지 문제가 있습니다. ScrollView의 콘텐츠가 scrollview보다 크면 여전히 가운데에 있고 상단에서 콘텐츠가 잘립니다 (아직 이유는 모르겠 음). 거기에서 스크롤 할 수 없다는 뜻입니다.
Patrick Boos

7
PatrickBoos가 옳습니다. 이것은 작동하지 않는 것 같습니다. 아래의 hadi의 대답을 사용하여 RelativeLayout에서 scrollview를 세로로 가운데에 놓습니다.
Mason Lee

그의 최고는 음수 :(, 이상한 예,이 방법은있는 ScrollView보다 내용이 상단으로 스크롤되지 않습니다 컨텐츠 더 큰 버그를 가지고있다
KROSS

98

더 우아한 해결책은 ScrollViewandroid:fillViewport속성 을 사용하는 것 입니다. A ScrollView는 콘텐츠 뷰를 처리하는 방식이 약간 다릅니다 (하나만 가질 수 있음). match_parent( fill_parent)를로 설정하더라도 ScrollView콘텐츠 뷰에 ​​그다지 간격을주지 않습니다. 대신 기본 동작 ScrollView은를 래핑하는 것입니다. 해당보기에 대해 지정한 내용에 관계없이 콘텐츠. 무엇 android:fillViewport않는 것은 말씀입니다 ScrollView(뷰포트를 채우기 위해 그 내용을 스트레칭 http://developer.android.com/reference/android/widget/ScrollView.html#attr_android:fillViewport ). 따라서이 경우 LinearLayout에는 뷰포트와 일치하도록 늘어나고 높이가 뷰포트 뒤에 있으면 원하는대로 스크롤 할 수 있습니다!

수락 된 답변은 콘텐츠가을 넘어 확장 될 때 제대로 작동하지 않습니다. ScrollView왜냐하면 콘텐츠보기를 먼저 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: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

1
좋은 해결책은 나에게 가장 깨끗한 것 같습니다. 이 덕분에
벤자민 Scharbau

2
받아 들인 대답보다 더 잘 작동하며 많은 시간을 절약했습니다! 정말 잘 했어요 Brian Ethier!
Mattia Ruggiero

설명 된 모든 이유 때문에 이것이 올바른 해결책입니다. 위의 해결책을 시도하고 스크롤보기가 화면보다 넓다면 실제로 스크롤보기의 일부에 접근 할 수없고 스크롤 할 수 없습니다. . 이것은 적절한 해결책으로 받아 들여 져야합니다
Speckpgh

1
전형적인 Stackoverflow .. 올바른 해결책은 종종 중간 어딘가에 있습니다.
Teovald

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에서 Single Child를 사용해야합니다.


@JoshuaKing은 7 살짜리 질문이고 최근 9 개월 전에이 답변을 게시했기 때문에 수 있습니다.
Abhishek Garg

하아! 오 .. 진실. 😆 음, 완벽하게 작동했습니다! 감사합니다!
Joshua King

1
이것은 확실히 받아 들여진 대답이어야합니다! 콘텐츠가 컨테이너 크기보다 작 으면 완벽하게 작동하고 ScrollView를 중앙에 배치합니다. ScrollView 및 HorizontalScrollView 모두에서 작동합니다. 정말 고맙습니다! 💝💖
Ray Li

이 스크롤 뷰 내에서 콘텐츠를 스트레칭의 의도하지 않은 효과가있을 수 있습니다
martinseal1987

@ martinseal1987 효과는 자식 구성 요소에 따라 다르며 레이아웃 디자인을 만드는 방법에 따라 다르지만 이것이 작동하지 않으면 디자인 및 작업 요구 사항에 따라 사용자 정의 스크롤보기 구성 요소를 만들 수 있습니다. 또한 원하는 결과 스크린 샷을 저와 공유해 주시면 더 나은 솔루션을 제공 할 수 있습니다. 도울 준비가되어 있습니다. 건배.
Abhishek Garg

9

@Patrick_Boss의 경우-내 응용 프로그램에서 콘텐츠가 잘리는 것을 막은 것은 LinearLayout의 중력과 layout_gravity를 center_horizontal로 변경하는 것입니다.

그것은 나를 위해 일했습니다 ...하지만 그것이 당신에게 효과가 있는지 확실하지 않습니다.

@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
이것은 톱 오프 문제를 해결합니다. 그러나이 솔루션에는 여전히 한 가지 문제가 있습니다. ScrollView 콘텐츠가 세로로 가운데에 있지 않습니다. layout_gravity = "center_vertical"안드로이드 : layout_height = "wrap_content"안드로이드하지만이있는 ScrollView의 다음 값을 설정하여 해결할 수 있습니다
패트릭 야유를

이것이 다른 레이아웃 내에서 작동하려면 상단 ScrollView가 FrameLayout 내에 포함되어야 함을 발견했습니다.
Theo

1

고려해야 할 한 가지는 설정하지 않는 것입니다 . 특정 자녀, 특히 컨트롤, 확인 EditText, 컨트롤을 하지 않는RequestFocus속성이 설정.

이것은 레이아웃에서 마지막으로 해석 된 속성 중 하나 일 수 있으며 부모 ( 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.