질문
1.
어떤 경우에선 run 없이 바로 seton~ 사용하는데, 차이점이 뭔가요?
Plain Text
복사
1.
R.layout.activity_main 와 activityMainBinding.root 차이
Kotlin
복사
1.
append 사용시 결과 값이 한줄씩 엔터 되서 출력되게 하는 방
Kotlin
복사
멘토 답변
•
문제 공유방에서 첫번째 안드로이드 프로젝트 과제를 학습해오고 궁금한 것을 질문하는 방식으로 4주차를 진행했습니다.
•
run을 사용하는 이유에 대해서 간단히 알아보았습니다.
activityMainBinding.editText1.setText("")
activityMainBinding.editText1.setOnFocus...
activityMainBinding.editText1.something..
위 코드 처럼 중복으로 참조하는 변수를 수신객체로 지정해서 중복 코드를 줄이는 방법으로 사용
수신 객체 지정 람다 문법
apply, with, run ...
with(activityMainBinding) {
editText1.setText("")
editText1.setOnFocus..
editText1.something()
}
Kotlin
복사
•
R.layout.activity_main 와 activityMainBinding.root 차이점을 설명드리면서, Binding 클래스의 root를 설명해드렸습니다.
setContentView(activityMainBinding.root)
vs
setContentView(R.layout.activity_main)
XML과 ViewBinding을 이용한 뷰 구현에 대한 차이를 설명드렸습니다.
inflate: XML에 정의된 뷰 -> View.class 객체로 변경하는 것
root는 ViewBinding로 인해 구현된 뷰 Tree에서 젤 상위 부모를 참조하는 변수.
Kotlin
복사
•
줄바꿈 문자에 대해서 설명드렸습니다.
append 사용시 결과 값이 한줄씩 엔터 되서 출력되게 하는 방법
Kotlin
복사
"\n" 줄바꿈 아스키 코드 문자열
listView.append(name + "\n")
listView.append("$age\n")
listView.append(korean)
Kotlin
복사
•
기능 구현에 대해서 로직을 분리하는 관점에서도 설명해드렸습니다.
activityMainBinding.run {
editTextNumber2.run{
setOnEditorActionListener { v, actionId, event ->
var name = editTextText1.text.toString()
var age = editTextNumber1.text.toString()
var korean = editTextNumber2.text.toString()
listView.text = ""
listView.append(name)
listView.append(age)
listView.append(korean)
editTextText1.setText("")
editTextNumber1.setText("")
editTextNumber2.setText("")
setText("")
true
}
}
}
Kotlin
복사
editTextNumber2 뷰를 제어하고 있는데 editTextText1과 editTextNumber1를 내부에서 또 접근하고 있다.
하나의 뷰가 또 다른 뷰를 제어하는 구조가 어색하다.
/**
* 요구 사항.
* 조건: 3번째 EditText Enter를 입력했을 때
* 액션: 3개의 EditText 모두 초기화하고, 3개 입력 값으로 이루어진 Text를 추가한다.
*/
Kotlin
복사
editTextNumber2.run {
setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
onEnderClick()
}
true
}
}
// 액션: 3개의 EditText 모두 초기화하고, 3개 입력 값으로 이루어진 Text를 추가한다.
private fun onEnderClick() {
addListView()
clearAllEditText()
}
private fun addListView() = with(activityMainBinding) {
val name = editTextText1.text.toString()
val age = editTextNumber1.text.toString()
val korean = editTextNumber2.text.toString()
//줄바꿈 \n
listView.text = ""
listView.append(name + "\n")
listView.append("$age\n")
listView.append(korean)
}
private fun clearAllEditText() = with(activityMainBinding) {
editTextText1.setText("")
editTextNumber1.setText("")
editTextNumber2.setText("")
}
Kotlin
복사
요구사항에 따라 역할을 함수로 분리.
editTextNumber2 리스너에 또 따른 뷰를 접근하는 부분은 로직의 일부 일뿐 뷰와 어떤 의존성이 생기는 것이 아니다.
단지 기능에 따른 코드 분리가 안되어 있어 코드 관점으로 연관되어 보이는 느낌을 받을 것 이다.
•
뷰 여백을 그리는 속성인 padding과 margin에 대해서 복습하는 과정을 가졌습니다.
padding: 뷰 내부 여백을 주는 속성
margin: 뷰 외부로 여백을 주는 속성
Kotlin
복사