CodenameOne从Splash Screen导航到"第一次使用" UIBuilder应用中的表单

时间:2017-02-20 23:14:57

标签: codenameone

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

以下是我的设置:我使用GUIBuilder构建了一个带有 SplashScreen 表单的应用程序,该表单将首先显示,然后自动转换为表单 Main 在processBackground中发生一些网络连接之后。

工作正常,但在第一次开始时,(当没有设置首选项时)我想显示一个不同的形式: 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调用到首次设置表单。

@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自动转换仍在尝试执行...任何建议都有助于消除这种奇怪的双重转换!

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

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

所以这里有更新的问题:如何获取Android权限对话框以阻止SpashScreen重新加载?

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

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

1 个答案:

答案 0 :(得分:2)

解决方案是在postSplashScreen中执行逻辑并删除@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 } ,然后在此方法结束时返回false。

FirstTimeSetup

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

Preferences.set(PREFS_FIRST_TIME_SETUP, false);