본문 바로가기

안드로이드/androidstudio

[Android] device 디스플레이 환경설정 크기 변경에 영향 안받기

 안녕하세요. 이번 포스팅에서는 환경설정을 통한 기기 자체의 디스플레이 크기 변경에 app이 영향 안받도록 하는 코드를 포스팅하겠습니다.

  기기 환경설정 -> 디스플레이 -> 화면 크게/작게  로 이동시 다음과 같은 화면에서 기기의 앱들의 사이즈를 변동할수있습니다.

 저희는 앱을 만들시 디자인에 맞춰 각 view, layout, drawble 리소스 등을 크기를 저희가 원하는 값으로 설정하여 사용합니다. 근데 위 설정값을 변경할 경우 그 영향을 받아 비율이 변경되게 됩니다. 

 그 이유는 안드로이드는 dp(dpi) 로서 dpi 값별 픽셀의 수가 달라지기 때문입니다.

 override fun attachBaseContext(baseContext: Context) {
        val newContext: Context
        val displayMetrics: DisplayMetrics = baseContext.resources.displayMetrics
        val configuration: Configuration = baseContext.resources.configuration
        if (displayMetrics.densityDpi != DisplayMetrics.DENSITY_DEVICE_STABLE) {
            // 휴대폰 설정값과 app 에서의 값이 다를경우 app 값으로
            configuration.densityDpi = DisplayMetrics.DENSITY_DEVICE_STABLE
            newContext = baseContext.createConfigurationContext(configuration)
        } else {
            // layout 과 장치 화면 설정 비율(밀도)동일 시
            newContext = baseContext
        }
        super.attachBaseContext(newContext)
    }

 우선 결론부터 말씀드리면 해당 코드를 크기를 고정시킬 activity에 추가하시면 됩니다.

 만약 app 전체에 영향을 안받게 하고싶으실 경우 각 activity를 생성할때 base 로 삼은 BaseActivity가 있다면 여기에만 추가하시면 됩니다.

 위 코드를 간략히 설명드리면 각 activity에는 context가 있는데 이 context가 생성될때 휴대폰 dpi값과 기본 stable density 값이 다를 경우 stable 값을 가진 context 로 변경시키는 것입니

 위 코드를 이해하시기 위해 참고할 개념은 크게 context부분과 displayMetrix, 그리고 displayMetrix의 densityDpi 입니다.

1.density: 위에 설명드린 dpi와 같은 개념으로 밀도 값 입니다.

2. displayMatrix 는 크기, 밀도, 글꼴 등 디스플레이에 대한 일반 정보를 설명,제공해줍니다.

3.attachBaseContext: 기본 컨텍스트를 설정하는 것으로 어플리케이션 리소스 및 시작활동 등 애플리케이션 수준 작업을 위한 기본으로 이러한 context를 기본 생성한 메소드입니다.

 

 기기 환경설정에 영향을 안받게하는 방법은 다양하게 있겠지만 이러한 방식을 통해 크기 조정을 막을수있습니다.