AppCompat:传统 UI 的兼容宿主 · AndroidX 源码指南
AAndroidX 源码指南
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 Componentscom.google.android.materialMaterial 设计组件 + 主题实现

两者不是替代关系:Material Components 依赖 AppCompat 的兼容基础,主题用 Theme.MaterialComponentsTheme.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 更轻。

相关页面