首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 自定義 ProgressDialog 需在 setContentView 前請求 Window Feature

     編輯:程式設計綜合問答

自定義 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 之前完成。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved