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()
마지막으로 시연 영상입니다.
'안드로이드 코틀린' 카테고리의 다른 글
[Android][kotlin] EditText Submit처럼 사용하기 (0) | 2022.04.06 |
---|---|
[Kotlin][Android] 안드로이드 OCR 기능 만들기 (0) | 2022.04.01 |
[Kotlin][Android] Bottom Sheet Dialog (0) | 2022.03.16 |
[Kotlin][Android] 글씨가 흐르는 텍스트뷰 만들기 (0) | 2022.03.11 |
[Kotlin][Android] 프래그먼트 커스텀 애니메이션 적용하기 (0) | 2022.03.09 |