7 Stimmen

das Starten einer neuen Aktivität in onCreate funktioniert nur mit Verzögerung

Ich habe eine einfache Aktivität, die nur zwei Schaltflächen anzeigt, und ich möchte eine andere Aktivität laden, sobald diese fertig geladen ist.

@Override
public void onCreate(Bundle savedInstanceState) {
    dbg("starting on create");
    super.onCreate(savedInstanceState);

    dbg("stting content view");
    setContentView(R.layout.main);

    createDrPopup();

}

private void createDrPopup(){
    dbg( "created new activity");
    startActivityForResult(new Intent(this, DrPopup.class), 
                           DR_POPUP_ACTIVITY_ID);
}

Ich erhalte mit diesem Code keine Fehler, aber die neue Aktivität wird nicht richtig geladen. Auf diese Weise erhalte ich nur einen leeren Bildschirm.

Aber wenn ich die neue Aktivität mit einer Verzögerung aufrufe, dann funktioniert alles einwandfrei.

@Override
public void onCreate(Bundle savedInstanceState) {
    dbg("starting on create");
    super.onCreate(savedInstanceState);

    dbg("stting content view");
    setContentView(R.layout.main);

    Thread splashTread = new Thread() {
        @Override
        public void run() {
            try {
                sleep(500);
            } catch(InterruptedException e) {
            } finally {
                createDrPopup();
            }
        }
    };
    splashTread.start();
}

private void createDrPopup(){
    dbg( "created new activity");
    startActivityForResult(new Intent(this, DrPopup.class), 
                           DR_POPUP_ACTIVITY_ID);
}

Meine Frage ist folgende:

Gibt es eine bessere Möglichkeit zu warten, bis eine Aktivität fertig geladen ist? Ich kann nicht einmal sicher sein, dass 500 ms jedes Mal genug sind.

Ich danke Ihnen für alle Vorschläge.

angeforderter Code für dr_popup (einfacher geht es nicht)

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    dbg("Created new activity");

    setContentView(R.layout.dr_webview);
    dbg("web view created");

}

und beide Layouts

Haupt

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    <Spinner android:layout_height="wrap_content" android:layout_weight="1" android:layout_width="wrap_content" android:id="@+id/spinner1"></Spinner>
</LinearLayout>

Popup

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dr_popup_webview_layout" android:layout_width="fill_parent" android:layout_height="fill_parent"  android:orientation="vertical">
    <WebView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dr_popup_webview" android:layout_width="fill_parent"  android:layout_height="100dip"/>
    <LinearLayout  android:id="@+id/frameLayout1" android:layout_height="100dip" android:layout_width="fill_parent" android:orientation="horizontal">
        <EditText android:id="@+id/dr_submit_text"          android:layout_height="wrap_content"            android:layout_width="wrap_content"         android:layout_weight="4">
            <requestFocus></requestFocus>
        </EditText>
        <Button             android:text="Button"           android:id="@+id/dr_submit_button"          android:layout_height="wrap_content" android:layout_width="wrap_content"    android:layout_weight="1"></Button>
    </LinearLayout>
</LinearLayout>

edit: das Problem scheint durch die Manifestzeile verursacht zu werden @Android:style/Theme.Dialog

    <activity android:theme="@android:style/Theme.Dialog"
              android:name=".DrPopup"
              android:label="@string/dr_popup">
    </activity>

Wenn ich diese Zeile entferne, scheint alles zu funktionieren, aber ich hätte gerne eine Lösung, die auch mit dieser Zeile funktioniert.

und ein Bild, das das Problem zeigt. http://i.imgur.com/ZOcyw.png

5voto

Renaud Punkte 8703

Ich sehe keinen Grund, warum Sie eine Verzögerung von 500 ms einfügen müssen Das ist einfach ein Unsinn, diese Verzögerung einzufügen. Es sind einige Klarstellungen erforderlich: 1. Haben Sie innerhalb der ursprünglichen Aktivität eine umfangreiche Verarbeitung durchgeführt? 2. startActivityForResult wird mit Absicht aufgerufen (da Ihre Codefragmente keine onActivityResult-Implementierung zeigen)?

Ich werde versuchen, ein minimales Beispiel zu implementieren und den Beitrag so schnell wie möglich zu aktualisieren

Update

Nach mehreren Versuchen, das Problem in einer parallelen Chatsitzung zu verstehen und zu beheben, habe ich das Problem auf einem neuen 1.5-Emulator reproduziert. Das Problem kommt schließlich von der Verwendung von Android:theme="@Android:style/Theme.Dialog" für die Anruferaktivität. Das Problem wird auf Android 1.5 beobachtet (sowohl auf dem Gerät als auch auf dem Emulator). Unabhängig davon, was im zweiten Layout deklariert ist, wird nichts angezeigt, wenn die zugehörige Aktivität gestartet wird. Die Anzeige ist einfach leer und ein Druck auf die Zurück-Taste löst eine vorübergehende Anzeige der Aktivität aus, geht aber zur ersten Aktivität über (späterer Teil ist nominal). Ich konnte nicht erklären, warum dies geschieht, und ich schlage zidarsk8 vor, PopupWindow auszuprobieren oder einen benutzerdefinierten Stil zu definieren (Versuch und Irrtum auf der Grundlage der Quelldefinition von Android Theme.Dialog).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X