2009-09-17 84 views
5

我現在在幾個不同的應用程序中遇到了這個問題,而且我似乎找不到解決方案。在onCreate()調用對話框時出現的純黑色屏幕

如果在Activity的onCreate()中,我開始一個使用對話主題的活動,它不會畫任何東西......屏幕保持黑屏。所有的觀點都在那裏(例如,我可以點擊一個EditText應該在哪裏,它會給我的鍵盤),他們只是不可見。

任何人有任何想法?

愚蠢的簡單的例子,爲了好玩:

public class MainActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.main); 
     startActivityForResult(new Intent(this, CredentialsInputActivity.class), 1); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     // do some crap with the result, doesn't really matter what 
    } 
} 

CredentialsInputActivity是非常直接的...只是擴展Activity和有主題清單文件設置爲@android:style/Theme.Dialog

回答

6

事實證明,這是一個known bug在1.5(固定在1.6,從來沒有在1.1的問題)。這個錯誤源於新的Activity的動畫,它是在舊的Activity被繪製之前發生的,但只有在「舊」Activity是Task中的第一個Activity時纔會出現。

解決方法是禁用該主題的動畫。使用擴展主對話框主題的新主題完成此操作的最簡單方法。

RES /價值/的themes.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="CupcakeDialog" parent="android:Theme.Dialog"> 
     <item name="android:windowAnimationStyle">@null</item> 
    </style> 
</resources> 

然後只是引用它在你的AndroidManifest.xml:

<!-- ... --> 
<activity 
    android:name=".CredentialsInputActivity" 
    android:label="@string/CredentialsInputActivity_window_title" 
    android:theme="@style/CupcakeDialog" /> 
<!-- ... --> 

很明顯,你失去的動畫,但至少你可以看到它:)

注意:commonsware.com的解決方案工作得很好,我在註釋中提到的警告。

+0

這個錯誤似乎沒有在1.6中修復,據我所知... – polyglot 2010-03-14 02:55:02

1

這裏只是一個猜測...

我覺得@android:style/Theme.Dialog設置爲多背景是半透明的。最初,您的MainActivity的背景是黑色的。如果在MainActivity繪製之前startActivityForResult()正在踢球,那可能會解釋您的問題。

嘗試使用postDelayed()上的View延遲您的startActivityForResult()幾百毫秒,看看是否會改變行爲。

+0

我想過這個(沒有機會畫),但決定我不喜歡它,因爲即使只是幾乎沒有看到新的活動仍然可見嗎?無論如何...我明天會試試看看會發生什麼。 – 2009-09-17 09:27:20

+0

我會期待在startActivityForResult()之前處理setContentView()。然而,Android的方式是神祕的,所以根據你的經驗,我的猜測是startActivityForResult()首先被處理。 – CommonsWare 2009-09-17 09:35:56

+1

這工作正常(在「我討厭黑客」的方式;))...如果活動有一個onDisplayed()或其他東西,所以我們可以告訴它什麼時候可見它會很好。注意:在第一個活動(上面的MainActivity)的視圖內執行它使得每次繪製ondraw()都會運行...聽起來像你想要的,但是出乎意料的副作用(對我而言)如果您在子活動上打開屏幕鍵盤,則父活動會再次繪製並顯示另一個彈出窗口。編碼時請注意一些事項。 – 2009-09-19 02:34:58