Android/StoreInfo
최종 팀플 개발 3,4일차
re트
2024. 2. 28. 21:18
728x90
이러다가 일주일치 몰아서 쓸 거 같아서 3,4일차만 후다닥한다.
1. setOnCheckedStateChangeListener 사용법을 알았다.
이게 ChipGroup을 컨트롤할 때 사용한 건데 setOnCheckedChageListener랑은 사용법이 다르더라.
그래서 사용한 방법은 두번째 파라미터의 들어가는 값이 선택된 Chip 리스트라는 걸 가지고 필요한 처리를 했다.
cgFilterTitle1Header1.setOnCheckedStateChangeListener { group, checkedId ->
selectedOptions[0].clear()
for (id in checkedId) {
val selectedOption = filterOptions[0].first { it.first == id }.second
selectedOptions[0].add(selectedOption)
}
}
2. 다이얼로그 프래그먼트에서 프래그먼트로 람다식 보내기
이전에 어댑터에서 프래그먼트로 람다식 보내는 건 해봤는데 이게 될 줄은 몰랐다.
그런데 해보니까 되더라
덕분에 아주 편하게 이벤트를 넘길 수 있었다.
class FilterFragment(
private val onClickButton: () -> Unit
) : DialogFragment() {
companion object {
fun newInstance(onClickButton: () -> Unit) = FilterFragment(
onClickButton = onClickButton
)
}
...
}
binding.tvMapFilterBtn.setOnClickListener {
val dialog = FilterFragment.newInstance(
onClickButton = {
viewModel.load()
}
)
dialog.show(requireActivity().supportFragmentManager, "FilterFragment")
}
3. LiveData의 값을 백그라운드에서 넣을 때는...?!
setValue말고 postValue방식으로 진행해야한다.
그렇지 않으면
java.lang.IllegalStateException: Cannot invoke setValue on a background thread
이런 에러를 맞이하게 될 것이다.
4. viewModelScope는 기본적으로 메인 쓰레드
그렇기 때문에 CPU가 많이 필요하거나 입출력 작업이 많은경우에 withContext를 이용해 쓰레드를 변경해줘야한다.
그렇지 않으면
java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
이런 에러를 맞이하게 될 것이다.
5. DI라는 개념을 아직 잘 알지 못하지만 써보니까 매우 편하다.
어플리케이션 단에서 유지되는 앱컨테이너로 인해 모든 페이지에서 접근해 필요한 걸 쏙쏙 빼서 쓸수 있기 때문에..!!
6. 외부 웹페이지로 이동하는 방법
binding.btnMapReservation.setOnClickListener {
startActivity(
Intent(
Intent.ACTION_VIEW,
Uri.parse(data.svcurl)
)
)
}
7. 링크나 텍스트를 공유하는 방법
binding.ivMapInfoShareBtn.setOnClickListener {
val intent = Intent(Intent.ACTION_SEND)
intent.type = "text/html"
val url = data.svcurl
intent.putExtra(Intent.EXTRA_TEXT, url)
val text = "공유하기"
startActivity(Intent.createChooser(intent, text))
}
반응형