Skip to content
Kongzue edited this page Nov 16, 2023 · 1 revision

🌐 View English Document | 简体中文文档

ℹ️常見問題

Q:iOS 主題樣式無模糊效果

A:請檢查是否已經配置 renderscript 支持,具體請查閱 Wiki 首頁 文件頁面中的《配置 DialogX》部分。

若已經配置,但依然無效果,建議將 Activity 的布局文件背景修改為純色,不要使用透明色或不設置,例如設置為白色後再試。

若還是無效,請嘗試下載運行 Demo,若也沒有模糊效果說明設備不支持 renderscript,請選用別的主題。


Q:輸入法鍵盤彈出後遮擋對話框/輸入法無法頂起對話框

A:有兩個方案可供選擇

方案一:最佳化軟體布局設計

針對縱向布局,在布局外層添加 ScrollView 組件即可。

其原因為,當輸入法彈出時,如果 Activity 的界面內存在 ScrollView,系統會自動壓縮 ScrollView 的高度以實現讓界面合理的顯示,此時可以觸發“底部非安全區”高度的變化,DialogX 可以獲取到合適的高度以正常抬起對話框的顯示。

方案二:直接使用輸入法處理模式:重定界面大小即可。

進入您的項目 AndroidManifest.xml,對 Activity 添加配置:

<activity android:name=".MainActivity"
android:windowSoftInputMode="adjustResize"
...>
...
</activity>

Q:Dialog 主題無法全螢幕顯示

A:請查閱 Wiki 首頁 文件頁面中的《配置 DialogX》部分並檢查 Activity 的 theme 設置,因為實現原理,DialogX 的對話框無法覆蓋原生 ActionBar 區域,建議使用 NoActionBar 的 theme。

另外,如果無法覆蓋導航欄或顯示不全,請將 Activity 實現沉浸式後再試,推薦使用 BaseFramework 框架 可以自動實現頂部狀態欄和底部導航欄的沉浸式效果(Demo 同款)。


Q:BottomDialog / BottomMenu / CustomDialog 顯示時出現額外的上下邊距

A:因為這些組件可能都涉及沉浸式相關邏輯,DialogX 會在顯示時額外的自動空出螢幕四邊的“非安全區域”來保證組件內容的正常顯示,但也這可能會在未實現沉浸式的應用中出現額外的邊距,此時您可以將應用的Activity 沉浸式,包含頂部狀態欄透明及底部導航欄背景透明,即可完美解決。

我更建議您使用 BaseFramework 框架的沉浸式方案(https://xiaozhuanlan.com/topic/4276819530)


Q:全螢幕對話框顯示時,Activity 背景變黑

A:請指定設置 Activity 布局文件背景顏色。


Q:啟動對話框很慢,點了按鈕半天不打開對話框

A:檢查主執行緒邏輯是否出現卡執行緒的問題,DialogX 之所以可以做到在非同步執行緒啟動的原理是 Post 了啟動消息到主執行緒去運行,但主執行緒循環消息的過程一旦出現阻塞現象就會導致 DialogX 的啟動過程無法流暢的執行,建議將耗時的操作放到非同步執行緒運行,盡量減少主執行緒的工作流程,此問題就不會出現了。


Q:對話框通過 log 可以看到顯示了,但實際上在界面上不顯示

A:默認情況下 DialogX 的對話框不需要傳入 context(activity) 參數是為了方便開發提升開發效率,但依賴 UI 呈現的對話框不可能不需要 context 參數,因此 DialogX 是通過初始化完成後監聽 activity 的啟動自動獲取當前 activity 作為容器呈現並啟動對話框的,這能應對 99% 的開發場景。

如果你遇到執行了 .show() 命令但對話框並沒有如期顯示的情況,可能是頻繁切換 activity,或者在跳轉到一個剛啟動的 activity 界面時,DialogX 還未能接收到正確該顯示的 ativity 監聽回調,此時對話框可能被錯誤的在上一個界面顯示,應對這種情況請指定 activity 參數即可解決,例如 .show(activity)

針對 WaitDialog,請嘗試 WaitDialog.show(activity, "messageString"),並在關閉時指定:WaitDialog.dismiss(activity)


Q:對話框在其他 Activity 啟動

A:執行的對話框的 show 指令後,切換了別的 Activity,發現對話框在另一個 Activity 顯示。

這個問題的原因和上面一個問題類似,出現了主執行緒卡執行緒的問題,而 DialogX 啟動是必須等待主執行緒循環消息執行啟動過程的,如果說在處理事務的時候頻繁執行 dismiss 關閉指令或 show 指令,以及切換 Activity 的顯示可能造成對話框啟動依賴的 Activity 判斷錯誤,而 DialogX 預設的啟動方法也沒有指定依賴的 Activity,這時可以嘗試指定啟動的 Activity。

方法是使用對話框組件的 build()方法構建對話框,請注意 build() 方法是沒有參數的,你需要透過方法設定對話框的其他參數,例如標題、內容、按鈕等,最後執行 show(activity) 方法啟動對話框,舉例如下:

MessageDialog.build()
.setTitle("Title")
.setMessage("This is message content.")
.setOkButton("OK", new OnDialogButtonClickListener<MessageDialog>() {
   @Override
   public boolean onClick(MessageDialog baseDialog, View v) {
       //...
       return false;
   }
})
.show(MainActivity.this);	//重點

Q:如何修改輸入框游標顏色

A:您可以使用 InputDialog 的 InputInfo 設置來修改它:

new InputDialog("標題", "正文內容", "確定", "取消", "正在輸入的文字")
  .setInputInfo(new InputInfo()
          .setCursorColor(Color.parseColor("#185ABD"))		//設置游標顏色
          .setBottomLineColor(Color.parseColor("#185ABD"))	//設置底部橫線顏色
  );

也可以使用 .setThemeColor(...) 來一併設置,但請注意,部分主題樣式下 bottomLineColor 可能影響輸入框的背景色。

以下為相容性最好的方案:

請在您的 style 中添加以下代碼複寫:

定義亮色模式時,DialogX 中的 AppCompat 組件主題色:

<style name="DialogXCompatThemeLight" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorAccent">@color/colorAccent</item>
</style>

定義暗色模式時,DialogX 中的 AppCompat 組件主題色:

<style name="DialogXCompatThemeDark" parent="Theme.AppCompat.NoActionBar">
<item name="colorAccent">@color/colorAccent</item>
</style>

DialogX 中的輸入框使用的是系統原生組件,並非自訂組件,所以修改方式需要按照原生主題色修改方案來。


Q:在使用 DialogX 後,軟體界面出現界面底部穿透到螢幕底部導航欄(小橫條)背後的問題

A:請關閉這個設置:

//使用沉浸式適配
//請注意,若你沒有使用沉浸式適配,請關閉此選項,此選項將影響對話框布局是否允許延伸至導航欄背後顯示
DialogX.useActivityLayoutTranslationNavigationBar = false;

詳細原因:

因為 fitSystemWindow 標記只能對一個 Window 下的一個 View 生效,DialogX 要是自己用了用戶那邊就沒辦法用,所以 DialogX 不能 Hook 這個標記,DialogX是在DialogXBaseRelativeLayout 這個布局組件中處理沉浸式相關事務的,包括鍵盤彈起,這都算底部非安全區高度變化相關邏輯,但 Google 在針對未設置此 Flag 的情況下,會出現彈出新對話框時,舊對話框(已彈出的其他對話框)接收到一次異常的底部高度變化值,其特徵是會出現先歸0然後回調幾次後再恢復正常的值,表現形式是涉及底部顯示的對話框出現“彈跳”的問題。

為解決這個問題,DialogX 的最新版本預設啟用了對 Window 設置 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 標記的操作,若需要關掉它請使用:

DialogX.useActivityLayoutTranslationNavigationBar = false;

Q:DialogX 無法覆蓋在 DialogFragment、AlertDialog 之上

A:DialogX 預設使用 View 實現方式,你可以理解為實際上只是在當前 Activity 上疊加了一層 DialogView,因為並不是獨立的 Window,所以無法覆蓋在 DialogFragment、AlertDialog 之上。

我們更推薦您將使用 DialogFragment、AlertDialog 方案實現的對話框,改為 DialogX 替代,DialogX 也提供了諸如 CustomDialog 這樣的組件以滿足個性化對話框的需要。

若實在無法替代,您可以嘗試 DialogX 的其他實現模式,但請謹慎使用,其他方案依然存在特定情況下的 bug,若你有遇到,請回饋給我們。


Q:在 BottomDialog 和 FullScreenDialog 對話框中讓自己的滑動布局支持滑動繼承

A:直接滑動 BottomDialog 和 FullScreenDialog 對話框中的 ScrollView、ListView、RecycleView 等布局可能無法實現和對話框下滑關閉的同步,要實現此功能,請自訂對應的組件,繼承 ScrollController,並完成以下介面的實現:

@Override
//請按照固定寫法
public boolean isLockScroll() {
return lockScroll;
}

boolean lockScroll;

@Override
//請按照固定寫法
public void lockScroll(boolean lockScroll) {
this.lockScroll=lockScroll;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
if (lockScroll) return false;
return super.onTouchEvent(event);
}

@Override
//獲取已滾動距離,請注意不同組件的獲取方式不同,請按照根據實際情況調整
public int getScrollDistance() {
return getScrollY();
}

@Override
//固定寫法
public boolean isCanScroll() {
return true;
}

然後在對需要繼承滑動的布局設置 Tag,固定文本“ScrollController”,BottomDialog 和 FullScreenDialog 對話框會在運行後識別子布局中的 ScrollController 實現,並在其處於滑動到頂部且繼續下滑時接管觸摸事件。


Q:重寫 Activity 的 onKeyDown 裡彈出對話框無效/對話框的不攔截返回?

A:因為 Activity 的 onKeyDown 屬於事件鏈的上游,此時對話框未啟動或 KeyBack 事件還未傳遞到對話框,對話框無法進行處理,請使用 onBackPressed 處理,例如:

@Override
public void onBackPressed() {
MessageDialog.show("提示", "確認退出?", "是", "否")
   .setOkButton(new OnDialogButtonClickListener<MessageDialog>() {
       @Override
       public boolean onClick(MessageDialog baseDialog, View v) {
           MainActivity.super.onBackPressed();
           return false;
       }
   });
}

Q:如何修改圓角?如何修改某個組件的背景樣式?如何單獨修改某個對話框的背景樣式?

A:可使用 .setBackgroundRadius(float px) 來設置圓角大小,使用此設置後,圓角部分將對對話框內容進行裁切顯示,另外,對於 BottomDialog、BottomMenu、FullScreenDialog,圓角設置僅對左上、右上圓角有效。

另請參考 issues:228


Q:如何實現傳統的進度條對話框?

A:請參考 利用DialogX實現傳統進度條對話框效果

image


Q:如何復用一個對話框?

A:DialogX 建議對話框的使用是單次的,這意味著當你對一個已經顯示的對話框執行 .dismiss() 方法時將完全銷毀它,這是為了避免記憶體占用和記憶體洩漏,要重複使用一個對話框保留其狀態(例如其中有用戶交互輸入的內容或自訂布局進行了操作)。

如果主要想保留的是自訂布局的內容狀態,可以嘗試保留自訂布局:

//保留 customView
private View customView;

//完成界面初始化,例如在 activity 的 onCreate 方法中
customView = LayoutInflater.from(this).inflate(R.layout.layout_your_custom_view, null);

然後在啟動對話框時使用 view 作為參數:

CustomDialog.show(new OnBindView<CustomDialog>(customView) {
    @Override
    public void onBind(CustomDialog dialog, View v) {
      //...
    }
});

只要不重新創建 customView,那麼其內容是會一直保留的。

另外可以嘗試不真的關掉對話框,而是隱藏對話框:

首先請在對話框啟動時拿到其對象實例:

//在全局設置一個對話框實例
private InputDialog inputDialog;
//顯示對話框並獲取其實例
inputDialog = InputDialog.show("這是一個輸入框","輸入提示文本","OK","CANCEL")

接著編寫其相關事件處理:

inputDialog = InputDialog.show("這是一個輸入框","輸入提示文本","OK","CANCEL")
.setOkButton(new OnInputDialogButtonClickListener<InputDialog>() {
   @Override
   public boolean onClick(InputDialog dialog, View v, String inputStr) {
       //使用退出動畫隱藏對話框
       dialog.hideWithExitAnim();
       //return true 攔截 OK 按鈕點擊不要自動 dismiss
       return true;
   }
})
.setCancelButton(new OnInputDialogButtonClickListener<InputDialog>() {
   @Override
   public boolean onClick(InputDialog dialog, View v, String inputStr) {
       dialog.hideWithExitAnim();
       //return true 攔截 Cancel 按鈕點擊不要自動 dismiss
       return true;
   }
})
.setOnBackgroundMaskClickListener(new OnBackgroundMaskClickListener<MessageDialog>() {
   @Override
   public boolean onClick(MessageDialog dialog, View v) {
       dialog.hideWithExitAnim();
       //return true 攔截背景遮罩點擊不要自動 dismiss
       return true;
   }
})
.setOnBackPressedListener(new OnBackPressedListener<MessageDialog>() {
   @Override
   public boolean onBackPressed(MessageDialog dialog) {
       dialog.hideWithExitAnim();
       //return true 攔截返回鍵點擊不要自動 dismiss
       return true;
   }
});

要重新顯示這個對話框,可以直接使用 .show() 命令:

inputDialog.show();

理論上在 activity 銷毀時 DialogX 也會自行銷毀對應該 activity 的對話框,若你擔心,可以在 activity#onDestroy() 中加入手動銷毀的方法:

inputDialog.dismiss();

Q:設置文字顏色、背景色無效?

請檢查設置的 fontColor 或 backgroundColor 的值類型是否正確,一般需要的值為 ColorInt 值,您可以使用 Color.parseColor("#4D000000") 設置一個 HEX 色值,或使用資源 getResources().getColor(R.color.black30) 設置一個顏色的資源值,請勿直接傳入資源 ID,它可能會無效。


ℹ️Issues經典問題

【功能建議】可以讓BottomMenu 支持顯示多行嗎? 而不是超過1行 後面就點點點(issues:247)

popmenu如果掛點的view在邊緣的話,彈出來的popmenu會變形(issues:231)

當前頁面dialog跑到上個頁面顯示(issues:197)

自訂動畫對話框關閉時閃爍(issues:280)

GuideDialog顯示位置不正確/顯示到螢幕左上角(issues:304)

Clone this wiki locally