<정리> 메모 앱 만들기 4일차
오늘도 다른 공부하느라 딱 한 가지 기능만 추가했다.
그 외에는 주석 달기와 코드 구조 정리를 했다.
1. 액션바 흐름 완성
어제까지 해서 이제 액션바에서 내가 원하던 기능의 95퍼센트까지는 완성했다.
나머지를 채우기 위해서 오늘 한 것은 카테고리 목록이 열려있는 상태일 때 액션바의 모든 부분이 카테고리 목록을 닫는 걸 우선시하는 거였다.(이거 해도 남은 게 하나 있기는 하다.)
그걸 위해서 먼저 다른 기능들을 하는 옵션 메뉴들을 제어할 필요가 있었다.
그래서 onOptionsItemSelected에 가서 각 버튼마다 카테고리 목록이 보일 때 그걸 먼저 닫도록 했다.
전에 만들어둔 setCategoryMenu() 잘 쓰고 있다...가 아니라 너무 같은 조건이 반복되는게 보기가 좋지 않았다.
어떻게 할까 하다가 '버튼이 클릭되고 무슨 버튼인지 확인한 다음이 아니라 그냥 버튼이 클릭된 순간에 카테고리 목록이 보이는지 확인하고 닫으면 되지 않을까?'라는 생각이 들었고 성공적이었다.
// 액션바 메뉴 선택시 호출
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// 가장 우선시되는 예외처리
if (linearLayoutCategorySelect.isVisible) {
setCategoryMenu()
return super.onOptionsItemSelected(item)
}
when (item.itemId) {
// 홈 버튼(내비게이션 드로어 버튼 or 검색창 뒤로가기 버튼)
android.R.id.home -> {
if (isClicked) {
checkSearchClick(false, R.drawable.ic_menu)
} else {
drawerLayout.openDrawer(GravityCompat.START)
}
}
// 검색 버튼
R.id.btn_search -> {
checkSearchClick(true, R.drawable.ic_btn_back)
}
// BottomSheet 버튼
R.id.btn_more -> {
val bottomSheet = BottomSheet()
bottomSheet.show(supportFragmentManager, bottomSheet.tag)
}
}
return super.onOptionsItemSelected(item)
}
여기만 해서 될 줄 알았지만 아직 남아있는 부분이 있었다.
그건 바로 액션바의 빈 공간...!!
이 공간을 어떻게 처리하나 했지만 간단하게 해결되었다.
이전에 Toolbar 레이아웃을 변수로 선언해놨었는데 거기에다 setOnClickListenr를 붙이고 위에서 썼던 조건문을 그대로 쓰니까 빈 공간에 대해서도 동일한 작업을 해주더라!
toolbar.setOnClickListener {
if (linearLayoutCategorySelect.isVisible) setCategoryMenu()
}
2. 주석 추가
다른 곳보다는 메인 액티비티를 중점적으로 주석을 추가했다.
최근에 공부하면서 조금은 나누는 거에 익숙해지고 있지 않나싶다.
좀 가독성 좋게 주석을 달고 싶은데 뭔가 별로다... 특히 if문에서
주석 추가한 부분 중의 한 부분이다.
// 초기 세팅
private fun initView() {
// 1. 상태바 설정
window.apply {
// 상태바의 아이콘과 배경색 변경
statusBarColor = Color.WHITE
WindowInsetsControllerCompat(this, this.decorView).isAppearanceLightStatusBars = true
}
// 2. 액션바 설정
// 액션바에 Toolbar 세팅
setSupportActionBar(toolbar)
supportActionBar?.setDisplayShowTitleEnabled(false)
// 액션바에 뒤로가기 버튼을 네비게이션 메뉴를 위한 이미지로 변경
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_menu)
// 3. 뒤로가기 버튼 설정
// 콜백 함수 추가
this.onBackPressedDispatcher.addCallback(this, callback)
// 4. 네비게이션 드로어 설정
// 사용자 슬라이드 액션 막기
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN)
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
// 5. 카테고리 선택 설정
setShowCategoryListOnClickListener()
setCategoryButtonOnClickListener()
}
3. 코드 구조 정리
역시 메인 액티비티에서 진행된 부분인데 묶을 거는 묶고 뺄거는 빼면서 진행했다.
먼저 카테고리 버튼을 리스트로 묶었다.
이건 이후 클릭리스너를 세팅할 때 간단하게 하기 위함이면서 이후 확장성을 고려한 부분이었다.
// 카테고리 버튼 리스트
private val btnCategorys
get() = listOf(
btnCategoryAll,
btnCategoryFavorite
)
다음은 카테고리 버튼 클릭 리스너를 전에는 매개변수를 받아서 세팅을 했는데 이제는 위에서 묶은 리스트가 있기에 파라미터 없이 함수를 구현했다.
// 카테고리 버튼을 클릭했을 때
private fun setCategoryButtonOnClickListener() {
btnCategorys.forEach { btn ->
btn.setOnClickListener {
if (tvCategoryName.text != btn.text) {
tvCategoryName.text = btn.text.toString()
}
setCategoryMenu()
}
}
}
마찬가지로 카테고리 리스트(레이아웃)를 볼 수 있게 하는 클릭 리스너 함수도 파라미터를 없애고 간단하게 처리했다.
전에는 버튼과 레이아웃에 다 함수를 사용했지만 생각해보면 버튼이 레이아웃 안에 있고 나는 레이아웃의 범위 안으로 클릭이 되기만 하면 이벤트가 발생하도록 하고 싶기 때문에 레이아웃에만 함수를 적용했다.
// 카테고리를 목록을 보기 위해 레이아웃을 클릭했을 때
private fun setShowCategoryListOnClickListener() {
linearLayoutToolbarTitle.setOnClickListener {
setCategoryMenu()
}
toolbar.setOnClickListener {
if (linearLayoutCategorySelect.isVisible) setCategoryMenu()
}
}
툴바의 클릭 리스너는 카테고리 리스트를 닫기 위한 용도다.(위에서 말한 빈공간 처리...)
오늘은 생각보다 기능 구현보다 정리하고 주석을 다는게 시간이 조금 더 걸린 거 같다.
그래도 또 하나 해냈다는 생각이 든다.
이 다음에는 Floating 버튼과 리사이클러뷰(or 리스트뷰)를 만지게 될 거 같은데 이것도 잘 모르는 영역이라 기대된다.
<결과화면>