View 体系
View 体系 · androidx.core
AppCompat:传统 UI 的兼容宿主Core 1.20.0-alpha01
理解 AppCompatActivity、Delegate、主题与 Toolbar 的连接关系。
最后更新 2026-08-01
复制即用:最小设置
class MainActivity : AppCompatActivity(R.layout.activity_main) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setSupportActionBar(findViewById(R.id.toolbar))
}
}<!-- 主题必须继承 AppCompat 兼容主题 -->
<style name="Theme.MyApp" parent="Theme.AppCompat.DayNight">
</style>AppCompatActivity 的能力
AppCompatActivity 继承 FragmentActivity,因此天然获得:
- Fragment 支持
- Lifecycle / SavedState
- Activity Result
- ViewModelStore
AppCompat 额外通过 delegate 提供:
- 兼容主题(
Theme.AppCompat) - ActionBar / Toolbar
- 菜单处理
- 资源兼容(
getResources()等)
Toolbar 与 ActionBar
setSupportActionBar(toolbar) // 接入菜单和导航
// 返回按钮
supportActionBar?.setDisplayHomeAsUpEnabled(true)
// 菜单
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.main_menu, menu)
return true
}关键:用 Toolbar 时通过 setSupportActionBar 接入,不要再同时保留窗口自带 ActionBar(否则双栏)。
主题陷阱
// ❌ 普通 Activity 改 AppCompatActivity 但用不兼容主题 → 启动崩溃
class MainActivity : AppCompatActivity() // 但主题是 Theme.Material(非 AppCompat)
// ✅ 主题继承 AppCompat
<style name="Theme.MyApp" parent="Theme.AppCompat.DayNight" />规则:AppCompatActivity 页面主题必须继承 AppCompat/Material 兼容主题,否则启动时 Unable to start activity 异常。
AppCompat vs Material Components
| 库 | 定位 |
|---|---|
| AppCompat | 兼容宿主 + 控件基础(Toolbar、Menu) |
Material Components(com.google.android.material) | Material 设计组件 + 主题实现 |
两者不是替代关系:Material Components 依赖 AppCompat 的兼容基础,主题用 Theme.MaterialComponents 或 Theme.Material3(继承自 AppCompat 体系)。
常见陷阱
- 主题不兼容:AppCompatActivity + 非 AppCompat 主题 → 崩溃。
- 双 ActionBar:既有窗口 ActionBar 又 setSupportActionBar。
- 忘 DayNight:深浅色切换需要
Theme.AppCompat.DayNight。 - Compose 用 AppCompat:纯 Compose 用
ComponentActivity更轻;需要 AppCompat 组件才用 AppCompatActivity。
复制即用
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(findViewById(R.id.toolbar))
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_settings -> { openSettings(); true }
else -> super.onOptionsItemSelected(item)
}
}
}要点
- AppCompatActivity = FragmentActivity + AppCompat delegate。
- Toolbar 用 setSupportActionBar 接入;主题必须 AppCompat 兼容。
- AppCompat 是兼容基础,Material 是组件实现。
- 纯 Compose 用 ComponentActivity 更轻。