需求:建立一個**透明背景**的 Activity,疊加在另一個 Activity 之上(如對話框、浮動選單、載入遮罩)。核心在於定義透明主題並套用至目標 Activity。
<resources>
<style name="Theme.Transparent" parent="android:Theme">
<!-- 核心透明屬性 -->
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<!-- 視覺微調 -->
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
</resources>
| 屬性 | 作用 |
|---|---|
windowIsTranslucent | 啟用半透明視窗模式,允許背景透顯 |
windowBackground | 設定視窗背景為透明色 (#00000000 或 @android:color/transparent) |
windowContentOverlay | 移除預設標題欄陰影/覆蓋層 |
windowNoTitle | 隱藏標題欄 |
windowIsFloating | 標記為浮動視窗,系統會適當調整佈局 |
backgroundDimEnabled | 關閉背景變暗(預設會讓底層 Activity 變暗) |
<activity
android:name=".TransparentActivity"
android:theme="@style/Theme.Transparent">
</activity>
// 一般啟動
startActivity(new Intent(this, TransparentActivity.class));
// 若需帶參數
Intent intent = new Intent(this, TransparentActivity.class);
intent.putExtra("message", "載入中...");
startActivity(intent);
<FrameLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#80000000"> <!-- 50% 黑色遮罩 -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/bg_rounded_white"
android:orientation="vertical"
android:padding="24dp">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
<TextView
android:id="@+id/tvMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="載入中..."
android:textColor="@android:color/black" />
</LinearLayout>
</FrameLayout>
<shape xmlns:android="https://schemas.android.com/apk/res/android">
<solid android:color="@android:color/white" />
<corners android:radius="12dp" />
</shape>
透明 Activity 適合**全螢幕覆蓋、需獨立生命週期**的場景。若只是彈出對話框、底部選單,建議使用:
DialogFragment:標準對話框,支援返回鍵關閉、旋轉保持BottomSheetDialogFragment:Material Design 底部彈頁,支援拖拽展開/收合PopupWindow:輕量級錨點彈窗這些方案不需在 Manifest 註冊 Activity,生命週期自動綁定宿主 Fragment/Activity,程式碼更簡潔。