ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [안드로이드 kotlin] 소프트 키보드 내리기(activity, custom dialog)
    안드로이드(kotlin)/기능 관련 2021. 5. 4. 09:59

    EditText 를 사용하면 소프트 키보드를 이용하게 되는데 EditText 외에 다른곳을 누르면 소프트 키보드가 내려가도록 하려고 합니다.

     

    코드는 간단합니다. 아래처럼 몇 줄만 넣으면 되죠.

    1
    2
    3
    4
    5
    6
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        return true;
    }
    cs

    자바 코드

    1
    2
    3
    4
    5
    override fun onTouchEvent(event: MotionEvent): Boolean {
        val imm: InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(currentFocus?.windowToken, 0)
        return true
    }
    cs

    코틀린 코드

     

     

    특정 레이아웃을 눌렀을 때만 소프트키보드를 내려가게 하고 싶다면 해당 레이아웃의 setOnClickListener{} 안에 넣으면 됩니다.

    1
    2
    3
    4
    5
    6
    7
    8
    inputLayout.setOnClickListener {
        softkeyboardHide()
    }
     
    fun softkeyboardHide() {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(editText.windowToken, 0)
    }
    cs

    위 코드처럼 함수로 만들고 그 함수를 setOnclickListener 안에 넣습니다.

     

     

    일반적인 엑티비티에서는 onTouchEvent 메소드 내에 또는 setOnclickListener 안에 코드를 넣어주면 됩니다.

     

    커스텀 다이얼로그를 사용한 경우에는 어떤식으로 구현 했는지에 따라 방식에 따라 달라지는데요.

     

    그냥 편하게 일반적인 엑티비티처럼 onTouchEvent 메소드를 이용하기 위해서는 Dialog 를 상속받는 방법으로 이용하면 됩니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    class AdminPwCustomDialog(context: Context) : Dialog(context) {
     
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.admin_pw_alert_dialog)
     
            window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) // 배경을 투명하게 변경. 직접 만든 둥근 배경을 지정하기 위해서 투명하게 만들었음. 
     
            val pwEt = findViewById<EditText>(R.id.pwEt)
            val okBtn = findViewById<Button>(R.id.okBtn)
            val cancelBtn = findViewById<Button>(R.id.cancelBtn)
     
            window!!.setLayout(1000600// 다이얼로그의 크기 지정
     
            setCanceledOnTouchOutside(false// 다이얼로그 영역 밖을 선택했을 때 사라지도록 함
            setCancelable(false// back button 작동 안됨
     
            okBtn.setOnClickListener {
                dismiss()
            }
     
            cancelBtn.setOnClickListener {
                dismiss()
            }        
        }
     
        override fun onTouchEvent(event: MotionEvent): Boolean {
            val imm: InputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.hideSoftInputFromWindow(currentFocus?.windowToken, 0)
            return true
        }
    }
    cs

    커스텀 다이얼로그에서 소프트키를 사라지게 하기 위해서는 Dialog class 를 상속받고 onTouchEvent() 를 사용하는게 편한것 같습니다.

     

    dispatchTouchEvent() 같은것도 사용해봤으나 구현만 복잡해지고 힘든거같았습니다.

    다른 터치 이벤트가 필요한것이 아닌 이상은 onTouchEvent() 를 추천드려요.

     

     

     

    댓글

Designed by Tistory.