Android

[Android-java] ScrollView 사용법 및 에러 해결

기시미 2021. 8. 26. 15:25

개발환경 : Windows

사용 라이브러리 : DataBinding (데이터 결합 라이브러리)

 

안녕하세요

개발 중에 ScrollView가 먹통이라서 삽질을 했네요 ㅠㅠ

삽질 끝에 먹통을 해결했습니다 !!

어이없는 실수였지만 다른 분들도 혹시 이런 상황이 생길 수도 있으니 참고용으로 올렸습니다!!


ScrollView란?

데이터가 많아져 UI가 꽉 찼을 때 위아래로 이동할 수 있는 뷰입니다.

 

데이터가 많아 아래까지 내려가있는 상황인데 이런 경우 ScrollView를 사용하시면 됩니다.

예시

ScrollView 안에는 한 개의 레이아웃만 사용할 수 있으니 레이아웃안에 레이아웃을 생성해주셔야 합니다.

저는 툴바 아래에 사용하기 위해 match_parent와 wrap_parent 대신 0dp를 사용해 크기를 맞춰주었습니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <include
        android:id="@+id/toolbar_title"
        layout="@layout/toolbar_home"
        app:title="@{title}"/>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar_title">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="32"
                    android:textSize="32dp"/>

            </LinearLayout>
        </LinearLayout>
    </ScrollView>

    <RelativeLayout
        android:id="@+id/start_button"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:background="@drawable/button_round"
        android:layout_marginEnd="12dp"
        android:layout_marginStart="12dp"
        android:layout_marginBottom="8dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="회원 등록"
            android:textSize="21dp"
            android:textColor="@color/blue_130"
            android:fontFamily="@font/gmarketsansmedium"
            android:includeFontPadding="false"/>

    </RelativeLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

먹통 에러 발견!

제가 진행한 프로젝트에서는 아래와 같이 xml 디자인 뷰로 보았을 때는 크기가 넘치지 않았습니다.

하지만 빌드 결과 데이터가 넘쳤고 ScrollView가 작동되지 않았습니다.

제 생각으로는 작동하지 않은 이유가 데이터가 넘치지 않았다고 판단되었고 ConstraintLayout안에 ScrollView를 넣어놨기 때문에 Bottom을 연결해주지 않아 ScrollView가 작동되지 않은 것 같습니다.

 

아래는 ScrollView가 작동하지 않은 코드입니다.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <import type="android.view.View.OnClickListener"/>
        <variable name="onClick" type="android.view.View.OnClickListener" />
        <variable name="title" type="String" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include
            android:id="@+id/toolbar_title"
            layout="@layout/toolbar_home"
            app:title="@{title}"/>

        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:fillViewport="true"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/toolbar_title">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="15dp"
                    android:layout_marginTop="30dp"
                    android:orientation="horizontal">

                    <TextView
                        android:id="@+id/userName"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:fontFamily="@font/gmarketsansbold"
                        android:includeFontPadding="false"
                        android:text="이름"
                        android:textColor="@color/blue_130"
                        android:textSize="15dp" />

                    <EditText
                        android:id="@+id/insert_name"
                        android:layout_width="match_parent"
                        android:layout_height="30dp"
                        android:layout_marginStart="25dp"
                        android:layout_marginEnd="50dp"
                        android:background="@drawable/line_blue"
                        android:fontFamily="@font/gmarketsanslight"
                        android:gravity="center|start"
                        android:imeOptions="actionDone"
                        android:includeFontPadding="false"
                        android:inputType="textNoSuggestions|textVisiblePassword"
                        android:maxLines="1"
                        android:paddingStart="15px"
                        android:textColor="@android:color/background_dark"
                        android:textColorHint="@color/blue_007"
                        android:textSize="15dp" />



                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="15dp"
                    android:layout_marginTop="30dp"
                    android:orientation="horizontal">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:fontFamily="@font/gmarketsansbold"
                        android:includeFontPadding="false"
                        android:text="생년월일"
                        android:textColor="@color/blue_130"
                        android:textSize="15dp" />

                    <DatePicker
                        android:id="@+id/insert_birth"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="25dp"
                        android:calendarViewShown="false"
                        android:datePickerMode="spinner" />



                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="15dp"
                    android:layout_marginTop="30dp"
                    android:orientation="horizontal">


                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:fontFamily="@font/gmarketsansbold"
                        android:includeFontPadding="false"
                        android:text="전화번호"
                        android:textColor="@color/blue_130"
                        android:textSize="15dp" />

                    <EditText
                        android:id="@+id/insert_phoneNum"
                        android:layout_width="match_parent"
                        android:layout_height="30dp"
                        android:layout_marginStart="25dp"
                        android:layout_marginEnd="50dp"
                        android:background="@drawable/line_blue"
                        android:fontFamily="@font/gmarketsanslight"
                        android:gravity="center|start"
                        android:imeOptions="actionDone"
                        android:includeFontPadding="false"
                        android:inputType="textNoSuggestions|textVisiblePassword"
                        android:maxLines="1"
                        android:paddingStart="15px"
                        android:textColor="@android:color/background_dark"
                        android:textColorHint="@color/blue_007"
                        android:textSize="15dp" />

                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="15dp"
                    android:layout_marginTop="30dp"
                    android:orientation="horizontal">



                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:fontFamily="@font/gmarketsansbold"
                        android:includeFontPadding="false"
                        android:text="비밀번호"
                        android:textColor="@color/blue_130"
                        android:textSize="15dp" />

                    <EditText
                        android:id="@+id/insert_password"
                        android:layout_width="match_parent"
                        android:layout_height="30dp"
                        android:layout_marginStart="25dp"
                        android:layout_marginEnd="50dp"
                        android:background="@drawable/line_blue"
                        android:fontFamily="@font/gmarketsanslight"
                        android:gravity="center|start"
                        android:imeOptions="actionDone"
                        android:includeFontPadding="false"
                        android:inputType="textNoSuggestions|textVisiblePassword"
                        android:maxLines="1"
                        android:paddingStart="15px"
                        android:textColor="@android:color/background_dark"
                        android:textColorHint="@color/blue_007"
                        android:textSize="15dp" />

                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="15dp"
                    android:layout_marginTop="30dp"
                    android:orientation="horizontal">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:fontFamily="@font/gmarketsansbold"
                        android:includeFontPadding="false"
                        android:text="비밀번호확인"
                        android:textColor="@color/blue_130"
                        android:textSize="15dp" />

                    <EditText
                        android:id="@+id/insert_checkPw"
                        android:layout_width="match_parent"
                        android:layout_height="30dp"
                        android:layout_marginStart="25dp"
                        android:layout_marginEnd="50dp"
                        android:background="@drawable/line_blue"
                        android:fontFamily="@font/gmarketsanslight"
                        android:gravity="center|start"
                        android:imeOptions="actionDone"
                        android:includeFontPadding="false"
                        android:inputType="textNoSuggestions|textVisiblePassword"
                        android:maxLines="1"
                        android:paddingStart="15px"
                        android:textColor="@android:color/background_dark"
                        android:textColorHint="@color/blue_007"
                        android:textSize="15dp" />

                </LinearLayout>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="15dp"
                    android:layout_marginTop="30dp"
                    android:orientation="horizontal">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:fontFamily="@font/gmarketsansbold"
                        android:includeFontPadding="false"
                        android:text="이메일"
                        android:textColor="@color/blue_130"
                        android:textSize="15dp" />


                    <EditText
                        android:id="@+id/insert_email"
                        android:layout_width="match_parent"
                        android:layout_height="30dp"
                        android:layout_marginStart="25dp"
                        android:layout_marginEnd="50dp"
                        android:background="@drawable/line_blue"
                        android:fontFamily="@font/gmarketsanslight"
                        android:gravity="center|start"
                        android:imeOptions="actionDone"
                        android:includeFontPadding="false"
                        android:inputType="textNoSuggestions|textVisiblePassword"
                        android:maxLines="1"
                        android:paddingStart="15px"
                        android:textColor="@android:color/background_dark"
                        android:textColorHint="@color/blue_007"
                        android:textSize="15dp" />


                </LinearLayout>

            </LinearLayout>

        </ScrollView>

        <RelativeLayout
            android:id="@+id/start_button"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            android:background="@drawable/button_round"
            android:layout_marginEnd="12dp"
            android:layout_marginStart="12dp"
            android:layout_marginBottom="8dp"
            android:onClick="onClick">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:text="회원 등록"
                android:textSize="21dp"
                android:textColor="@color/blue_130"
                android:fontFamily="@font/gmarketsansmedium"
                android:includeFontPadding="false"/>

        </RelativeLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

해결방법

ScrollView 옵션에 app:layout_constraintBottom_toTopOf="@+id/start_button"을 추가해주었더니 해결되었습니다!

xml Design뷰에서 볼 수 있듯이 변화를 볼 수 있었습니다.


빌드 결과