강의를 보고 그대로 만든 앱이 있는데 사소한걸 변경하려니 고생을 꽤나했다. 역시 듣고 따라한거 이후에 뭔가를 더 해봐야한다.
일부러 검색이나 강의 자료를 보지 않고 기억과 코드 두개를 비교하여서 해냈다.
강의대로 만든 것은 1번 프래그먼트에서 도시를 선택하면 1,2번 프래그먼트 모두 해당 도시가 선택되고 그 도시의 기상 정보가 나오는 앱이다. 하지만 2번 프래그먼트에서는 도시를 선택할 수 없기 때문에 불편하다. 2번 프래그먼트에 함수들을 그대로 구현하니 제대로 바뀌었다.
하지만 2번 프래그먼트에서는 도시의 이름만 바뀌고 기상정보가 바뀌지 않는 오류가 발생했다.
변화를 감지하는 것은 viewmodel의 관할이다.
// fragment
private fun fetchWeatherData() {
viewModel.getWeatherList(currentDate)
}
// private fun showCitiesPopup(anchorView: View)
viewModel.regionText.observe(viewLifecycleOwner) { selectedCity ->
binding.selectedRegionText.text = selectedCity
}
양 프래그먼트에는 위의 fetchWeatherData라는 함수가 정의되어 있어서 뷰모델이 변화를 감지하고, showCitiesPopup 함수안에서 fetchWeatherData()를 불러와서 변화를 감지한다.
하지만 1번 프래그먼트와 2번 프래그먼트의 레이아웃 구현이 달라서 1번 프래그먼트에서는 아래와 같은 구문을 삽입했다.
viewModel.regionText.observe(viewLifecycleOwner) { selectedCity ->
binding.selectedRegionText.text = selectedCity
}
완전히 같은 함수를 사용했다면 액티비티에서 함수를 구현하고 인터페이스를 통해서 사용했을텐데 아쉽다.
만들고보니 2번 프래그먼트에는 여기를 누르면 목록이 나옵니다!라고 느껴질만한 아이콘이 없었다.
이미 만들어둔 아이콘을 추가하고 색만 바꾸었다.
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M7.917,4.167L13.75,10L7.917,15.833"
android:strokeLineJoin="round"
android:strokeWidth="1.75"
android:fillColor="#00000000"
android:strokeColor="#3A3E41" >>>>>>>>>>>> "#FFFFFF"
android:strokeLineCap="round"/>
</vector>
// override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
...
binding.regionButton.setOnClickListener {
showCitiesPopup(it)
}
...
뷰바인딩을 이용해서 도시 리스트를 팝업하는 함수와 연결했다.
강의를 따라할때는 간단하니까 이해했다고 생각했는데 막상 혼자 해보려니 떠올리지를 못해서 비슷한 다른 프래그먼트파일을 비교해서 차이를 찾아야했다.
두 개의 프래그먼트에 조금만 다른 함수 두개를 쓰고 있는데 이걸 어떻게 잘 관리해볼 방법이 없을까?