에타 대댓글 기능에는 이런 귀찮은 디테일이 있습니다.

대댓글 버튼(댓글의 말풍선)을 누르면, 대댓글 달 건지 한번 물어본 다음 확인을 누르면 해당 댓글이 빨간색으로 변합니다.
그리고 editText에 포커스가 가고, 키보드가 올라옵니다.
여기서 상당히 귀찮은 기능이 있는데, 뒤로가기를 누르면 이 빨간색이 해제되고 대댓글 쓰기 모드는 취소됩니다.
빨갛게 만드는 건 쉬운데, 하얗게 되돌리는 부분에 함정이 있었습니다.
키보드가 올라와 있는 상황에서는 사용자가 뒤로가기를 누른 것을 탐지하는 게 어렵다는 문제가 있었습니다.
보통 뒤로가기 버튼을 누르는 이벤트는 액티비티에서 onBackPressed()를 override 해서 탐지하게 되는데, 키보드가 올라와 있는 상황에서 뒤로가기를 누르면 키보드를 내리는데 그 뒤로가기가 소모되어 버리고 onBackPressed()가 작동하지 않습니다.
이는 "이 댓글을 parent로 하겠다" 라고 지정한 것을 취소하지도 못한다는 뜻이라서 문제가 큽니다.
찾아낸 방법은 editText 가 가지고 있는 onKeyPreIme() 함수를 사용하는 것입니다.
editText 를 상속받는 새로운 커스텀 클래스를 만들고, article_activity.xml 의 해당 editText 의 type을 이걸로 바꿉니다.
// activity_article.xml
<com.example.toyproject.ui.article.CustomEditText
android:id="@+id/commentEditText"
...
... />
// CustomEditText.kt
@SuppressLint("AppCompatCustomView")
class CustomEditText(context: Context?, attrs: AttributeSet?) : EditText(context, attrs) {
override fun onKeyPreIme(keyCode: Int, event: KeyEvent): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// 이곳
}
return false
}
이렇게 onKeyPreIme()를 override 해주고, "이곳"에서 activity 에게 명령을 전달해 줘야 합니다.
명령 전달은 interface 를 사용합니다. CustomEditText 클래스 내에
private lateinit var bridge : CustomEditToActivity
interface CustomEditToActivity {
fun call()
}
fun caller(bridge : CustomEditToActivity) {
this.bridge = bridge
}
와 같이 인터페이스와 함수를 하나 만들어 줍니다. Activity 쪽에도
// ArticleActivity.kt
// 대댓글 작성중에 뒤로가기 누르면 취소(parent 하얗게 되돌리기)
binding.commentEditText.caller(object : CustomEditText.CustomEditToActivity {
override fun call() {
// 하얗게 되돌리는 작업 여기서 진행
}
})
이렇게 해 주면 평소처럼 키보드도 내려가고, 원하는 작업도 할 수 있게 됩니다.
https://stackoverflow.com/questions/3940127/intercept-back-button-from-soft-keyboard 의 좋아요 84개짜리 답변을 응용한 방법입니다.
유용해 보여서 이슈로 남겨요 (나중에 원리 까먹을까봐...)
에타 대댓글 기능에는 이런 귀찮은 디테일이 있습니다.
대댓글 버튼(댓글의 말풍선)을 누르면, 대댓글 달 건지 한번 물어본 다음 확인을 누르면 해당 댓글이 빨간색으로 변합니다.
그리고 editText에 포커스가 가고, 키보드가 올라옵니다.
여기서 상당히 귀찮은 기능이 있는데, 뒤로가기를 누르면 이 빨간색이 해제되고 대댓글 쓰기 모드는 취소됩니다.
빨갛게 만드는 건 쉬운데, 하얗게 되돌리는 부분에 함정이 있었습니다.
키보드가 올라와 있는 상황에서는 사용자가 뒤로가기를 누른 것을 탐지하는 게 어렵다는 문제가 있었습니다.
보통 뒤로가기 버튼을 누르는 이벤트는 액티비티에서 onBackPressed()를 override 해서 탐지하게 되는데, 키보드가 올라와 있는 상황에서 뒤로가기를 누르면 키보드를 내리는데 그 뒤로가기가 소모되어 버리고 onBackPressed()가 작동하지 않습니다.
이는 "이 댓글을 parent로 하겠다" 라고 지정한 것을 취소하지도 못한다는 뜻이라서 문제가 큽니다.
찾아낸 방법은 editText 가 가지고 있는 onKeyPreIme() 함수를 사용하는 것입니다.
editText 를 상속받는 새로운 커스텀 클래스를 만들고, article_activity.xml 의 해당 editText 의 type을 이걸로 바꿉니다.
이렇게 onKeyPreIme()를 override 해주고, "이곳"에서 activity 에게 명령을 전달해 줘야 합니다.
명령 전달은 interface 를 사용합니다. CustomEditText 클래스 내에
와 같이 인터페이스와 함수를 하나 만들어 줍니다. Activity 쪽에도
이렇게 해 주면 평소처럼 키보드도 내려가고, 원하는 작업도 할 수 있게 됩니다.
https://stackoverflow.com/questions/3940127/intercept-back-button-from-soft-keyboard 의 좋아요 84개짜리 답변을 응용한 방법입니다.
유용해 보여서 이슈로 남겨요 (나중에 원리 까먹을까봐...)