
첫 번째 과제 제출 결과가 나왔다.
막 엄청 어려운 과제는 아니었지만 어느정도 도전적인 과제였다.
강사님이 제출한 답안과는 조금 달라보이지만 결국 본인 스타일이니까
TextInputLayout에는 TextInputEditText가 기본으로 같이 붙어온다.









실제 로그인창에서는 잘 안 두고 회원가입이나 정보수정 창에서 주로 셋팅함
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.apply {
// error 설정
textField.error = "입력 오류가 발생하였습니다"
}
}
}

class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.apply {
// error 설정
// textField.error = "입력 오류가 발생하였습니다"
textInputLayout.isErrorEnabled = true
textInputLayout.error = "입력 오류가 발생하였습니다"
}
}
}


좌우 스크롤은 잘 안하는 편이라 common에 ScrollView만 있고 HorizontalScrollView는 없음

class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.apply {
// ScrollView의 Scroll 이벤트
// 두 번째 : 스크롤 된 X 좌표
// 세 번째 : 스크롤 된 Y 좌표
// 네 번째 : 스크롤 되기 전 X 좌표
// 다섯 번째 : 스크롤 되기 전 Y 좌표
scroll1.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
textView.text = "X : ${oldScrollY} -> ${scrollY}"
}
// HorizontalScrollView의 Scroll 이벤트
scroll2.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
textView2.text = "X : ${oldScrollX} -> ${scrollX}"
}
button.setOnClickListener {
// 현재의 좌표를 가져온다.
textView.text = "현재의 X 좌표 : ${scroll2.scrollX}"
textView2.text = "현재의 Y 좌표 : ${scroll1.scrollY}"
}
}
}
}
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.apply {
...
button2.setOnClickListener {
// 지정된 위치로 이동한다.
scroll1.scrollTo(0,300)
scroll2.scrollTo(300,0)
// 지정한 만큼 이동한다.
scroll1.scrollBy(0,100)
scroll2.scrollBy(100,0)
// 지정된 위치로 이동한다. (애니메이션)
scroll1.smoothScrollTo(0,300)
scroll2.smoothScrollTo(300,0)
// 지정한 만큼 이동한다. (애니메이션)
scroll1.smoothScrollBy(0,100)
scroll2.smoothScrollBy(100,0)
}
}
}
}
-> 물리적인 면적단위(inch)에 dot나 pixel이 얼마나 들어갈 수 있는가?
4ppi는 1인치에 44개(16개)의 pixel이 있음
8ppi는 1인치에 88개(64개)의 pixel이 있음
-> 똑같은 단위 면적에 pixel이 많아지면 하나의 pixel의 크기가 작아지며 보다 선명한 글씨 및 이미지를 보여줄 수 있다.


비트맵 : 속도가 빠름, 크기 변경 시 깨짐
벡터 : 속도가 느림(구현을 위한 이미지 데이터가 있음), 크기 변경 시 깨지지 않음(절대적 좌표가 아닌 상대적 좌표를 사용하기 때문)
기기 설정에 영향을 받는 이미지는 홈화면아이콘이므로 벡터이미지로 단계별로 준비하여 mipmap폴더에 넣어준다.
그 외의 앱 내 이미지는 주로 비트맵으로 준비하여 drawable 폴더에 넣어주기




switch생성 시 MaterialSwitch로 변경해주면 된다.

※ 출처 : 멋쟁이사자 앱스쿨 2기, 소프트캠퍼스