Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

키보드와 뒤로가기 버튼 #6

Open
JuTaK97 opened this issue Jan 4, 2022 · 0 comments
Open

키보드와 뒤로가기 버튼 #6

JuTaK97 opened this issue Jan 4, 2022 · 0 comments
Labels
enhancement New feature or request

Comments

@JuTaK97
Copy link
Contributor

JuTaK97 commented Jan 4, 2022

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

KakaoTalk_20220105_001207938

대댓글 버튼(댓글의 말풍선)을 누르면, 대댓글 달 건지 한번 물어본 다음 확인을 누르면 해당 댓글이 빨간색으로 변합니다.
그리고 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개짜리 답변을 응용한 방법입니다.
유용해 보여서 이슈로 남겨요 (나중에 원리 까먹을까봐...)

@JuTaK97 JuTaK97 added the enhancement New feature or request label Jan 8, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant