3 votes

Fenêtre contextuelle globale pour Blackberry

J'essaie de faire apparaître un dialogue global à partir d'une discussion en arrière-plan que j'ai démarrée à partir d'un autre point d'entrée.

public static void main(String[] args) {
    MyApp theApp = new MyApp();  
    if (args != null && args.length > 0 && args[0].equals("test")) {
        new Thread(new Runnable() {
            public void run() {
                try {
                    synchronized (UiApplication.getEventLock()) {
                        UiEngine ui = Ui.getUiEngine();
                        Screen screen = new Dialog(Dialog.D_OK, "Test", Dialog.OK,
                                                   Bitmap.getPredefinedBitmap(Bitmap.EXCLAMATION),
                                                   Manager.VERTICAL_SCROLL);
                        ui.pushGlobalScreen(screen, 1, UiEngine.GLOBAL_MODAL);
                    }
                } catch (Exception e) {
                    System.out.println(e.toString());
                }
            }
        }).start();
    } else {
        theApp.enterEventDispatcher();
    }
}

J'ai essayé de nombreuses variantes pour le faire fonctionner, mais il ne s'affiche toujours pas. J'ai essayé

synchronisation Application.getEventLock() J'ai également essayé
UiApplication.getUiApplication().invokeLater , UiApplication.getUiApplication().invokeAndWait . J'ai même essayé synchronizing the eventlock avant d'appeler le invokeLater (ce qui me semble redondant, mais j'ai quand même essayé...). Je ne suis pas sûr de savoir ce que je fais de travers.

2voto

BBdev Points 2737

Ok, je vous donne un exemple de démonstration ....

Tout d'abord, modifiez le BlackBerry_App_Descriptor.xml cliquer sur Application Tab Dans ApplicationArgument, écrire alternate et cochez la case Exécution automatique au démarrage Cliquer sur Alternate Entry Points cliquez sur ajouter et écrivez le titre BackgroundApp

Créez une classe qui étendra la classe Application plutôt que la classe UiApplication de la manière suivante

import net.rim.device.api.system.Alert;
import net.rim.device.api.system.Application;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.Screen;
import net.rim.device.api.ui.Ui;
import net.rim.device.api.ui.UiEngine;
import net.rim.device.api.ui.component.Dialog;

public class BackGroundApp extends Application {
//  this class is used for the background processing .....

     public void startBackgroundThread()
        {
            new Thread(){
                public void run() {
                    while (true) {
                        try {
                            Thread.sleep(60000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        synchronized (getEventLock()) {

                            //with this UiEngine pushGlobal dialogs

                            //whenever with the app in background

                            UiEngine ui = Ui.getUiEngine();
                            Screen screen = new Dialog(Dialog.D\_OK, "You have updates!",
                                    Dialog.OK, Bitmap
                                            .getPredefinedBitmap(Bitmap.EXCLAMATION),
                                    Manager.VERTICAL\_SCROLL);
                            ui.pushGlobalScreen(screen, 1, UiEngine.GLOBAL\_QUEUE);

                        }
                    }
                }
            }.start();
        }

}

Créez une classe qui étendra la classe UiApplication de la manière suivante

public class GuiTest extends UiApplication {
    static Timer t; 

    public static void main(String\[\] args) {

         if(args.length>0&&"alternate".equals(args\[0\])){

                            BackGroundApp app = new BackGroundApp();
                            app.startBackgroundThread();
                            app.enterEventDispatcher();

            }

         else{
             GuiTest test = new GuiTest();          
             test.enterEventDispatcher();
         }
    }
    public GuiTest(){
        Myscreen screeMyscreen = new Myscreen();
        pushScreen(screeMyscreen);
    }

}

Maintenant, créez une classe MyScreen et ajoutez-y toutes vos Ui .... et poussez l'écran.

public class Myscreen extends MainScreen {

    public Myscreen(){
    CreateGui();
    }

    public void CreateGui(){
       // Your Ui goes here .......
     }

}

Exécutez l'exemple et vous verrez qu'après une minute, un dialogue apparaîtra sur votre écran, que vous soyez dans l'application ou en dehors. Merci de votre aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X