본문 바로가기
안드로이드 자바

[JAVA][Android] 키보드 보이기/숨기기

by teamnova 2022. 2. 20.
728x90

이번 시간에는 키보드를 보이거나 숨겨야할때 사용하는 코드를 알아보도록하겠습니다.

 

계획은 글을 작성할 수 있는 에딕텍스트와 키보드를 올리고 내릴 버튼을 통해서 키보드를 올리고 내려보도록 하겠습니다. 

 

아 그리고 액티비티가 켜질때 키보드도 같이 올라오도록 만들어보겠습니다.

 

해당 코드는 api 21 , api 30 에서 테스트 되었습니다.

 

일단 코드 먼저 복사,붙여넣기 해주세요.

 

activity_main.xml

<?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"
    android:focusableInTouchMode="true"
    android:focusable="true"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent" />


    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="키보드 on/off"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/editText" />



</androidx.constraintlayout.widget.ConstraintLayout>

 

붙여넣기 하실 때 주의할 부분이 있는데 EditText 의 부모인 ConstraintLayout 에 속성으로 android:focusableInTouchMode="true" 와 android:focusable="true" 를 추가해주셔야 합니다.

 

이유는 액티비티 코드에서 설명하도록 하겠습니다.

 

MainActivity.java


import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.WindowInsetsControllerCompat;
import android.os.Bundle;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = findViewById(R.id.editText);
        Button button = findViewById(R.id.button);

        editText.requestFocus();
        keyBordShow(); // 해당 메소드로 키보드가 올라오지 않으면 manifests 에 액티비티 속성으로 android:windowSoftInputMode="stateVisible" 를 추가해주도록 한다.

        button.setOnClickListener(view -> {
            if (editText.isFocused()) {
                editText.clearFocus(); // 메소드가 동작했으나 포커스가 사라지지 않는다면 레이아웃 파일로 가서 레이아웃에 포커스 관련 속성이 추가되어 있는지 확인한다.
                keyBordHide();
            } else {
                editText.requestFocus();
                keyBordShow();
            }
        });
    }

    void keyBordHide() {
        Window window = getWindow();
        new WindowInsetsControllerCompat(window, window.getDecorView()).hide(WindowInsetsCompat.Type.ime());
    }

    void keyBordShow() {
        Window window = getWindow();
        new WindowInsetsControllerCompat(window, window.getDecorView()).show(WindowInsetsCompat.Type.ime());
    }
}

 

처음 화면이 켜질때 EditText 에 커서가 보이도록 포커스를 줬고 키보드가 보이게 만들었습니다.

 

여기서 키보드가 안올라 온다면 manifests 에 액티비티 속성으로 android:windowSoftInputMode="stateVisible" 을 추가해주세요.

 

액티비티가 실행될 때 키보드가 같이 올라오게 만들어주는 속성입니다.

 

버튼이 눌리면 에디텍스트에 포커스(커서)가 있는지 확인하고 있으면 포커스를 없애고, 키보드를 숨깁니다.

 

포커스가 없다면 반대로 동작하게 만들었습니다.

 

여기서 포커스를 없애는 clearFocus() 가 동작했을때 아까 activity_main.xml 에서 레이아웃에 설정한 포커스 관련 코드가 없으면, 다시 에딧텍스트로 포커스가 들어가는 문제가 생길 수 있습니다.

 

clearFocus() 메소드 실행 후 가장 첫번째 포커스 가능한 뷰를 찾아서 다시 포커스를 잡아주는데 그 뷰가 하필 방금 포커스를 없앤 에딧텍스트인 경우에 생기는 문제입니다.

 

자세한 내용은 공식 홈페이지 clearFocus() 의 Note 부분을 확인해주세요.

https://developer.android.com/reference/android/view/View#clearFocus() 

 

View  |  Android Developers

 

developer.android.com

 

마지막으로 시연 영상입니다.