반응형

갑자기 글자 수 표시가 하고 싶어졌다.

일반적으로 글을 작성할 때 아래쪽에 최대 글자 수 및 현재 입력된 글자 수를 표기되는 것을 보았다. 갑자기 그게 구현하고 싶어져서 열심히 찾아보고 구현했다.

위와 같이 내용을 작성하는 곳의 우측 하단에 0 / 2000 으로 최대 글자 수(2000)과 현재 입력된 글자 수(0)를 표기해주었다.

그 아래에는 최대 100줄의 문장을 입력할 수 있다고 명시해두었다.

내용 설명

[안드로이드[Android]] - 안드로이드[Android] EditText 입력 글자 수, 문장 수 제한하기

 위의 링크에서 보다 자세하게 EditText에서 입력 받는 글자 수, 문장 수 제한하는 방법을 설명해두었다.

위의 기능을 구현하기 위한 코드는 프레그먼트의 onViewCreated() 내부에 작성해주었다. writeContent는 내용에 적히는 부분이고 countText는 0 / 2000 이 부분이다.

에딧텍스트에 입력되는 것을 감지하기 위해 가장 먼저 리스너를 설정해주었다. 

with(binding) 스코프 함수 내부에 위의 코드를 작성하였기 때문에 에딧텍스트, 텍스트뷰에 접근할 때 binding을 해주지 않아도 된다.

override 함수 세종류는 윈도우라면 ctrl + i 맥이라면 cmd + i를 눌러 가져올 수 있다.

writeContent.addTextChangedListener(object : TextWatcher{
                
                override fun beforeTextChanged(pos: CharSequence?, p1: Int, p2: Int, p3: Int) {
                    
                }
                override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                }

                override fun afterTextChanged(p0: Editable?) {
                    
                }
            })

각 메서드에 대한 설명은 아래 표에 나와있다. 더 자세한 정보는 공식문서 참조

가장 먼저 문장의 줄, 글자 수의 제한이 걸리기 전까지 문자열을 입력 받을 변수 maxContent를 선언해주었다. 그리고 beforeTextChanged 안에서 maxContent = pos.toString()을 해주어 입력 받은 문자열을 maxContent에 넣어주도록 하였다.

그 후 afterTextChanged에서 유저가 입력 받은 내용을 userInput에 저장을 해준다.

만약 입력 받은 글자, 문장 수가 제약을 초과하는 경우 (글자 수는 2,000, 문장수는 100줄로 설정함.) 

커서는 글자 맨 마지막에 있고 Toast를 통해 글자 수, 문장 수를 초과했다고 알려줄 수 있도록 했다.

with(binding){
        writeContent.addTextChangedListener(object : TextWatcher{
            var maxContent = ""
            override fun beforeTextChanged(pos: CharSequence?, p1: Int, p2: Int, p3: Int) {
                maxContent = pos.toString()
            }
            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                var userInput = writeContent.text.toString()

                // 최대 문장 수가 100줄을 초과할 경우
                if (writeContent.lineCount > 100){
                    Toast.makeText(context, "최대 문장 수를 초과했습니다."
                        ,Toast.LENGTH_SHORT).show()

                    writeContent.setText(maxContent)
                    writeContent.setSelection(writeContent.length())
                    countText.setText(userInput.length.toString() + " / 2000\n" +
                            "최대 100줄")
                // 최대 글자 수가 2000자를 초과할 경우
                } else if (userInput.length >= 5){
                    Toast.makeText(context, "최대 글자 수를 초과했습니다."
                        ,Toast.LENGTH_SHORT).show()

                    writeContent.setText(maxContent)
                    writeContent.setSelection(writeContent.length())
                    countText.setText(userInput.length.toString() + " / 2000\n" +
                            "최대 100줄")
                }else {
                    countText.text = userInput.length.toString() + " / 2000\n" +
                            "최대 100줄"
                }
            }
            override fun afterTextChanged(p0: Editable?) {

            }
        })
    }

우선 XML에서 설정할 수 있는 EditText의 maxLines 요놈 아주 교활한 친구이다. 처음에 당연히 maxLines로 간단하게 입력받는 문장 수 제한 해야지~~~ 했는데... 원하는대로 되지 않길래 찾아보니 maxLines는 단순히 보여주는 최대 줄 수 를 정해주는 부분이었다... 

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기