You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

折叠屏手机竖屏模式下ListDetailPaneScaffold无法显示列表详情视图

折叠屏竖屏模式下无法显示列表-详情视图问题

期望折叠屏手机在竖屏模式下显示列表-详情视图,但当前仅显示列表(与普通手机一致),仅横屏模式可正常呈现列表详情。

ListDetailPaneScaffold实现代码

setContent {
    val uiState by viewModel.uiState.collectAsStateWithLifecycle()
    AppMaterial3Theme {
        var selectedItem: SettingDetailsScreen by rememberSaveable {
            mutableStateOf(SettingDetailsScreen.AccountDetails)
        }
        val navigator = rememberListDetailPaneScaffoldNavigator()
        ListDetailPaneScaffold(
            scaffoldState = navigator.scaffoldState,
            listPane = {
                BackHandler {
                    if (paneAdaptedValue == PaneAdaptedValue.Hidden) {
                        navigator.navigateBack()
                    } else {
                        finish()
                    }
                }
                SettingsEntryPointsScreen(
                    uiState = uiState
                ) { item ->
                    selectedItem = item.detailScreen
                    navigator.navigateTo(ListDetailPaneScaffoldRole.Detail)
                }
            },
            detailPane = {
                if (uiState is SettingsEntryPointUiState.SettingsDetails) {
                    SettingDetailContent { container ->
                        updateDetailFragment(
                            selectedItem,
                            container
                        )
                    }
                }
            }
        )
    }
}

参考资源

  • 参考Jetpack Compose官方列表-详情布局文档
  • 预期效果参考三星设置应用竖屏列表-详情视图:
    三星设置应用竖屏列表-详情视图

解决方案

问题根源在于ListDetailPaneScaffold默认适配逻辑基于屏幕宽度阈值,折叠屏竖屏宽度通常处于Medium区间,默认仅显示单Pane(列表)。需自定义适配策略,强制折叠屏竖屏时显示双Pane。

步骤1:引入WindowSizeClass依赖(若未添加)

确保项目中已引入相关依赖:

implementation "androidx.compose.material3:material3-window-size-class:1.2.0"

步骤2:基于屏幕尺寸自定义适配逻辑

在Activity中获取WindowSizeClass,传入ListDetailPaneScaffold的adaptation参数,修改适配规则:

// 在Activity中获取WindowSizeClass
val windowSizeClass = calculateWindowSizeClass(this)

setContent {
    val uiState by viewModel.uiState.collectAsStateWithLifecycle()
    AppMaterial3Theme {
        var selectedItem: SettingDetailsScreen by rememberSaveable {
            mutableStateOf(SettingDetailsScreen.AccountDetails)
        }
        val navigator = rememberListDetailPaneScaffoldNavigator()
        ListDetailPaneScaffold(
            scaffoldState = navigator.scaffoldState,
            // 自定义适配:Medium及以上尺寸(含折叠屏竖屏)显示双Pane
            adaptation = { _ ->
                when (windowSizeClass.widthSizeClass) {
                    WindowWidthSizeClass.Compact -> ListDetailPaneAdaptation.ListOnly
                    WindowWidthSizeClass.Medium, WindowWidthSizeClass.Expanded -> ListDetailPaneAdaptation.TwoPane
                }
            },
            listPane = {
                BackHandler {
                    if (paneAdaptedValue == PaneAdaptedValue.Hidden) {
                        navigator.navigateBack()
                    } else {
                        finish()
                    }
                }
                SettingsEntryPointsScreen(
                    uiState = uiState
                ) { item ->
                    selectedItem = item.detailScreen
                    navigator.navigateTo(ListDetailPaneScaffoldRole.Detail)
                }
            },
            detailPane = {
                if (uiState is SettingsEntryPointUiState.SettingsDetails) {
                    SettingDetailContent { container ->
                        updateDetailFragment(
                            selectedItem,
                            container
                        )
                    }
                }
            }
        )
    }
}

步骤3:(可选)基于折叠屏特性精准判断

若需仅针对折叠屏设备适配,可通过DisplayFeature判断竖屏折叠状态:

setContent {
    val displayFeatures = rememberDisplayFeatures()
    // 判断是否为竖屏折叠设备
    val isVerticalFoldable = displayFeatures.any { 
        it is FoldFeature && it.orientation == FoldFeatureOrientation.Vertical 
    }
    
    val uiState by viewModel.uiState.collectAsStateWithLifecycle()
    AppMaterial3Theme {
        var selectedItem: SettingDetailsScreen by rememberSaveable {
            mutableStateOf(SettingDetailsScreen.AccountDetails)
        }
        val navigator = rememberListDetailPaneScaffoldNavigator()
        ListDetailPaneScaffold(
            scaffoldState = navigator.scaffoldState,
            adaptation = { _ ->
                if (isVerticalFoldable) ListDetailPaneAdaptation.TwoPane 
                else ListDetailPaneAdaptation.ListOnly
            },
            // 其他参数保持不变
        )
    }
}

原理说明

默认ListDetailPaneScaffold的适配规则:

  • Compact(<600dp):仅显示列表
  • Medium(600-840dp):列表与详情切换显示
  • Expanded(>840dp):双Pane显示

折叠屏竖屏宽度通常落在Medium区间,因此默认仅显示列表。通过自定义adaptation,强制Medium及以上尺寸或折叠屏设备显示双Pane,即可实现竖屏模式下的列表-详情视图。

内容的提问来源于stack exchange,提问作者Rax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:45:35