我有一个棘手的情况,只出现在移动设备上,而不是模拟器,所以我需要一些专家帮助来排除故障。这就像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。
答案 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);