[내일배움캠프][TIL] 24.03.07 (목) - 최종 프로젝트 3주차 : 개발 8일차
1. 최종 프로젝트 3주차
어느덧 MVP를 완성해야 할 시간이 약 이틀밖에 남지 않았다.
이제는 필수적인 기능들은 거진 완성하고, 남은 시간 동안 버그는 없는지 검토해야 하는데 아직 필수적으로 구현하려 했던 기능 중 하나인 좋아요 기능은 쩔쩔매고 있고, 날씨 기능은 시작도 하지 못했다.
이러다 MVP도 다 구현하지 못하는 게 아닐까하는 불안감이 드는 와중, 개발 외적인 부분에 시간을 들여야 하는 순간이 왔다.
구글 플레이스토어 앱 등록하기
바로 구글 플레이스토어에 우리가 만든 앱을 등록하는 절차를 진행해야 한다.
특히나 최근 들어서 구글 앱 심사가 꽤나 까다로워져서 사전에 적어야할 것들이 꽤나 많았다.
아래는 최근에 새로 바뀐 테스트 요구사항이다.
새로운 개인 개발자 계정의 앱 테스트 요구사항 - Play Console 고객센터 (google.com)
막 이것저것 적으라는 것들을 적고, 수정해야 하는 부분들을 다 수정하고 다 끝내고 보니 6시간이 지나갔다.
어이쿠. 확실히 뭔가가 굉장히 복잡했다.
산 리스트 Fragment에서 산을 클릭하면 DetailActivity로 이동
이렇게 테스트 절차를 끝낸 다음에 다시 개발에 착수했다.
마침, 오늘 드디어 산 리스트 Fragment가 완성되어서 이제 직접 연결시키는 작업을 하였다.
메커니즘은 다음과 같다.
- 산 리스트 Fragment에서 산을 클릭하면, 산 리스트 Fragment에 있는 정보 중에서 산 이름을 골라서 Intent 형식으로 DetailActivity에 전달한다.
binding.ivSelectedImage.setOnClickListener { Log.d(TAG,"Selected Image $sanName") val intent = Intent(requireActivity(), SanDetailActivity::class.java) if (sanName == null) { intent.putExtra("name","계룡산") } else { intent.putExtra("name", sanName) } startActivity(intent) }
- DetailActivity에서 이 Intent를 받는다.
val sanName = intent.getStringExtra("name") ?: ""
- 이 Intent로 이제 각 산의 데이터를 구별해서 받으면 된다.
firestore.collection("sanlist") .get() .addOnSuccessListener { documents -> for (document in documents) { if (document["name"] == sanName) { val sanlist = SanDetailUiState( document.getString("name") ?: "none", document.getString("address") ?: "none", document.getLong("difficulty") ?: 0, document.getDouble("height") ?: 0.0, document.getLong("time_uphill") ?: 0, document.getLong("time_downhill") ?: 0, document.getString("summary") ?: "none", document.getString("recommend") ?: "none", document.getBoolean("isLiked") ?: false )
다음은 이 결과다.
각 산마다 다른 데이터를 보여주고 있는 것이 아주 잘 되고 있다.
이제 거의 다 왔구나!
그런데 사실 이걸 구현하면서 한 가지 문제점이 있었다.
현재 저 Intent는 onCreate()에 선언되어 있다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_binding = ActivitySanDetailBinding.inflate(layoutInflater)
setContentView(binding.root)
val sanName = intent.getStringExtra("name") ?: ""
Log.d(TAG, "산이름 : ${sanName}")
initData()
initImage()
initBackButton()
}
그런데 이렇게 onCreate에 선언을 하니 막상 private fun으로 작성된 다른 함수에서는 인식을 하지 못하는 문제가 생겨서 저 Intent 선언을 각각 따로 해야 써지더라.
그러다보니 불필요하게 코드를 쓰는 것이 아닌가하는 생각이 들었지만, 이렇게 적은 데에는 다 이유가 있다.
처음에는 onCreate 바깥에
private val sanName = intent.getStringExtra("name") ?: ""
이렇게 먼저 선언을 하고나서 실행해봤는데 바로 앱이 강제종료 되었다.
알고보니 sanName이 null값을 받더라.
왜 이런 현상이 일어나는지, 그리고 이걸 어떻게 고쳐야하는지 여러 시간을 들였지만, 결국 채택한 방법이 바로 저것이다.
아직 좋아요 기능과 날씨 기능은 완성되지 못했지만, 적어도 산 리스트를 클릭했는데 아무것도 안 뜨거나 앱이 강제종료되는 불상사는 막았으니 그래도 앱의 구실은 하고 있잖아? 하하하하