2012-07-31 40 views
5

我創建了一個名爲MyCustomDialog的自定義對話框,它擴展了Dialog。我創建並顯示我的自定義對話框如下:如何在其onCreate方法中取消或關閉自定義對話框?

new MyCustomDialog(myContext).show(); 

我重寫Dialog.onCreate(Bundle savedInstanceState)方法做我的初始化。我還檢查了這種方法是否存在某種情況,如果沒有,我想解僱/取消我的對話。我嘗試在我的對話框onCreate(Bundle savedInstanceState)onStart()方法中調用cancel()dismiss()方法,但它沒有效果。

任何人都知道如何在顯示之前取消或關閉對話框中的對話框?

+0

你在你的onCreate()方法中調用super.onCreate()嗎? – RaphMclee 2012-07-31 16:20:09

+0

你正在寫這個API的級別是什麼? – 2012-07-31 16:31:30

回答

2

您應該放置邏輯以確定對話框是否在onCreate()方法之外顯示。它不屬於那裏。

或者,重命名您的show()方法showIfRequired()(或其他),並在那裏添加條件顯示邏輯。

我知道這並不是在技術上回答你的問題,但你要做的不是正確的設計。這是一件好事,因爲以正確的方式做事實際上更簡單。

另外,作爲附註,您應該使用DialogFragment轉而使用Dialog。它在v4支持庫中可用。

+0

是的,你可以在你的dialog子類中重寫show()方法本身,並有條件地調用super.show()。 – CSmith 2012-07-31 16:21:15

+1

@CSmith是的,但這會違反DialogInterface.show()方法的合同。 – 2012-07-31 16:24:27

1

這是API級別10及以下:在活動類

首先,你應該重寫onCreateDialog(INT ID,捆綁參數),是你在做什麼?對話框總是被創建並顯示爲活動的一部分。其次,我不認爲你可以取消/關閉onCreateDialog中的對話框,因爲當onCreateDialog被調用時它並沒有被創建。也就是說,您無法取消/解除尚未創建的內容。你可以嘗試的是重寫onPrepareDialog(),並做你的檢查取消/關閉那裏的對話框。此時,對話框實際上應該已經創建(只是不顯示),所以如果您在那裏調用取消/取消,您將能夠防止它顯示出來。

onPrepareDialog()是在即將顯示的對話框上進行任何形式的檢查和決策的適當位置。這是針對Honeycomb之前的API。

這是API的11及更高版本:

如果您使用的是以後的API,你應該擴展DialogFragment代替。在這種情況下,我認爲您可以處理DialogFragment的onCreateView()方法中的決策,該方法與onPrepareDialog()類似。

我希望你通過這個閱讀: http://developer.android.com/guide/topics/ui/dialogs.html

或此,根據您的API:

http://developer.android.com/reference/android/app/DialogFragment.html

總體來說,也許是一個清潔的解決方案是禁用按鈕或機制導致對話框顯示在第一位?也就是說,編寫代碼,以便只有在確實需要調用Dialog.show()時纔會調用Dialog.show()。我必須知道更多關於你想要做什麼的細節。例如,假設你叫Dialog。show()從一個按鈕的onClickListener。你並不是真的希望用戶按下一個按鈕,期望一個對話框,但是由於某些原因用戶不理解,不會顯示它。更好的解決方案是將所有按鈕全部禁用,以便用戶明白由於應用程序中的其他內容導致此功能不可用。

+0

'onCreateDialog()'是'DialogFragment'中的一個方法。他沒有使用'DialogFragment',他擴展了'Dialog'。 – 2012-07-31 16:27:44

+0

我正在談論的onCreateDialog實際上是一種Activity的方法。我在說的是onPrepareDialog()。它看起來不像OP使用DialogFragment。如果這個應用程序是預蜂巢式的,這就是OP應該做的事情(在Honeycomb之前不存在Dialogfragment)。如果它是用於蜂窩和更高版本的,那麼OP應該使用DialogFragment。我對原始問題添加了評論。 – 2012-07-31 16:29:19