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

addTextChangedListener 질문 있습니다.

0 추천

메모장 기능 구현 중 이것이 제게 남은 유일한 문제입니다.

컬러메모장이라는 어플을 모델로 삼아 만든 메모기능인데, 제 어플의 주요 기능 중 하나에 불과합니다.

거의 대부분의 기능을 구현했고, 이제 각 핸드폰별 UI사이즈 맞추는 작업에 들어갔습니다.

나머지 문제들은 테스트 버전의 앱을 스토어에 올렸을때 수정해주려고 합니다.

 
하나의 리사이클러뷰와 에딧텍스트를 사용하여 메모장 기능을 구현하고 있습니다.

컬러 메모장 어플을 보면, 한 화면이 가득차고 넘칠 정도로 글을 작성하면,

리사이클러뷰를 사용하여, 메모지 배경으로 쓰이는 item뷰가 하나씩 늘어나면서,

노란 바탕에 줄이 그어저 있는 메모지 배경을, 한 줄씩 재활용하는 방식으로 추가해줍니다.

이렇게 함으로써, 무한으로 똑같은 배경화면이 재활용되고, 삭제되는 구조입니다.

 

문제는, 사용자가 에딧텍스트에 작성한 글의 줄 수에 따라, 배경화면의 세로 크기도 그에 맞춰서

늘어나야 하는데, 이것을 구현하지 못하고 있다는 것입니다.

 

바꾸어 말하면, 작성한 글이 많아서 위 아래로 스크롤해야 할때,

에딧텍스트의 크기(=사용자가 작성한 글의 줄 수)를 알 수 없어서,

한 줄의 배경화면을 더 추가할지 말지를 결정할 수 없는 문제가 생긴다는 것입니다.



사용자가 엔터키를 눌러서 개행해주지 않으면, 글이 길어서 자동으로 개행될때, 개행문자가 안생기지 않나요?

그래서 개행문자의 갯수로는 뷰의 크기를 구할 수 없을것 같아서 addTextChangedListener를 사용했습니다.

그리고 getViewTreeObserver().addOnGlobalLayoutListener 까지 사용해서 에딧텍스트 뷰의 세로 크기를

직접 구하기 까지에 이르렀습니다만, 메모리 사용량이 급증하는 문제가 있어서, 이 메모리 문제를

해결하거나, 아니면, 개행문자에 대해서 자세한 조언을 다시 한 번 얻고자 합니다.

사용자가 엔터키를 누르지 않은 상태로 계속 글을 작성하면, 개행문자 없이 개행되나요?

아니면, 개행문자가 자동으로 생성되면서 개행되나요?

 

        editT2.addTextChangedListener(object : TextWatcher {
            //입력 하기 전에 작동됩니다.
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {

            }

            //타이핑 되는 텍스트에 변화가 있으면 작동됩니다.
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                //뷰의 크기 구하는 코드. oncreat()함수 내부에서는 구할 수 없고, 리스너 내부나, oncreat()함수 밖에 작성해줘야 한다.
                editT2.getViewTreeObserver().addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener {
                    override fun onGlobalLayout() {
                        //뷰의 생성된 후 크기와 위치 구하기
                        editT2.getHeight()
                        Toast.makeText(this@QuestionMemoActivity, "${editT2.getHeight()}", Toast.LENGTH_SHORT).show()
                        //리스너 해제
                        editT2.getViewTreeObserver().removeOnGlobalLayoutListener(this)
                    }
                })
            }

            //입력이 끝날 때 작동됩니다.
            override fun afterTextChanged(s: Editable?) {

            }
        })

 

상쾌한 (1,890 포인트) 님이 2021년 4월 26일 질문
상쾌한님이 2021년 4월 26일 수정

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...