[코틀린] 안드로이드 스마트홈 프로젝트 1
1. 전체화면 만들기
시나리오가 아무래도 손에 들고서 보는게 아니라 고정된 기기를 현관에 서서 보는 것이기 때문에 화면을 최대한 키워줄 필요가 있었다. 이때 예전에 사용한 풀스크린을 만드는 코드를 복붙했더니 취소선이 뜬다...
관련자료를 찾아보았더니 api 30(안드로이드 R 또는 11)부터는 windowInsetsController를 통해 ui변경을 하라고 한다
그래서 공식문서를 보는데 난해하여 이해에 어려움을 겪고 있던 중 너무 감사하게도 코틀린을 통해 windowInsetsController로 full screen 구현한 코드 예제를 올려주신 분이 계셨다!!
위 블로그를 참고해서 예전 코드도 함께 정리해보고자 한다.
1.1 액션바 삭제하기
상태표시줄, 액션바, 상단바 여러가지 번역이 존재하지만 코드에서 actionbar라고 하니깐 액션바로 기억해야겠다..
supportActionBar?.hide()
이런식으로 작성해주면 그림처럼 사라지는걸 볼 수 있다.
1.2 현재 기기의 sdk버전 확인 및 분기
현재 기기의 sdk 리턴
Build.VERSION.SDK_INT
정수형으로 현재 기기의 sdk 버전을 리턴해준다.
Build.VERSION_CODES.R
안드로이드 R의 sdk버전을 리턴해준다.
이 두가지를 if문에서 비교하여 R의 sdk버전 보다 작은 경우 기존의 방식으로 진행하고 이외에 R과 같거나 높다면 새로운 방식으로 전체화면을 만들어주면 되겠다.
1.3 버전별 네비바, 상단바 숨기기
1.3.1 안드로이드 R 미만 (api 30미만)
window.decorView.systemUiVisibility = (
View.SYSTEM_UI_FLAG_IMMERSIVE
or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_FULLSCREEN)
두가지 숨기는데 뭐가 많은거 같지만 하나씩 보면
-
View.SYSTEM_UI_FLAG_IMMERSIVE
immersive 모드로 숨김을 설정한다. 전체화면을 만드는 종류는 다음과 같다.
lean back immersive sticky immersive 방식 유튜브 전체화면 일반적인 게임 전체화면
(아래로 쓸어내리기)일반적인 게임 전체화면
(아래로 쓸어내리기)투명도 불투명 불투명 투명 -
View.SYSTEM_UI_FLAG_LAYOUT_STABLE,
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN전체화면중에 상단바, 네비바 보이게 할 때 앱 레이아웃이 거기에 따라서 크기조정이 다시되는 현상을 방지한다.
-
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,
View.SYSTEM_UI_FLAG_FULLSCREEN네비바랑 상태바를 숨겨서 전체화면을 만들어준다.
이정도로 정리될 수 있겠다.
1.3.2 안드로이드 R 이상 (api 30이상)
window.setDecorFitsSystemWindows(false)
val ctrl = window.insetsController
if (ctrl != null) {
ctrl.hide(
WindowInsets.Type.statusBars() or
WindowInsets.Type.navigationBars()
)
ctrl.systemBarsBehavior =
WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
window.setDecorFitsSystemWindows(false)
인자로 false를 주면 앞서 api 30 미만의 경우의 코드에서 설정한 flag들을 무시하고 insetsController를 통해 레이아웃을 변경한다. 아마 아직은 api 30미만의 기기들이 많이 실사용되고 있는 만큼 30미만과 이상을 일시적으로 나눠놓기 위해 만들어놓은 거 같다. 아무설정을 안해주면 true가 기본값으로 들어간다.WindowInsets.Type.statusBars(),
명시적으로 상태바와 네비바를 지정할 수 있다. windowinsetsController에서 이를 사용해서 명시된 부분을 hide시킨다.
WindowInsets.Type.navigationBars()WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
전체화면상태에서 상태바를 어떤식으로 불러올건지 설정하는 변수이다. 이를 systembarsbehavior에 할당해서 앞서 api 30 미만의 immersive모드 등으로 설정이 가능하다. 너무 길어져서 공식페이지에서 확인하는게 좋을 것 같다.
이런식으로 전체화면 만들어주는 법에 대해 정리해보았다.
2. 날씨에 쓸 아이콘 팩 가져오기
인터넷에서 적당히 무료인 것을 확인 후 가져왔다. 로컬에서 나만 쓰는 거면 아무거나 상관 없겠지만 스토어에 올릴거까지 생각하고 제작중인 것이라 무료로 명시된 걸 쓰겠다.
3. recyclerview 만들기
recyclerview는 너무 자주쓰여서 쓰다보면 숙달되겠지만... 일단 간단하게 정리해보겠다.
먼저 어댑터를 만들어서 이어줘야한다. 그런데 어댑터 선언이 자동완성도 안되고 좀 복잡하다. 왠지 이건 단기간에 외워지지 않을 느낌...
class WholeStatusRVAdapter
(private val dataList: ArrayList<Status>) :
RecyclerView.Adapter<WholeStatusRVAdapter.viewHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int)
override fun onBindViewHolder
(holder: WholeStatusRVAdapter.viewHolder, position: Int)
override fun getItemCount(): Int
inner class viewHolder
(val binding: ItemWholeStatusBinding): RecyclerView.ViewHolder(binding.root)
}
전체적인 모양을 보자면 이런식으로 나오게 된다.
-
클래스 내용
먼저 클래스가 전달받는 dataList는 사용자마다 다르게 아무 인자나 필요한거 전달해주면 되겠다. 다음은 상속인데 제네릭타입의 viewholder를 상속받게 된다. 제네릭타입은 arrayList에서 여러형식의 배열을 만들어낼 수 있듯이 여러가지 형식이 될 수 있는 표준타입이라는 뜻으로 알고 있으면 되겠다. -
오버라이드함수들
- onCreateViewHolder
레이아웃을 만들어주고 그 레이아웃을 리턴한다. 이 때 레이아웃은 리사이클뷰의 리스트의 한 항목이다. 이 부분은 멀쩡하게 클래스 선언을 했다면 자동적으로 오버라이드가 되므로 조금 편할 수 있는 부분이다.
-onBindViewHolder
매번 스크롤할때마다 이부분이 호출된다. 스크롤 하면서 위의 항목이 아래로 이동할 때 이 항목에 새로운 데이터를 끼워넣어줘야하는데 이 함수가 그 역활을 한다.
-getItemCount
이 부분은 아직까지 건드릴 일이 없었다. 인터넷에서 찾아본 다른 예제들에서도 대부분 건드리지않은걸 보면 그냥 넘어가도 문제 없을 것 같다.
-
viewHolder
데이터를 갈아끼워주는 viewholder에 대한 내부 클래스이다. 이 클래스에 대한 객체가 onBindViewHolder에 holder로 들어가게 된다.
4. 레트로핏을 통한 api 연결
이제 공공데이터포털에서 제공하는 날씨예보 오픈api를 통해 사용자에게 브리핑 해 줄 날씨 정보를 가져와야한다.
포털에서 api사용권한을 얻는 방법은 이 블로그에 잘 정리되어있다.
예전에 post방식으로 api에 접근해서 id, pw를 검증하는 코드를 작성해본 적이 있었는데 이번에 사용할 공공데이터는 주소에 모든 데이터를 포함시켜서 넘겨준다. 네트워크 부분에 대한 공부가 미흡하여 이 부분에 대해서 좀 더 공부해볼 필요가 있겠다. 전체적인 코드 플로우는 다음과 같다.
mainActivity에서 weatherService 호출
-> weatherService에서 weatherRetrofitInterface의 api호출 함수 구체화하여 실행
일단 이렇게 구상하고 다음에 직접 구현하면서 다시 한번 정리해야겠다! 오늘은 여기까지...
Author And Source
이 문제에 관하여([코틀린] 안드로이드 스마트홈 프로젝트 1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jinwoo-div/코틀린-안드로이드-스마트홈-프로젝트-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)