개발환경 : 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뷰에서 볼 수 있듯이 변화를 볼 수 있었습니다.
빌드 결과