gpt4 book ai didi

CodenameOne 在 UIBuilder 应用程序中从初始屏幕导航到 "first time use"表单

转载 作者:行者123 更新时间:2023-12-04 03:09:14 24 4
gpt4 key购买 nike

我有一个棘手的情况,只出现在移动设备上,而不是模拟器上,所以我需要一些专家的帮助来解决问题。这就像 stateMachine 在显示我的“FirstTimeSetup”表单后短暂地将我带回 SplashScreen(或进行一些奇怪的返回转换)。

这是我的设置:我使用 GUIBuilder 构建了一个表单 SplashScreen 的应用程序,它将首先显示,然后在一些网络连接后自动转换到表单 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 调用到首次设置表单。

@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 以获取设备标识符(提示“允许访问电话”权限)。关闭每个对话框后,SplashScreen 表单似乎重新进入,导致重新显示带有过渡动画的表单(我认为还重新运行 processBackground!重新执行我所有的启动屏幕初始化工作!)。

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

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

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

最佳答案

解决方案是在 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_SETUPfalse

Preferences.set(PREFS_FIRST_TIME_SETUP, false);

关于CodenameOne 在 UIBuilder 应用程序中从初始屏幕导航到 "first time use"表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42355887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com