2009-09-17 8 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では問題にはなりません)。このバグは、古いアクティビティが描画される前の新しいアクティビティのアニメーションに由来しますが、「古い」アクティビティがタスクの最初のアクティビティだった場合のみ表示されます。

回避策は、テーマのアニメーションを無効にすることです。これを行うための最も簡単な方法は、メインのダイアログテーマを拡張する新しいテーマです。

の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

1

ここだけの推測...

私は@android:style/Theme.Dialogが半透明にすることが、背景の多くを設定されていると思います。当初、あなたのMainActivityの背景は黒です。 MainActivityが描画される前にstartActivityForResult()が蹴っている場合は、問題が説明される可能性があります。

ViewpostDelayed()を使用してstartActivityForResult()を数百ミリ秒遅らせ、動作が変わるかどうかを確認してください。

+0

私はこれについて考えましたが(描画する機会はありませんでしたが)、新しいアクティビティを目に見えないようにすべきではないかと思っていました。とにかく...私は明日それを試し、何が起こるか見てみましょう。 –

+0

私はsetContentView()がstartActivityForResult()の前に処理されると予想していました。しかし、Androidの方法は神秘的なので、あなたの経験に基づいて、startActivityForResult()が最初に処理されると思います。 – CommonsWare

+1

これはうまくいきました(「私はハックが嫌いです」というように))...アクティビティにonDisplayed()などがあって、それが表示されたときにわかるようにするといいでしょう。注:最初のアクティビティ(上記のMainActivity)内のビューでそれを行うと、描画されるたびにondraw()が実行されます...あなたが望むように聞こえるが、予期せぬ副作用(私にとっては)サブアクティビティで画面上のキーボードを開くと、親アクティビティが再度描画され、別のポップアップが表示されます。それをコーディングする際に覚えておいてください。 –

関連する問題