Сплошные черные экраны при вызове диалогов в 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() на несколько сотен миллисекунд, и посмотрите, изменит ли это поведение.

Другие вопросы по тегам