메모장 기능 구현 중 이것이 제게 남은 유일한 문제입니다.
컬러메모장이라는 어플을 모델로 삼아 만든 메모기능인데, 제 어플의 주요 기능 중 하나에 불과합니다.
거의 대부분의 기능을 구현했고, 이제 각 핸드폰별 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?) {
}
})