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))
}
반응형