반응형
문제 원인
개발을 하는 도중에 폴더블 폰에서 내부 화면과 외부 화면의 레이아웃이 다르게 표시되는 문제가 있었습니다.
그래서 폴더블 폰이 접히거나 펼쳐졌을 때 코드로 해당 레이아웃을 동적으로 고쳐주려고 했는데
어느 곳에서도 접힌 상태인지 펼친 상태인지 알 수 있게 제공 해주는 코드 정보를 찾을 수 없더라구요..
구글링을 오랫동안 하다 한 가지 방법을 찾아내었습니다.
바로 DisplayManager 와 ConfigurationChange 를 활용 하는 것 인데요
위 두가지 방법을 살펴보겠습니다.
DisplayManager 를 활용한 방법
폴더블 폰은 화면을 접게 되면 바깥 디스플레이에 앱(화면)을 표시하게 됩니다.
바깥 디스플레이에 표시될 때 이 때 view 는 다시 onResume() 을 타게 되는데
아래의 코드를 사용해서 display mode 가 1인지 2인지를 확인 하는 것 입니다.
display mode 1 은 메인 디스플레이를 뜻하고, mode 2 는 세컨드 디스플레이를 뜻 합니다.
mode 의 숫자 상태에 따라 접혔을 때, 아닐 때를 대응 하면 될 것 같네요
override fun onResume() {
checkFoldedDisplay()
}
fun checkFoldedDisplay() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P){
val dm = applicationContext.getSystemService(Context.DISPLAY_SERVICE) as? DisplayManager
dm?.displays?.forEach {
// mode: 1 펼친 상태
// mode: 2 접힌 상태
Clog.d("DisplayMode: ${it.mode}")
}
}
}
ComponentCallbacks 의 ConfigurationChange 를 활용한 방법
시스템에서 변경 사항이 일어 날때 마다
안드로이드에서는 ComponentCallBack 을 통해서 알려주게 되는데
폴더블 폰이 접혔을 때 발생하는 디스플레이 변경 이벤트도 예외는 아닙니다.
이를 활용해서 변경이 일어났을 때 display mode 를 확인하여 대응하는 것도 하나의 방법으로 활용 할 수 있습니다.
private fun addComponentCallBackListener() {
applicationContext?.registerComponentCallbacks(object : ComponentCallbacks
override fun onConfigurationChanged(newConfig: Configuration) {
checkFoldedDisplay()
}
override fun onLowMemory() {
}
})
}
이상으로 포스팅을 마치겠습니다.
감사합니다.
반응형
'Develop > Android' 카테고리의 다른 글
[Android] Device File Explorer - Is: /storage/emulated/: permission denied (0) | 2022.09.13 |
---|---|
[Android] ADB 환경변수 설정 For Mac (0) | 2020.09.06 |
[Android] SMS 자동으로 읽어오기 (0) | 2020.05.22 |
[Android] Doze Mode (0) | 2020.04.08 |
[Android] Night Mode 지원 방법 (0) | 2020.04.07 |