본문 바로가기
프로그래밍/Android

[Android] 키보드로 EditText 아래 객체가 가려질때 해결법

by Youngs_ 2022. 7. 30.

분명히 잘됐는데 코드를 수정하다보니까 안된다.. 아래방법대로 하는게 아닌듯 뭐가 문제인거지

아래 화면은 필자가 만든 앱의 회원가입 화면이다.
아래 화면에서 비밀번호 확인을 눌러보겠다.

회원가입 화면

 

비밀번호 확인을 눌렀더니 아래 화면과 같이 가입하기 버튼이 사라져서 사용자가 키보드를 닫은 후에 가입하기 버튼을 클릭해야 하는 불편함이 생긴다.
하단에 코드를 넣겠지만, 필자는 ScrollView를 이용하였지만 자동으로 스크롤 되지 않았다.
그 이유는 무엇일까?

가입하기 버튼이 가려진다

 

아래 코드는 위 회원가입 페이지의 XML 코드이다. 분명 ScrollView를 사용했음에도 자동으로 스크롤되지 않았다.

왜냐하면 ScrollView를 사용했지만 ScrollView의 크기가 작아 한 화면에 모두 담기기 때문에 자동으로 스크롤되지 않기때문이다.

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


    <TextView
        android:id="@+id/textView_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:layout_marginBottom="65dp"
        android:text="회원가입"
        android:textSize="30sp"
        android:textStyle="bold"
        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:layout_marginTop="50dp"
        android:gravity="center"
        app:layout_constraintTop_toBottomOf="@+id/textView_title">

        <ScrollView
            android:id="@+id/scrollView_signUpInformation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="20dp"
            android:layout_marginEnd="20dp">

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

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

                    <TextView
                        android:layout_width="80dp"
                        android:layout_height="match_parent"
                        android:gravity="center"
                        android:text="이름 *" />

                    <EditText
                        android:id="@+id/editText_Name"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:hint="이름"
                        android:inputType="textPersonName" />
                </LinearLayout>

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

                    <TextView
                        android:layout_width="80dp"
                        android:layout_height="match_parent"
                        android:gravity="center"
                        android:text="아이디 *" />

                    <EditText
                        android:id="@+id/editText_ID"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:hint="아이디" />
                </LinearLayout>

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

                    <TextView
                        android:layout_width="80dp"
                        android:layout_height="match_parent"
                        android:gravity="center"
                        android:text="이메일 " />

                    <EditText
                        android:id="@+id/editText_Email"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:hint="이메일"
                        android:inputType="textEmailAddress" />
                </LinearLayout>

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

                    <TextView
                        android:layout_width="80dp"
                        android:layout_height="match_parent"
                        android:gravity="center"
                        android:text="휴대폰 번호" />

                    <EditText
                        android:id="@+id/editText_PhoneNumber"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:hint="휴대폰 번호"
                        android:inputType="phone"
                        android:maxLength="11" />

                    <Button
                        android:id="@+id/button_SendCertifyNumber"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/customlayout_button_main"
                        android:text="인증번호 발송"
                        android:textColor="@color/white" />
                </LinearLayout>

                <LinearLayout
                    android:id="@+id/linearLayout_CertifyNumber"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:visibility="gone"
                    tools:visibility="visible">

                    <TextView
                        android:layout_width="80dp"
                        android:layout_height="match_parent"
                        android:gravity="center"
                        android:text="인증번호\n입력" />

                    <EditText
                        android:id="@+id/editText_InputCertifyNumber"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:hint="인증번호 입력"
                        android:inputType="number"
                        android:maxLength="6" />

                    <CheckBox
                        android:id="@+id/checkbox_CertifyValue"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:enabled="false" />

                    <Button
                        android:id="@+id/button_CertifyNumber"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/customlayout_button_sub"
                        android:text="인증번호 확인" />

                </LinearLayout>


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

                    <TextView
                        android:layout_width="80dp"
                        android:layout_height="match_parent"
                        android:gravity="center"
                        android:text="비밀번호 *" />

                    <EditText
                        android:id="@+id/editText_Password"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:hint="비밀번호"
                        android:inputType="textPassword" />
                </LinearLayout>

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

                    <TextView
                        android:layout_width="80dp"
                        android:layout_height="match_parent"
                        android:gravity="center"
                        android:text="비밀번호 \n확인 *" />

                    <EditText
                        android:id="@+id/editText_PasswordCheck"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:hint="비밀번호 확인"
                        android:inputType="textPassword"
                        app:layout_constraintStart_toStartOf="@+id/join_password" />
                </LinearLayout>


                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="20dp"
                    android:gravity="center"
                    android:id="@+id/linearLayout_button"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/join_pwck">

                    <Button
                        android:id="@+id/join_button"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/customlayout_button_main"
                        android:text="@string/action_sign_up"
                        android:textColor="@color/white" />
                </LinearLayout>
            </LinearLayout>
        </ScrollView>
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

 

이때문에 사용자가 회원가입을 하기 위해 EditText를 누르면 자동으로 스크롤이 되도록 하기위해 필자는 linearLayout_button 레이아웃에 아래 옵션을 넣는 방법으로 자동으로 스크롤이 되도록 수정했다.

물론 다른 방법이 있을것같지만 이와같은 방법으로도 해결할수있다

android:layout_marginBottom="200dp"

 

manifest.xml에서 windowSoftInputMode를 수정해야하는듯하다

<activity
    android:name=".ui.main.MainActivity"
    android:windowSoftInputMode="adjustPan"/>

수정후 자동으로 스크롤이 되는 모습

 

https://googry.tistory.com/43

 

(Android) 키보드가 보여질 때 화면 스크롤하기

Activity에서 키보드가 올라오고 화면크기를 변경하기 위해 AndroidManifest.xml에 android:windowSoftInputMode에 adjustResize를 설정해줍니다. 위에 화면처럼 EditText를 선택하고 키보드가 올라오면 아래 로..

googry.tistory.com

해당 블로그에 적힌 방법으로도 해결 할 수 있는 것 같지만 회원가입창을 Activity가 아닌 Dialog를 사용한 필자가 보기에는 그렇게 쉬운 방법도 아니고, 필자가 사용한 방법이 더 간편해보여서 필자가 포스팅한 방법을 사용하였다.

해당 방법을 사용하려면 Window를 사용하는데 액티비티가 아닌 Dialog에서 Dialog.window를 이용해 getWindow()를 하면 형식이 Window(null 불가능)가 아닌 Window?(null 가능)를 가져와서 해당 부분을 신경써야 하는것 같았다..ㅠ

액티비티에서 getWindow()를 사용하면 Window 형식으로 가져오는지는 모르겠다

 

아래 링크는 키보드가 올라올때 레이아웃이 어떻게 움직일지 옵션을 정리해놓은 좋은 글이 있길래 가져왔다.
키보드가 올라올때 레이아웃이 어떻게 보일지 설정하고 싶다면 아래 방법을 이용해 manifest.xml을 수정하길 바란다.

https://parkho79.tistory.com/59

 

안드로이드 소프트 키보드 windowSoftInputMode

이번 포스팅에서는 안드로이드 소프트 키보드 설정에 대해 알아보자. (특히 layout 을 조정하는 adjustXXX 를 자세히 보자!) How to ◼ AndroidManifest.xml ◼ Java code adjustPan 소프트 키보드에 의해 EditTex..

parkho79.tistory.com

 

댓글