首页 文章

CodenameOne从Ushuilder应用程序中的Splash Screen导航到“第一次使用”表单

提问于
浏览
3

我有一个棘手的情况,只出现在移动设备,而不是模拟器,所以我需要一些专家帮助进行故障排除 . 这就像stateMachine在显示我的“FirstTimeSetup”表单后简要地将我带回SplashScreen(或做了一些奇怪的后转换) .

这是我的设置:我使用GUIBuilder构建应用程序,其形式为 SplashScreen ,将首先显示,然后在processBackground中发生某些网络连接后自动转换为表单 Main .

这工作正常,但在第一次开始时,(当没有设置首选项时)我想显示一个不同的形式: FirstTimeSetup . 我能看到这样做的最好方法如下:

1)在processBackground中,如果它是第一次运行则立即返回false,这样它就不会转换为Main .

protected boolean processBackground(Form f) {
    if ("SplashScreen".equals(f.getName())) {
        if (Preferences.get(PREFS_FIRST_TIME_SETUP,true)){
            //return false to indicate that we should not proceed to next_form specified in property
            //we do this because postSplashScreen will trigger the load of the "FirstTimeSetup" form
            return false;
        }
        //...continue with normal app initialization if this is not the first time

2)在postSplashScreen中,我再次检查它是否是第一次加载,然后禁用后退命令并将showForm调用到First Time Setup表单 .

@Override
protected void postSplashScreen(Form f) {
    if (Preferences.get(PREFS_FIRST_TIME_SETUP, true)) {
        //disable back command for this form
        setBackCommandEnabled(false);
        showForm("FirstTimeSetup", null);
    }
}

3)在postFirstTimeSetup方法中,我显示一些对话框来解释用户的下一步,做一些网络检查以确保我们可以继续注册,然后结束方法,这样用户就可以与对话框进行交互并注册 . 就在这时,在iOS或Android设备上,我看到SplashScreen的幻灯片转换,然后立即重新显示FirstTimeSetup表单,并且在用户能够与表单交互之前执行此操作两次 .

4)有时(它不一致),postFirstTimeSetup方法将再次执行(提示用户的相同对话框再次显示!) .

感觉就像我从processBackground返回false并且postSplashScreen方法已经完成后,一些SplashScreen自动转换仍在尝试执行...任何建议都有助于消除这种奇怪的双重转换!

UPDATE: 随着进一步调整和调查我意识到这似乎是由Android权限对话框引起的,这就是为什么它只在最初安装应用程序时发生 .

在processBackground中,我进行第一次网络调用(提示网络使用权限对话框)并访问设备参数IMEI和UUID以获取设备标识符(提示“允许访问电话”权限) . 在关闭每个对话框后,SplashScreen表单似乎重新进入,导致重新显示带有过渡动画的表单(我想还要重新运行processBackground!重新执行所有的初始屏幕初始化工作!) .

So here's the updated question: 如何获取Android权限对话框以阻止SpashScreen重新加载?

我已经尝试将触发的命令移动到initVars,但随后我在空白屏幕上获得权限对话框,然后启动屏幕快速转换两次,就像我在此视频中分享的一样:youtu.be/2QpdaeigNZ8

我已经尝试在callSerially()中包装两个“触发器”(导致权限的命令),这样它会延迟对话框,直到至少显示SplashScreen表单,然后显示表单,并显示权限对话框,单击“允许”,然后再次显示splashScreen表单,然后弹出第二个权限对话框 . 我时钟允许然后再重新显示splashScreen .

1 回答

  • 2

    解决方案是在 processBackground() 中执行您的逻辑并删除 postSplashScreen ,然后在此方法结束时返回false .

    @Override
    protected boolean processBackground(final Form f) {
        if ("SplashScreen".equalsIgnoreCase(f.getName())) {
            new UITimer(() -> {
                if (Preferences.get(PREFS_FIRST_TIME_SETUP, true)) {
                    showForm("FirstTimeSetup", null);
                } else {
                    showForm("Main", null);// or any other form you want to show
                }
            }).schedule(3000, false, f); //wait 3 seconds before proceeding
        }
        return false; //always return false at the end
    }
    

    然后在 FirstTimeSetup 表单的 postShow() (即 postFirstTimeSetup() 方法)中,记得将 PREFS_FIRST_TIME_SETUP 设置为 false .

    Preferences.set(PREFS_FIRST_TIME_SETUP, false);
    

相关问题