Do It! 안드로이드 p.151 도전 04. 문제
editText의 addTextChangedListener를 사용하면 되는 도전 문제 였다.물론 이렇게 할 수도 있지만, 데이터 바인딩과 라이브 데이터를 이용해서도 한번 풀어보았다.
우선 editText의 addTextChangedListener를 사용해서 풀면 다음과 같다.
우선 레이아웃 구조를 살펴보자면 다음과 같다.
제약 레이아웃을 사용한 구조이다. background로 사용한 drawable이 있는데 그냥 검은색 네모칸을 위해 만들어 놓았다.
TextView도 하나 만들어 놓아서 바이트 수를 표기할 것이다.
버튼은 두 개를 만들어 놓았고 수평구조를 이루게 레이아웃 선을 선정해 놓았다.
EditText의 addTextChangedListener를 람다로 구현하면 구현해야 할 메서드가 세 개가 나온다.
차례대로 입력 받기 전, 입력 받는 도중, 입력 받은 후 이다.
여기서 구현해야 할 부분은
- 입력을 받으면 바이트의 크기 구해서 텍스트뷰의 표시
- 만일 80바이트가 넘으면 못 적게 막기
1번 텍스트의 바이트의 크기 표시는 입력을 받는 부분에서 구현했고
2번 80바이트 제한은 입력 후를 관리하는 부분에서 구현했다.
코드가 어렵지는 않으므로 쉽게 구현할 수 있었는데 스트링을 바이트로 변환하는 부분을 오늘 배웠다.
String 객체의 getByte()에 매개변수로 euc-kr 이런 것을 넣어줄 수 있다.
다음은 데이터 바인딩 + 뷰모델 + 라이브 데이터로 구현한 것이다.
우선 데이터 바인딩을 하기 위해서는 <layout></layout>으로 전체를 감싸줘야한다.
그리고 <data></data> 부분에서 데이터 바인딩을 할 수 있다. 여기서는 import해서 라이브러리도 쓸 수 있고, variable로 내가 만든 임의의 클래스도 사용할 수 있다. 물론 Boolean, Int 이런 것도 사용할 수 있다.
나중에 꼭 따로 한번 정리해 봐야할 내용들인 것 같다.
뷰 모델에서는 contents와 length가 있는데, contents는 문자의 내용이고 length가 문자의 바이트 길이를 문자열 라이브 데이터로 만든 것이다. 원래는 observe 없이 입력하면 자동으로 업데이트 되는 것이 목표였다.
그리고 Live Data와 mutableLiveData의 차이는 간단하게 Live Data는 수정 불가. mutableLiveData는 수정이 가능하다는 정도? 그리고 mutableLiveData에는 값을 넣을 때, setValue()와 postValue()가 있는데,
- setValue() : 우선순위가 높은, 메인 스레드에서 실행 시 값을 넣을 때 쓰는 메서드
- postValue() : 우선순위가 낮은, 백그라운드에서 실행 시 값을 넣을 때 쓰는 메서드
로 요약할 수 있다고 한다. 자세한 내용은 나중에 따로 정리해 봐야 할 것 같다.
레포지토리는 따로 없이 바로 리턴하도록 만들었다.
메인 액티비티의 소스코드이다.
특별한 점은 없고 observe를 이용해서 만들었는데, 사실 내가 원한 것은 observe 없이 xml에서 이미 editText에서도 값이 수정될 때마다 바뀌고 있으므로 알아서 수정되길 바랬다.
그런데 observe없이는 작동하지 않았다. (어차피 길이 80제한 주려면 필요한 부분이긴 했다.)
사실 observer 없이 버튼에 Log로 getViewModel().getContents() 혹은 getLength()를 해서 getValue()를 하면 View가 잘 업데이트가 되었다. 왜 그런지는 모르겠지만 첫번째로 업데이트 하지 않으면 자동으로 업데이트가 되지 않았다.
데이터 바인딩, 뷰 모델, 라이브 데이터는 좀 더 공부해봐야 할 것 같다.
아직 기초가 모자라서 기초부분을 공부하고 있긴 하지만, 틈틈히 저런 어려운 것들도 공부해야할 것 같다.
'안드로이드 > 개념' 카테고리의 다른 글
[Android] 화면 여러개 만들어서 화면 전환하기 - onActivityResult, startActivityForResult Deprecated. registerForActivityResult 사용해보기 (0) | 2021.07.28 |
---|---|
[Android] 레이아웃 인플레이션 (0) | 2021.07.28 |
[Android] Do It! 안드로이드 도전 03. 두 개의 이미지뷰에 이미지 번갈아 보여주기 (0) | 2021.07.25 |
[Android] 스크롤 뷰, Scroll View (0) | 2021.07.25 |
[Android] 프레임 레이아웃, Frame Layout (0) | 2021.07.21 |