마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

자동 줄바꿈을 감지할 수 있는 코드.

0 추천

에딧 텍스트에 한 줄 꽉차게 글자나 숫자를 입력한 상태에서, 한 번 더 글자나 숫자를 타이핑하면,

그 다음 줄로 자동으로 줄바꿈(개행) 시켜주잔아요?

그런데 자동으로 줄바꿈 시켜주는 것은, 강제 개행(enter키)과 다르게, 문자열로 인식하지 않더라구요.

문자열 개수를 비교해보면, 자동개행 된 것은 문자열의 개수만 토스트 메시지로 나타내주는데,

강제개행된 것은 문자열+강제개행된 개수까지 토스트 메시지로 나타내주더라구요.

 

문제는, 자동으로 줄바꿈 시켜주는 "자동 개행을 감지할 수 있는 코드가", 코틀린이나 안드로이드 스튜디오 중

에 "있느냐 하는 것"이에요. 개수를 감지하든, 자동 개행되는 행위 자체를 감지하든 상관 없습니다. 이것을 감

지하는 코드만 있으면, 제 문제는 완전히 해결되는데, 인터넷 검색으로는 찾을 수가 없네요...

        editT2.addTextChangedListener(object : TextWatcher {
            //입력 하기 전에 작동됩니다.
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
                //s: CharSequence? : editT2에 현재 입력되어 있는 문자열을 인수로 받아오는 매개변수다.
                //start: Int : editT2에 입력된 문자열을 변경하고자 할 때, 변경 시작 지점을 index 수치로 표현해주는 매개변수다. 커서와 드래그의 영향을 받는 수치 같다.
                //count: Int : editT2에 입력된 문자열을 변경하고자 할 때, 드래그한 문자의 개수를 일반적인 수치로 표현해주는 매개변수다.
                //after: Int : 새로 추가할 문자열의 수를 표현
            }

            //타이핑 되는 텍스트에 변화가 있으면 작동됩니다.
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                //s: CharSequence? : 변경 이후, editT2에 저장된 문자열을 인수로 받아오는 매개변수다.
                //start: Int : 새로 추가된 문자열들의 시작점인 index값, 여러개의 문자열이 추가된 경우, 가장 왼쪽의 index값을 인수로 받아온다.
                //before: Int : 새 문자열이 추가되면서, 드래그 해놓아서 "삭제된 기존 문자열의 개수"를 일반적인 수치로 표현해주는 매개변수다.
                //count: Int : "새로 추가된 문자열의 개수"를 표현해주는 매개변수다.
            }

            //입력이 끝날 때 작동됩니다.
            override fun afterTextChanged(s: Editable?) {
                //s: Editable? : 타이핑이 끝난 후, editT2의 문자열을 인수로 받아오는 매개변수다.
                
                //문자열의 개수가 일정량을 넘어서면, 자동으로 강제 개행하도록 코딩한다. 즉, editT3가 새로 추가되도록 코딩해놓는 것이다.
                //문자열이 숫자 보다 훨씬 기니까, 문자열의 개수를 개행의 기준으로 삼자.

                //문자열은 한 줄에 17개가 들어간다. 숫자는 27개가 한 줄에 들어간다.
                //안드로이드 스튜디오는, 자동 개행을 문자열로 인정하지 않는다. 그러므로 자동 개행은 문자열의 개수에 포함되지 않는다.
                //그러나 강제 개행(enter키)은 문자열의 개수에 포함된다. 그러므로, 17개의 문자열을 입력하면, 강제 개행을 시켜줘야 한다.
                //그러므로, 문자열의 개수와, 강제 개행키의 개수와 합하여, editT3를 추가할지 말지를 결정하면 되는 것이다...
                Toast.makeText(this@QuestionMemoActivity, "${s?.length}", Toast.LENGTH_SHORT).show()


                //뷰의 크기 구하는 코드. oncreat()함수 내부에서는 구할 수 없고, 리스너 내부나, oncreat()함수 밖에 작성해줘야 한다.
                /*
                editT2.getViewTreeObserver().addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener {
                    override fun onGlobalLayout() {
                        //뷰의 생성된 후 크기와 위치 구하기
                        numbers = editT2.getHeight()
                        Toast.makeText(this@QuestionMemoActivity, "$numbers", Toast.LENGTH_SHORT).show()
                        //리스너 해제
                        editT2.getViewTreeObserver().removeOnGlobalLayoutListener(this)
                    }
                })*/
            }
        })

 

상쾌한 (1,890 포인트) 님이 2021년 9월 28일 질문

1개의 답변

+1 추천
 
채택된 답변
디버깅을 해보시면 줄바꿈을 강제로 했다면 입력한 문자열에 line feed('\n')가 포함되어 있을 겁니다. 따라서 Line feed문자가 포함되어 있느지를 체크하시면 됩니다.

이걸 체크하기 위해서 String.contains, Strings.any 등등 사용할 수 있는 함수가 몇개 있을 겁니다. 아주 간단한 거라 금방 하실 수있을 겁니다.
spark (227,470 포인트) 님이 2021년 9월 28일 답변
상쾌한님이 2021년 9월 28일 채택됨
강제 개행이 아닌, 자동으로 개행된 경우라서, \n이 없을 것 같습니다만, 한 번 해보겠습니다. 감사합니다.
한 줄 꽉차서 알아서 자동으로 개행할 경우에는 false로 나오더라구요. enter키 눌러서 개행 시켜주니 그때서야 비로소 true로 나왔어요. 방법을 바꿔야 하나봐요.
Toast.makeText(this@QuestionMemoActivity, "${s?.contains("\n")}", Toast.LENGTH_SHORT).show()
네. 강제개행만 line feed가 존재합니다.
아~ 하나 생각났어요. 한 번 해봐야겠네요. 감사합니다.
개발자 페이지에 있었네요. 와~ 감사합니다. ㅠ-ㅠ
Packages > android.widget > Classes
됩니다. 와~~ 자동개행이든지 강제개행이든지 무조건 줄로 인식하네요. 감사해요!!
...