Как управлять другим макетом в конфигурации, измененной в активности для складного устройства Android?

Создал демо для складных устройств. Когда устройство сложено, я хочу показать один макет, а когда устройство развернуто, мне нужно показать другой макет. Затем, как управлять двумя макетами в соответствии с измененной конфигурацией.?

override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        Log.i(myTag, "onConfigurationChanged...")
}

3 ответа

Вы можете установить обратные вызовы для получения состояний: CLOSED, HALF, OPEN.

private fun setFoldableCallbacks() {
        mainThreadExecutor = ContextCompat.getMainExecutor(this)
        windowManager = WindowManager(this, null)
        windowManager.registerDeviceStateChangeCallback(
            mainThreadExecutor,
            deviceStateChangeCallback
        )
        Handler(Looper.getMainLooper()).postDelayed({
            windowManager.registerLayoutChangeCallback(mainThreadExecutor, layoutChangeCallback)
        }, 1000)
    }

Вместо реализации onConfigurationChangedвы должны использовать Jetpack WindowManager, как описано в @user3471194. Но имейте в виду, что немного его APIизменился , поэтому с версией 1.0.0-alpha05Конструктор WindowManager может иметь только один параметр (действие). Также я рекомендую объявить configChanges активности в файле манифеста следующим образом

      <activity
        ...
        android:configChanges="screenLayout|screenSize|orientation|smallestScreenSize">
        ...
</activity>

С другой стороны, обратный вызов, который вы передаете registerLayoutChangeCallback метод больше не получает DeviceState объект, но WindowLayoutInfo вместо этого, который имеет FoldingFeature это может быть установлено как STATE_FLAT, STATE_FLIPPED, STATE_HALF_OPENED и т.д., или он будет нулевым, если устройство не складывается.

  if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
          setcontentview();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            setcontentview();
}

Посмотрите, работает ли это для вас.

Другие вопросы по тегам