2010-12-06 17 views
3

Ich kämpfe um herauszufinden, wie man mit einer Situation in Android, wo Code ausgeführt wird, wenn ich es wirklich nicht will. In der onCreate() einer Aktivität habe ich einige Sachen, die ich in der Reihenfolge tun muss, und ich kann den Code nicht weiter ausführen lassen, bis bestimmte Dinge zuerst passieren. Ich verstehe, dass sich Android und Java so verhalten, und ich kämpfe darum, einen anderen Weg zu finden, um das zu erreichen, was ich brauche.Ich brauche Hilfe mit Android und Java

ShowEula ist eine Klasse, die ich erstellt habe, um einen einfachen Dialog mit meinem EULA anzuzeigen. Ich muss wirklich warten, bis der Benutzer dem EULA zustimmt oder nicht, bevor er DBGetOnlineVersionNumber() aufruft. Vielleicht gehe ich das nicht richtig. Auf jeden Fall ist hier ein Ausschnitt aus meinem Code:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    setContentView(R.layout.main); 
    String version; 
    ShowEula();  
    version = DBGetOnlineVersionNumber(); 
    .... 

Antwort

4

Sie müssen von Android verwendet, um Dinge in Bezug auf die ereignisgesteuerte Modell zu überdenken.

Sie können nicht auf Benutzeroberflächenereignisse in onCreate warten, da keine Benutzerschnittstellenereignisse zurückgegeben werden können, nachdem onCreate zurückgegeben wurde.

Vielleicht könnten Sie Dinge als Software-Zustandsmaschine organisieren.

onCreate würde die EULA zeigen und den Staat zu EULA_ACCEPTED würde vorrücken gesetzt, den Staat zu EULA_SHOWING

akzeptieren und Sie wahrscheinlich bei jedem Start zeigen nicht die EULA wollen etwas nächste

Natürlich anzuzeigen, aber nur nach der Installation, aber Sie können dies mit etwas in den Einstellungen gespeichert umgehen.

+0

Ich verwende sharedpreferences, um die EULA zu behandeln. Ich dachte nach, was Sie vorschlagen, aber ich habe Probleme, das alles zu sortieren. Schlägst du etwas wie Handler vor? Ich könnte einen Status für EULA_SHOWING festlegen? Wie würdest du vorschlagen, dass ich das tue? –

+0

Nein, ich schlage vor, dass Sie Ihr gesamtes Konzept der Benutzeroberflächenprogrammierung ereignisgesteuert überdenken müssen.Sowohl das System als auch der Benutzer senden Ihnen Ereignisse, beispielsweise zum Erstellen oder Berühren, jedes Mal, wenn Sie ein Ereignis erhalten, etwas sehr schnell und zurück und setzen möglicherweise eine Statusvariable, sodass Sie wissen, welches Ereignis Sie als nächstes benötigen/was zu tun ist nachdem du es bekommen hast. –

+0

Bekam es. Sehr nützliche und hilfreiche Informationen. Danke Chris. –

3

Ja, das ist ein Problem im Allgemeinen mit allen GUIs, die Dinge asynchron tun. Was ich in der Regel ist eine Boolesche in einer gemeinsamen Vorliebe setzen tun und dann zwei Filialen in dem Start erstellen ...

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    setContentView(R.layout.main); 
    String version; 

    if (Settings.isEulaBeenShown() == false) { 
     /* showEula would call stuffToDoIfUserAgreesToEULA on a positive response was given */ 
     ShowEula(); 
    } 
    else if (Settings.isEULAAgreed() == true) { 
     stuffToDoIfUserAgreesToEULA() 
    } 
    .... 
} 

private void stuffToDoIfUserAgreesToEULA() { 
    String version = DBGetOnlineVersionNumber(); 
} 
+0

Ok, lass mich ein bisschen basteln und sehen, wie das geht. Das macht Sinn und ich mag die Idee, Shared-Prefs für Flags zu verwenden. –

+0

Andrew schnelle Frage. Disclaimer: Ich bin ein Android-Neuling ... Wie würde ShowEula stuffToDoIfUserAgreesToEULA aus der Eula-Klasse aufrufen, die ich erstellt habe? –

+0

Andrew, vielen Dank für die Hilfe. Ich denke, ich habe es jetzt herausgefunden. –

0

Ich glaube, Sie nur 2 xml Layouts erstellen können.

Eine für Ihre EULA und die Schaltflächen zum Annehmen/Verweigern und dann eine weitere für Ihre Hauptanwendung.

Wenn die App geladen wird, können Sie einfach das EULA-Layout anzeigen, wenn es das erste Mal ist und nicht in den gemeinsamen Einstellungen verfolgt wird.

Dann, wenn der Benutzer akzeptiert, haben Sie SetContentView in der Anwendungsinhaltsansicht.

Extrahieren Sie die meisten Ihrer Sachen aus onCreate(), so dass Sie die Komponenten, z.

private static boolean EulaRequired = true; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    EulaRequired = sharedprefs.getBoolean("firsttime", true); 
    inflateLayout();  
} 

private void inflateLayout() { 
    if (EulaRequired) { 
    this.setContentView(R.layout.eula); 
    } else { 
    this.setContentView(R.layout.application); 
    DBGetOnlineVersionNumber(); 
    } 
} 
private void stuffToDoIfUserAgreesToEULA() { 
    String version = DBGetOnlineVersionNumber(); 
} 
void AcceptClicked(Event e) { 
    EulaRequired = false; 
    inflateLayout(); 
} 

So etwas sollte funktionieren, ich habe es noch nie versucht.

Verwandte Themen