728x90
반응형

간단한 안드로이드 앱 만들기 (날씨 앱) 18

16. SearchActivity '현 위치' item 추가, MainActivity 카메라 갱신

SearchActivity에 현 위치 정보에 대한 아이템을 추가MainActivity가 재사용될 때 맵 카메라도 위치정보에 맞게 갱신SearchActivityaddCurLoccationKey(): 현 위치(키값) 정보를 리스트에 추가override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_search) ... cityList = CityDataProvider.cityList addCurLocationKey() ...}private fun addCurLocationKey(){ this.lifecycleScope...

15. 액티비티 재사용 추가(검색 >> 메인)

검색 액티비티에서 도시 카드아이템 클릭하면 해당 도시에 대한 날씨 정보를 표시하려고 한다 CityWeatherAdapter어댑터에 아이템 클릭 이벤트 등록class CityWeatherAdapter (private var cityList: List, private val onItemClick: (CityWeatherInfo) -> Unit) : //클릭 이벤트 전달 RecyclerView.Adapter() { inner class CityViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { ... init { itemView.setOnClick..

13. 날씨 데이터 리스트화

여러 도시의 날씨 정보 표시를 위해 날씨 데이터를 리스트화했다 WeatherRepository날씨 API 응답을 리스트화class WeatherRepository { private val _nowcastDataMap = mutableMapOf>() // 다중 실황 데이터 val nowcastDataMap: Map> get() = _nowcastDataMap private val _forecastDataMap = mutableMapOf>() // 다중 예보 데이터 val forecastDataMap: Map> get() = _forecastDataMap suspend fun fetchNowcastData(serviceKey: String, cityKey: String, nx: I..

14. 옵저버 오남용 수정

이전까지의 코드에서 API 호출된 응답(Response)에 옵저버를 붙여서 날씨 데이터를 업데이트했고 날씨 데이터에 옵저버를 붙여서 UI 업데이트가 되도록 만들었다. LiveData(날씨 Response)를 다른 LiveData(날씨 Data)가 관찰하고, LiveData(날씨 Data) 를 UI 업데이트를 위해 관찰하는 구조에서 오류가 많았다이 부분을 끊고자 많은 부분을 학습하고 수정했다요점은 아래와 같다API 호출에 대한 응답은 옵저버를 붙이지 않는다날씨 데이터값을 LiveData로써 업데이트는 유지액티비티에서 날씨 데이터에 옵저버를 붙이도록 한다변경된 주요 클래스 RepositoryAPI 응답값을 LiveData로 캐싱하던 부분을 삭제했다class WeatherRepository { priva..

12. 검색 액티비티에 카드 레이아웃 추가

레이아웃 추가검색 기능을 추가하기 전에 몇 개의 노출시킬 카드 아이템을 만들려고 한다아이템 내용은 임시로 하드코딩하려고 한다 아이템 레이아웃 생성 (item_city_card.xml)  아이템을 담을 리사이클러뷰 추가 (activity_main.xml) 데이터 클래스 생성 (CityWeatherInfo)package com.example.weatherapp.ui.modeldata class CityWeatherInfo ( val cityName: String, // 도시 이름 val weatherIconResId: Int, // 날씨 아이콘 리소스 ID val tempera..

11. 도시 검색 버튼 추가

개발항목도시 검색 버튼 추가검색 액티비티로 이동먼저 검색 버튼에 사용할 이미지를 flaticon에서 다운로드하였다 무료 아이콘 및 스티커 - 수백만 종의 다운로드가 가능한 리소스여러분의 프로젝트를 위한 무료 아이콘 및 스티커를 다운로드하세요. 디자이너에 의한, 디자이너를 위한 PNG, SVG, EPS, PSD 및 CSS 형식의 이미지www.flaticon.com버튼 추가 (activity_main.xml)액티비티 추가, 버튼 클릭 시 액티비티 이동 빈 액티비티 추가 (SearchActivity)package com.example.weatherappimport android.os.Bundleimport androidx.appcompat.app.AppCompatActivityclass SearchActivi..

10. 지도 위에 날씨 이미지 표시하기 (카카오맵 라벨 생성)

카카오맵의 라벨 기능을 이용해 맵 위에 현재 날씨 아이콘을 띄우도록 하려고 한다먼저 Map 매니저 클래스에서 UI 담당 클래스를 분리작업을 했다 MapViewMager > MapController 변경Map의 초기화 및 라이프사이클 관리, 카메라 이동 기능만을 담당하도록 코드를 수정하였다package com.example.weatherapp.mapimport .../*** * 맵의 초기화, 라이프사이클 관리, 카메라 이동 */class MapController( private val activity: AppCompatActivity, private val mapView: MapView,) { private var kakaoMap: KakaoMap? = null fun init(onM..

9. 지도 나타내기 (카카오맵 API)

날씨앱에 지도를 나타내고 그 위에 날씨를 표현할 수 있도록 구상을 수정했다카카오맵 API 발급https://apis.map.kakao.com/android_v2/ 추가된 애플리케이션을 누르면 대시보드로 진입할 수 있다.앱 키 카테고리에 가면 API 키 확인이 가능하다 카카오맵 API 활성화안드로이드 플랫폼 등록 앱에 등록된 패키지 명(AndroidManifest.xml) 확인 플랫폼 등록 올바른 패키지명과 해시 키 값을 입력해야 한다 해시 키 확인하기 Kakao Developers카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.developers.kakao.com 캐 해시 값은 로그를 찍어서 확인할 수 있다Log...

8. 날씨 아이콘 바꾸기

먼저 날씨 정보를 표시하기 위해 사용할 수 있는 데이터에 대해 정리해보려고 한다. 초단기실황(getUltraSrtNcst)실시간 날씨 데이터 (매 시간마다 업데이트)항목 코드(category)설명단위T1H기온°CRN11시간 강수량mmUUU동서바람성분m/sVVV남북바람성분m/sREH습도%PTY강수 형태코드(0~4)VEC풍향°WSD풍속m/s 초단기예보(getUltraSrtFcst)단기 예보 데이터(30분 간격 업데이트, 향후 6시간 치 데이터)항목 코드(category)설명단위T1H기온°CRN11시간 강수량mmSKY하늘 상태코드(1~4)UUU동서바람성분m/sVVV남북바람성분m/sREH습도%PTY강수 형태코드(0~4)LGT낙뢰kA(킬로암페어)VEC풍향°WSD풍속m/s날씨아이콘 표시를 위해 활용할 수 있는 정보..

7. UI 업데이트 기능 분리 및 날씨 계산 유틸 분리 (중간정리)

LocationManagerLocationManager의 기능을 분리하여 모듈성을 개선하려고 한다.class LocationManager(private val activity: AppCompatActivity, private val textView: TextView) { private val fusedLocationClient = LocationServices.getFusedLocationProviderClient(activity) //FusedLocationProviderClient: 위치 서비스 초기화 //위치 권한 확인 fun checkLocationPermission(): Boolean { return ActivityCompat.checkSelfPermission( ..

728x90
반응형