Chromebook의 화면 크기 호환성

Chrome OS에서 Android 앱을 구현하면 기본적으로 멀티 윈도우가 지원됩니다. Android는 자동으로 전체 화면에 표시하는 대신 Chrome OS의 앱을 폼 팩터에 적합한 레이아웃으로 렌더링합니다.

작업 및 창 크기 조절

활동의 창 크기가 변경될 수 있으므로 활동은 시작 시 활동의 해상도를 읽어야 합니다. 활동은 onConfigurationChanged(..)를 호출하여 해상도 변경에 반응해야 합니다. 예를 들어 최대화할 때 사용자의 작업이 손실되지 않도록 하려면 다음 중 하나를 실행하세요.

  • 활동의 manifest에 android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout"을 추가하여 구성 변경사항을 동적으로 처리합니다.
  • 전환 과정을 최대한 단순하게 하려면 onSaveInstanceState를 사용하여 이전 상태를 복원합니다. 이 설정은 다시 시작 요청이 유일한 옵션인 경우에 적용됩니다.

현재 구성을 찾을 때 getResources().getConfiguration()에서 항상 현재 활동의 구성을 사용하세요. 백그라운드 활동 또는 시스템 리소스의 구성을 사용하지 마세요. 백그라운드 활동에는 크기가 없으며 시스템 구성에 크기와 방향이 충돌하는 여러 창이 포함되어 있어서 사용 가능한 데이터를 추출하지 못할 수 있습니다.

또 다른 중요한 고려사항은 창 콘텐츠 경계가 변경될 수 있다는 점입니다. 예를 들어 창이 너무 커서 화면에 맞지 않으면 앱에서 사용되는 창 내의 영역이 변경될 수 있습니다. 다음 가이드라인을 고려하세요.

  • Android의 레이아웃 프로세스를 활용하는 앱은 사용 가능한 공간에 자동으로 배치되어야 합니다.
  • 네이티브 앱은 액세스할 수 없는 UI 요소가 발생하지 않도록 사용 가능한 영역을 읽고 크기 변경을 모니터링해야 합니다. 이 표면에 사용 가능한 최초 크기를 확인하려면 다음 메서드를 호출하세요.
    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()
    관찰자를 통해 지속적으로 모니터링할 수 있습니다.
    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • 다음에 리스너 추가: view.addOnLayoutChangeListener(findViewById(android.R.id.content))
    앱이 아트워크의 크기를 사전 조정하는 경우 해상도가 변경될 때마다 이 작업을 실행해야 합니다.

시스템에서 자유롭게 크기를 조절하도록 지원하지만 모든 앱이 크기 조절을 염두에 두고 개발된 것은 아닙니다. 다음은 찾아야 할 잠재적인 문제입니다.

  • 크기 조절을 원활하게 처리합니다. 어떤 이유로든 언제든지 크기를 조절할 수 있습니다. 따라서 다시 시작해야 하는 경우 onSaveInstanceState를 통해 가능한 한 원활하게 상태를 저장하고 복원할 수 있어야 합니다. 이는 일반적으로 Android에도 유용합니다.
  • 또한 이전에 할당한 개체를 캐싱하여 활동이 빠르게 다시 시작되도록 합니다. 프레임워크 레이아웃 메커니즘을 사용하지 않아서 앱에서 OpenGL을 사용하고 콘텐츠를 확장하거나 다른 로직이 나타나는 경우 활동이 다시 시작되지 않도록 하려면 onConfigurationChanged 이벤트를 수신 대기해야 합니다. 동적으로 처리할 수 있는 모든 변경 이벤트를 지정해야 합니다.
  • 크기를 조절하지 않으려면 이에 맞게 manifest 파일에 지정해야 합니다.
  • 창 크기는 화면 크기가 아니며 화면 크기가 필요하지 않을 수도 있습니다. 창 크기를 가져오려면 DP에서 Activity.getResources().getConfiguration().screenWidthActivity.getResources().getConfiguration().screenHeight를 사용해야 합니다.

현재 구성을 가져오려면 항상 활동의 리소스를 사용하고 이 리소스에서 구성을 가져오세요. 그러지 않으면 화면 속성과 같은 '특정 항목'이 표시될 수 있기 때문입니다.

화면 위치도 변경될 수 있습니다. 따라서 항상 시스템을 사용하여 창과 화면 사이의 공간을 계산하거나 그 반대로 실행해야 합니다.

Android의 뷰 시스템을 사용하는 경우 창이 크기 변경에 따라 자동으로 배치되어야 합니다.

뷰 시스템을 사용하지 않고 표면 제어권을 받는 경우 앱이 자체적으로 크기 변경을 처리해야 합니다.

최초 크기를 가져오려면 네이티브 앱이 mLastContent 멤버를 사용하거나 콘텐츠 뷰를 가져와야 합니다.

앱이 실행된 후 onContentRectChangedNative 또는 onGlobalLayout 이벤트를 수신 대기하여 크기 변경에 반응해야 합니다.

크기가 변경되면 앱이 레이아웃 및 아트워크를 재확장하거나 새로고침하고 입력 영역을 업데이트해야 합니다.

레이아웃

화면을 추가 정보로 채우려면 여러 레이아웃을 지정하거나 요청된 크기에 맞게 동적으로 레이아웃을 작성합니다. 동적 생성은 일반적으로 권장되지 않지만 때때로 가능할 수도 있습니다.

레이아웃 시스템을 사용하지 않는 앱은 득보다 실이 많을 수 있기 때문에 구성 변경을 위해 다시 시작되지 않도록 해야 합니다. 이러한 변경은 창 크기 변경과 같은 명확한 이유만이 아니라 기기 모드 전환과 같은 명확하지 않은 이유로도 발생할 수 있습니다. 예를 들어 노트북에서 태블릿으로 변경하면 물리적 키보드가 없어진 변경사항이 보고됩니다. 사용자가 기다리거나 예기치 않게 작업이 손실될 수 있으므로 다시 시작하는 것은 좋지 않습니다.

코드가 동적 크기 조절 작업으로 인해 사라진 UI 요소에 액세스하려고 시도하지 않도록 합니다.

뷰 계층 구조 변경 모니터링

창 컨트롤 자막을 추가하면 몇 가지 문제가 발생할 수 있습니다. 다음 권장사항을 고려하세요.

  • 콘텐츠가 창의 (0,0)에서 시작하지 않을 수 있습니다. 창 콘텐츠가 자막의 높이만큼 오프셋될 수 있습니다. 올바른 오프셋을 얻으려면 View.getLocationInWindow()를 사용하여 뷰의 화면 위치를 확인하세요.
  • DecorViewcontentView의 소유자가 아닐 수도 있습니다. 자막은 창 계층 구조의 일부이며, 존재하는 경우 DecorView와 콘텐츠 뷰 사이에 있습니다. 따라서 다음을 준수하세요.
    • DecorView 바로 아래의 뷰 계층 구조를 변경하지 마세요.
    • DecorView의 하위 요소가 LinearLayout 유형이라고 가정하지 마세요.
  • Configuration.screenHeightDp가 앱 콘텐츠 영역의 높이라고 가정하지 마세요. 자막 뷰가 존재하는 경우 자막 뷰가 이 높이의 일부를 차지합니다. Display.getSize() 등도 마찬가지입니다.

기타 고려사항

그 외에 고려해야 할 사항은 다음과 같습니다.

  • 활동을 항상 전체 화면으로 실행하려면 android:resizeableActivity="false" 플래그를 manifest에 추가하세요.
  • 최종 사용자에게 사용 가능한 모든 레이아웃 간에 전환할 수 있는 창 컨트롤이 표시됩니다. 올바른 방향 옵션을 선택하여 앱 실행 시 적절한 레이아웃이 표시되도록 보장할 수 있습니다. 세로 모드 및 가로 모드로 앱을 사용할 수 있는 경우 가능하면 기본값이 가로 모드로 설정됩니다. 이 옵션이 설정된 후 앱별로 저장됩니다.
  • 불필요한 방향 변경은 피하세요. 예를 들어 활동 방향이 세로 모드인데 앱이 런타임에 setRequestedOrientation(LANDSCAPE)를 호출하면 창 크기가 불필요하게 조절됩니다. 이에 따라 사용자가 불편을 느끼게 되고 앱이 처리할 수 없는 경우 다시 시작될 수 있습니다. 예를 들어 manifest에서 방향을 한 번만 설정하고 필요한 경우에만 변경하는 것이 좋습니다.
  • 활동의 onDestroy 메서드에서 finish()를 호출하지 마세요. 앱이 다시 시작되어야 한다고 가정하면 이 함수로 인해 크기 조절 시 앱이 닫히고 다시 시작되지 않습니다.
  • TYPE_KEYGUARDTYPE_APPLICATION_MEDIA와 같은 호환되지 않는 창 유형은 사용하지 마세요.

참고: 앱을 테스트하여 창 크기의 변경을 적절하게 처리하는지 확인하는 것이 좋습니다.