Android 開發中隱藏 Activity 標題欄是基礎需求,但許多開發者在使用 requestWindowFeature(Window.FEATURE_NO_TITLE) 或主題樣式時遭遇崩潰、閃屏或無效果。本文系統梳理兩種主流方案的適用場景、常見坑點與最佳實踐,助你一次搞定標題欄隱藏。
requestWindowFeaturesetContentView() 之前調用,否則拋出 AndroidRuntimeException: requestFeature() must be called before adding content。super.onCreate() 之後調用,否則窗口特性未初始化完成。@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 1. 請求無標題特性 —— 必須在 setContentView 之前
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 2. 可選:全螢幕模式(隱藏狀態欄)
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
// WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 3. 設置佈局
setContentView(R.layout.activity_main);
// 後續初始化...
}
<!-- res/values/styles.xml -->
<resources>
<!-- 基礎主題:繼承 AppCompat -->
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- 自定義屬性 -->
</style>
<!-- 應用主題 -->
<style name="AppTheme" parent="AppBaseTheme">
</style>
<!-- 專用無標題主題(若基礎主題非 NoActionBar 變體) -->
<style name="NoTitleTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item> <!-- 支援庫 ActionBar -->
<item name="windowNoTitle">true</item> <!-- 標準窗口 -->
</style>
</resources>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" > <!-- 全局預設主題 -->
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/NoTitleTheme" /> <!-- 單獨 Activity 覆蓋 -->
</application>
| 錯誤現象 | 根本原因 | 解決方案 |
|---|---|---|
IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity | Activity 繼承 AppCompatActivity,但應用的主題非 Theme.AppCompat 子類 | 主題必須繼承 Theme.AppCompat.*,如 Theme.AppCompat.Light.NoActionBar |
Unable to resolve superclass of L.../MainActivity + Link of class failed | 類加載失敗,通常因主題資源引用錯誤導致類初始化崩潰 | 檢查 styles.xml 語法、父主題名稱拼寫、資源 ID 是否存在 |
| 標題欄隱藏但閃一下 | requestWindowFeature 調用時機晚,或主題切換延遲 | 改用主題方案;或在 onCreate 最開頭調用 requestWindowFeature |
| ActionBar 仍顯示 | 使用 Theme.AppCompat 但未禁用 windowActionBar | 主題中添加 <item name="windowActionBar">false</item> |
若需隱藏標題欄並實現狀態欄透明/內容延伸至狀態欄區域:
<style name="TranslucentStatusTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Android 4.4-4.3 -->
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<!-- Android 5.0+ -->
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>
代碼中配合:
// 在 setContentView 後
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// Android 5.0+ 可進一步設置
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.setStatusBarColor(Color.TRANSPARENT);
}
}
android:theme="@android:style/Theme.NoTitleBar"。NoActionBar 變體,在佈局中自行放置 Toolbar。隱藏 Android 標題欄的核心在於主題繼承鏈正確與調用時機準確。現代 Android 開發(API 21+)強烈建議採用 Theme.AppCompat.Light.NoActionBar 系主題靜態配置,避免代碼動態調用帶來的時序問題與閃屏體驗。若遇到 IllegalStateException: You need to use a Theme.AppCompat theme,請優先檢查 styles.xml 中父主題是否為 Theme.AppCompat.* 子類,以及 AndroidManifest.xml 中 android:theme 屬性引用是否正確。