自定義 ProgressDialog 佈局時,若直接調用 setContentView 會崩潰提示 requestFeature() must be called before adding content。原因:Dialog 的窗口特性(如無標題、背景透明)必須在設置內容視圖前通過 requestWindowFeature 聲明。
ProgressDialog pd = new ProgressDialog(this);
// 1. 請求特性:無標題
pd.requestWindowFeature(Window.FEATURE_NO_TITLE);
// 2. 設置自定義佈局
pd.setContentView(R.layout.custom_progress_dialog);
// 3. 可選:設置背景透明
pd.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
// 4. 顯示
pd.show();
ProgressDialog 繼承 AlertDialog,內部持有 PhoneWindow。setContentView 會觸發 PhoneWindow.installDecor(),此時窗口特性已鎖定。requestWindowFeature 修改 PhoneWindow 的特性標誌,必須在 installDecor 前調用。| 常量 | 效果 |
|---|---|
Window.FEATURE_NO_TITLE | 隱藏標題欄 |
Window.FEATURE_PROGRESS | 啟用進度條 |
Window.FEATURE_INDETERMINATE_PROGRESS | 啟用不定進度條 |
記住:Dialog 任何窗口特性設置,必須在 setContentView/show 之前完成。