Как управлять другим макетом в конфигурации, измененной в активности для складного устройства 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();
}
Посмотрите, работает ли это для вас.