2009-09-17 9 views
5

Mam już ten problem w kilku różnych aplikacjach i nie mogę znaleźć rozwiązania.Stałe czarne ekrany podczas wywoływania okien dialogowych w onCreate()

Jeśli w opcji onCreate() obiektu Activity uruchamiam działanie, które używa motywu okna dialogowego, nie rysuje niczego na ekranie ... cały ekran pozostaje czarny. Wszystkie widoki są tam (np. Mogę dotknąć, gdzie powinien być EditText, a to da mi klawiaturę), one po prostu nie są widoczne.

Ktoś ma jakieś pomysły?

Głupi prosty przykład, dla zabawy:

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 jest dość proste ... tylko rozciąga Activity i ma motywu zestaw do @android:style/Theme.Dialog w pliku manifestu.

Odpowiedz

6

Okazuje się, że jest to known bug w 1.5 (ustalone w 1.6 i nigdy problem w 1.1). Błąd pochodzi z animacji nowej aktywności wykonywanej przed wylosowaniem starej aktywności, ale przedstawia tylko wtedy, gdy "stara" czynność była pierwszą czynnością w zadaniu.

Obejście problemu polega na wyłączeniu animacji kompozycji. Najprostszy sposób to zrobić z nowym motywem, który rozszerza główny motyw okna dialogowego.

RES/wartości/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> 

Następnie wystarczy odwołać go w AndroidManifest.xml:

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

Oczywiście tracisz animację, ale przynajmniej można go zobaczyć :)

Uwaga: rozwiązanie commonsware.com również działało dobrze z zastrzeżeniem, które zauważyłem w komentarzach.

+0

Błąd nie wydaje się być naprawiony w 1.6, o ile mogę powiedzieć ... – polyglot

1

tylko przypuszczenie tutaj ...

myślę @android:style/Theme.Dialog jest ustawiony na wiele tle, aby być przezroczyste. Początkowo twoje tło MainActivity jest czarne. Jeśli startActivityForResult() zacznie kopać, zanim Twój remis zostanie pobrany, może to wyjaśnić Twój problem.

Spróbuj użyć postDelayed() na View, aby opóźnić swój startActivityForResult() o kilkaset milisekund i sprawdź, czy to zmieni zachowanie.

+0

Myślałem o tym (nie mając okazji narysować), ale zdecydowałem, że mi się nie podoba, bo czy nowa aktywność nie powinna być widoczna, nawet jeśli ledwo? W każdym razie ... Wypróbuję to jutro i zobaczę, co się stanie. –

+0

Spodziewałbym się, że funkcja setContentView() będzie obsługiwana przed startActivityForResult(). Jednak sposoby działania Androida są tajemnicze, a więc w oparciu o twoje doświadczenia, domyślam się, że startActivityForResult() jest przetwarzany jako pierwszy. – CommonsWare

+1

To działało bez zarzutu (w tym "nienawidzę hacków";)) ... byłoby miło, gdyby Activity miał OnDisplayed() lub coś takiego, żebyśmy mogli stwierdzić, kiedy jest widoczny. UWAGA: Wykonanie go w widoku wewnątrz pierwszego działania (MainActivity powyżej) sprawiło, że za każdym razem, gdy był narysowany, ondraw() działał ... brzmi jak to, co chcesz, ale nieoczekiwany efekt uboczny (dla mnie) było to, że jeśli otworzysz klawiaturę ekranową na poddziałaniu, aktywność rodzica zostanie ponownie narysowana, dając ci kolejne wyskakujące okienko. Po prostu coś, o czym należy pamiętać podczas kodowania. –

Powiązane problemy