2009-07-14 5 views
5

In Blackberry kann ich von einem Bildschirm zum nächsten Bildschirm navigieren, aber ich kann nicht zum vorherigen Bildschirm zurück navigieren. Durch Drücken der Escape-Taste im Emulator wird die gesamte Anwendung beendet. Gibt es einen anderen Schlüssel im Emulator, um zum vorherigen Bildschirm oder zu einem anderen Code zu gelangen, um zurück zu navigieren? Wenn du weißt, bitte hilf mir.Wie navigiere ich zurück zum vorherigen Bildschirm in Blackberry?

+1

welche Emulator/Software fragen Sie? – brian

Antwort

16

Wie Andrey sagte, gibt es einen Bildschirmstapel. Wenn Sie also Bildschirme drücken, ohne sie zu öffnen, bleiben sie im Stapel. Der aktuelle Bildschirm wird geschlossen, der vorherige Bildschirm wird automatisch angezeigt, und wenn kein prev. Bildschirm wird die Anwendung geschlossen.

Es ist jedoch nicht gut, viele Bildschirme im Anzeigestapel zu halten, so dass Sie innerhalb von Bildschirmen eine Art Stapel implementieren können, um die Navigation manuell zu handhaben.

Abstrakt Screen-Klasse für Bildschirm-Stack-Implementierung:

public abstract class AScreen extends MainScreen { 
    Screen prevScreen = null; 

    void openScreen(AScreen nextScreen) { 
     nextScreen.prevScreen = this; 
     UiApplication.getUiApplication().popScreen(this); 
     UiApplication.getUiApplication().pushScreen(nextScreen); 
    } 

    void openPrevScreen() { 
     UiApplication.getUiApplication().popScreen(this); 
     if (null != prevScreen) 
      UiApplication.getUiApplication().pushScreen(prevScreen); 
    } 
} 

Probe ersten Bildschirm:

public class FirstScreen extends AScreen implements FieldChangeListener { 

    ButtonField mButton = null; 

    public FirstScreen() { 
     super(); 
     mButton = new ButtonField("Go second screen", ButtonField.CONSUME_CLICK); 
     mButton.setChangeListener(this); 
     add(mButton); 
    } 

    public void fieldChanged(Field field, int context) { 
     if (mButton == field) { 
      openScreen(new SecondScreen()); 
     } 
    } 
} 

Probe zweiten Bildschirm:

public class SecondScreen extends AScreen implements FieldChangeListener { 

    ButtonField mButton = null; 

    public SecondScreen() { 
     super(); 
     mButton = new ButtonField("Go first screen", ButtonField.CONSUME_CLICK); 
     mButton.setChangeListener(this); 
     add(mButton); 
    } 

    public void fieldChanged(Field field, int context) { 
     if (mButton == field) { 
      openPrevScreen(); 
     } 
    } 

    public boolean onClose() { 
     openPrevScreen(); 
     return true; 
    } 
} 
13

Der BlackBerry unterhält einen Stapel von Bildschirmen; der Anzeigestapel.

Die Bildschirme werden auf den Stapel gelegt und vom Stapel durch die für sie zuständige UiApplication entnommen. Wenn Sie den letzten Bildschirm aus dem Stapel entfernen, wird die Anwendung standardmäßig geschlossen.

Wenn Sie eine UiApplication namens MyUiApplication läuft, können Sie den Bildschirm, um den Stapel hinzufügen, indem pushscreen (neu SomeScreen()) Aufruf;

Der Schirm, wenn von Mainscreen abgeleitet, da die meisten Blackberry-Bildschirme sind, mit dem Flag DEFAULT_CLOSE erstellt wird, dass das ESCAPE-Taste auf dem Blackberry Sinn wird der Bildschirm natürlich schließen, wodurch Besprechungsschutz() aufgerufen werden, . Sie können natürlich PopScreen() nach jedem Tastendruck oder Trackwheel-/Trackball-Klick aufrufen. Der Bildschirm kann auch close() aufrufen, was dasselbe Ergebnis hat; Der Bildschirm wird vom Stapel entfernt, wobei die Anwendung zum vorherigen Bildschirm zurückkehrt oder die Anwendung beendet wird, wenn der letzte Bildschirm vom Anzeige-Stapel entfernt wird.

Wenn die Anwendung nicht als UiApplication erstellt wird oder wenn der Bildschirm ursprünglich von einem Nicht-UI-Thread (z. B. einem Hintergrundthread) auf den Anzeigestapel verschoben wurde, muss sichergestellt werden, dass der Aufruf zum Schließen der Anwendung ausgeführt wird Bildschirm ist auch aus dem UI-Thread getan. Dies kann durchgeführt werden, indem sichergestellt wird, dass die eventLock in der Klasse Application vor der Durchführung einer UI-Operation vorgenommen wird (man würde in dieser Situation normalerweise auch invokeLater aufrufen).

Wenn das Originalbild auf den Stapel als globalen Bildschirm geknallt wurde (modale, über alle anderen Bildschirme), dann muss es den Stapel mit so etwas wie taucht ausgeschaltet werden:

Ui.getUiEngine() .dismissStatus (dies);

In jedem Fall überschreiben onClose() und close() des abgeleiteten Bildschirm werden Sie abzufangen die auftretende Ausnahme für die Fehlersuche und die weitere Analyse ermöglichen.