Сплошные черные экраны при вызове диалогов в onCreate()
У меня была эта проблема в нескольких разных приложениях, и я не могу найти решение.
Если в onCreate() Activity
, Я запускаю занятие, использующее тему диалога, которое ничего не рисует на экране... весь экран остается черным. Все виды там (например, я могу нажать, где 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
в файле манифеста.
2 ответа
Оказывается, это известная ошибка в 1.5 (исправлена в 1.6 и никогда не была проблемой в 1.1). Ошибка возникает из-за анимации для новой Деятельности, имеющей место до того, как было выполнено рисование старой Деятельности, но она отображается только в том случае, если "старая" Деятельность была первой Деятельностью в Задаче.
Обходной путь - отключить анимацию для темы. Самый простой способ сделать это с помощью новой темы, которая расширяет основную тему диалога.
Рез / значения / 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 также работало нормально с оговоркой, которую я отметил в комментариях.
Просто предположение здесь...
Я думаю @android:style/Theme.Dialog
установлен для большей части фона, чтобы быть полупрозрачным. Изначально ваш MainActivity
фон черный. Если startActivityForResult()
пинает перед вашим MainActivity
умеет рисовать, это может объяснить вашу проблему.
Попробуйте использовать postDelayed()
на View
отложить ваш startActivityForResult()
на несколько сотен миллисекунд, и посмотрите, изменит ли это поведение.