본문 바로가기
안드로이드 코틀린

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

by teamnova 2022. 3. 20.
728x90

java 버전은 https://stickode.tistory.com/392 에서 확인해주세요.

 

 

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

 

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

 

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

 

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

 

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

 

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 android.os.Bundle
import android.widget.Button
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val editText : EditText = findViewById(R.id.editText)
        val button : Button = findViewById(R.id.button)

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

        button.performClick() // 이 줄 코드가 실행되었는데 키보드가 올라오지 않으면 manifests 에 액티비티 속성으로 android:windowSoftInputMode="stateVisible" 를 추가해주도록 한다.
    }

    private fun keyBordHide() {
        WindowInsetsControllerCompat(window, window.decorView).hide(WindowInsetsCompat.Type.ime())
    }

    private fun keyBordShow() {
        WindowInsetsControllerCompat(window, window.decorView).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

 

 

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