Skip to content

折叠屏适配

字数统计:约 10000 字
难度等级:⭐⭐⭐⭐
面试重要度:⭐⭐⭐


目录

  1. 折叠屏简介
  2. 检测与适配
  3. 响应式布局
  4. 跨屏连续性
  5. 面试考点

1. 折叠屏简介

1.1 设备特性

折叠屏特点:
- 双屏幕/可折叠屏幕
- 展开/折叠状态
- 跨屏内容传输
- 特殊手势

1.2 适配挑战

挑战:
- 多屏幕尺寸
- 动态布局变化
- 跨屏连续性
- 性能优化

2. 检测与适配

2.1 检测折叠状态

kotlin
fun isFoldable(context: Context): Boolean {
    return context.packageManager.hasSystemFeature(
        PackageManager.FEATURE_HARDWARE_TYPE_FOLDABLE
    )
}

fun getFoldState(context: Context): Int {
    return when (context.display.foldState) {
        Display.FOLD_STATE_OPENED -> FOLD_STATE_OPENED
        Display.FOLD_STATE_CLOSED -> FOLD_STATE_CLOSED
        else -> FOLD_STATE_UNKNOWN
    }
}

2.2 监听折叠变化

kotlin
class FoldableActivity : AppCompatActivity() {
    
    private val foldListener = Consumer<Display> { display ->
        when (display.foldState) {
            FOLD_STATE_OPENED -> {
                // 展开 - 使用双栏布局
            }
            FOLD_STATE_CLOSED -> {
                // 折叠 - 使用单栏布局
            }
        }
    }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        display.addOnFoldChangeListener(foldListener)
    }
}

3. 响应式布局

3.1 使用 ConstraintLayout

xml
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 小屏幕 -->
    <fragment
        android:id="@+id/listFragment"
        android:name="com.example.ListFragment"
        app:layout_constraintWidth_percent="1" />

    <!-- 大屏幕 -->
    <fragment
        android:id="@+id/detailFragment"
        android:name="com.example.DetailFragment"
        app:layout_constraintWidth_percent="0.5" />

</androidx.constraintlayout.widget.ConstraintLayout>

3.2 使用 Compose

kotlin
@Composable
fun ResponsiveLayout() {
    val foldState = rememberFoldState()
    
    if (foldState == FOLD_STATE_OPENED) {
        Row {
            ListPane()
            DetailPane()
        }
    } else {
        NavigationHost()
    }
}

4. 跨屏连续性

4.1 状态保存

kotlin
class ContinuityManager {
    
    fun saveState() {
        // 保存当前状态
        // 列表位置、选中项
    }
    
    fun restoreState() {
        // 恢复状态
    }
}

4.2 内容传输

kotlin
// 使用 SharedElement
override fun onDestroyView() {
    super.onDestroyView()
    // 传输内容到另一屏幕
}

5. 面试考点

Q1: 折叠屏适配要点?

  • 检测折叠状态
  • 响应式布局
  • 跨屏连续性

Q2: 如何实现响应式?

  • ConstraintLayout
  • Compose
  • 备用布局

本文完