AppInventor2”屏幕.关闭其他屏幕时”这个事件是怎么触发的?

// 问题来源 //

有会员提问:“当屏幕1.关闭其他屏幕时”这个事件是怎么触发的?本文通过案例验证对这个事件进行分析,并与“屏幕.回退”事件进行了简单的对比,相关内容均已更新进了中文文档,点击“阅读原文”直达~

// 案例验证 //

  • 关闭其他屏幕时(其他屏幕名称,返回结果)

    当另一个屏幕关闭并且控制权返回到此屏幕时触发该事件。2个屏幕之间的交互方法。测试案例如下:

    • Screen1的事件如下:

      图片

    • Screen1跳转到屏幕test时,屏幕test调用关闭屏幕并返回值方法后,上面的事件就会触发,代码如下:

      图片

    • 事件触发后的测试结果。Screen1打印出了关闭前的屏幕名称及关闭时返回的值(值类型是Any,即 任意类型都支持),效果如下:

      图片

    • 按下设备的返回键也可以触发这个事件,不过“返回结果”参数为空。

    • 注:只有关闭屏幕并返回值方法能触发,如下2种普通的屏幕跳转方法并不能触发这个事件:

      图片

// 回退 vs 关闭其他屏幕 //

事件作用对象触发方式
回退时仅针对当前屏幕的行为当前屏幕按下了设备返回键时触发(需要编译安装App后测试,AI伴侣返回键无法捕获测试不了)
关闭其他屏幕时2个屏幕之间的交互第二个屏幕调用关闭屏幕并返回值方法后,触发第一个屏幕的该事件(按设备返回键也可触发,此时“返回结果”参数为空)

来源:用户界面(UI)组件 · App Inventor 2 中文网 

<think>好的,我现在需要解决用户在App Inventor屏幕2调用蓝牙数据的问题。用户希望看到具体的示例教程,所以我要先整理相关步骤。首先,我应该回顾一下用户提供的引用资料,特别是引用3和4,因为它们提到了蓝牙数据传递和跨界面连接。 根据引用3,屏幕2的文本输入框已经能自动获取蓝牙数据,说明数据传递可能在屏幕切换已经处理好了。用户可能需要知道如何在屏幕2中接收来自蓝牙的数据。引用4提到了调用蓝牙发送字符给单片机,这可能涉及到发送和接收数据的方法。 接下来,我需要确定App Inventor中蓝牙组件的基本使用方法。通常,蓝牙组件需要在两个屏幕之间共享数据,可能需要使用全局变量或者直接通过屏幕初始化的参数传递。不过App Inventor屏幕之间不能直接共享组件,所以可能需要使用文件或者TinyDB来存储数据,或者在打开屏幕传递数据。 但根据引用3的描述,屏幕2打开自动获取蓝牙数据,可能是在屏幕2的初始化事件中处理了蓝牙数据的读取。例如,当屏幕2启动,自动从蓝牙连接中读取数据并显示在文本输入框中。这可能涉及到在Screen2的Initialize事件中调用蓝牙接收数据的方法。 然后,我需要考虑如何将蓝牙接收到的数据传递到屏幕2。可能的步骤包括:在屏幕1中建立蓝牙连接,当数据接收,存储到某个地方(比如TinyDB),然后在屏幕2中读取这个数据。或者,在打开屏幕2,将数据作为参数传递过去。不过App Inventor屏幕切换方法是否支持参数传递呢?查阅资料发现,App Inventor默认的打开另一个屏幕的方式并不直接支持参数传递,所以可能需要使用TinyDB或者文件来临存储数据。 结合引用3中的例子,用户提到屏幕2的文本输入框自动获取了蓝牙数据,这可能意味着在屏幕2的初始化过程中,程序主动去读取蓝牙组件接收到的数据。这需要蓝牙组件在屏幕2中也被正确配置,或者蓝牙连接在屏幕切换保持活动状态。 现在,我需要构建一个示例步骤:在屏幕1中建立蓝牙连接,当收到数据,保存到TinyDB,然后在屏幕2中读取。或者,如果蓝牙组件在屏幕2中也存在,并且保持连接,可以直接在屏幕2中处理数据接收。不过,蓝牙组件在不同屏幕中的管理可能需要特别注意,比如在屏幕1中连接设备,然后在屏幕2中继续使用同一个连接。 可能的解决方案是,在屏幕1中完成蓝牙设备的连接,然后在屏幕2中直接使用蓝牙客户端组件接收数据。因为蓝牙连接一旦建立,在多个屏幕中可能仍然有效,只要组件被正确引用。但需要确认组件的作用域。如果蓝牙客户端组件在屏幕1中,那么屏幕2无法直接访问,所以可能需要将蓝牙客户端放在全局模块中,但App Inventor中组件是绑定到具体屏幕的,所以可能需要将蓝牙客户端放在屏幕2中,或者在屏幕1中连接后,将连接信息传递给屏幕2。 但根据引用3的描述,屏幕2的文本输入框自动获取了蓝牙数据,可能是在屏幕2中放置了蓝牙客户端组件,并且在屏幕2打开自动接收数据。因此,步骤可能如下: 1.屏幕1中,用户选择并连接蓝牙设备。 2. 当需要切换到屏幕2,保持蓝牙连接,并在屏幕2中也放置蓝牙客户端组件,但可能需要共享连接信息。 3.屏幕2的Initialize事件中,设置蓝牙客户端并开始监听数据。 4. 当蓝牙数据到达,将其显示在屏幕2的文本输入框中。 不过这可能涉及到在两个屏幕中处理蓝牙连接的问题,需要更具体的指导。或者,可能使用一个单独的模块或TinyDB来保存接收到的数据,然后在屏幕2中读取。例如: 在屏幕1中,当蓝牙接收到数据,将数据保存到TinyDB中。然后在屏幕2打开,从TinyDB中读取该数据并显示。但这种方法可能会有延迟,数据可能不是实的。 另一个方法是,在屏幕1中连接蓝牙设备,并在接收到数据,直接打开屏幕2并传递数据。但App Inventor的打开屏幕方法不支持传递参数,所以可能需要使用TinyDB临存储,然后屏幕2初始化读取。 现在需要编写示例代码,可能包括以下部分: 在屏幕1中: - 蓝牙客户端组件 - 按钮或其他方式触发连接设备 - 当收到数据,保存到TinyDB,并打开屏幕2屏幕2中: - 在Initialize事件中,从TinyDB读取数据并显示 - 或者,直接在屏幕2中放置蓝牙客户端,继续监听数据 但根据引用4中的代码示例,发送数据是通过蓝牙客户端调用发送方法,而接收数据可能需要处理蓝牙客户端的DataReceived事件。因此,在屏幕2中,如果蓝牙客户端组件存在,并且已经连接,就可以直接处理接收事件。 可能的正确步骤是: 1.屏幕1中,使用蓝牙客户端连接设备。 2. 当连接成功后,打开屏幕2。 3. 屏幕2中也包含蓝牙客户端组件,并且共享相同的连接(需要确认是否可行)。 4.屏幕2的蓝牙客户端的DataReceived事件中,将接收到的数据更新到文本输入框。 不过,由于每个屏幕的组件是独立的,可能需要在屏幕2中重新初始化蓝牙连接,或者保持连接在后台活动。这可能比较复杂。 另一种方法是将蓝牙客户端的操作集中在屏幕1,当需要传递数据到屏幕2,使用TinyDB。例如: 屏幕1的蓝牙客户端接收到数据后,保存到TinyDB,然后屏幕2在打开读取TinyDB中的数据。但这样数据不会实更新。 或者,使用App Inventor的Web组件和本地Web服务,但这可能复杂。 回到引用3的具体情况,用户提到屏幕2的文本输入框自动获取蓝牙数据,可能是在屏幕2中直接处理蓝牙接收,而蓝牙连接已经在屏幕1中建立。可能的关键点是,蓝牙连接在屏幕切换后仍然保持,因此在屏幕2中可以直接监听数据。 因此,正确的示例可能包括: 在屏幕1中连接蓝牙设备,然后打开屏幕2屏幕2中的蓝牙客户端组件继续使用已建立的连接,并在DataReceived事件中更新UI。但需要确认是否在屏幕2中需要重新初始化蓝牙连接,或者连接是否全局有效。 根据App Inventor的文档,蓝牙客户端组件是每个屏幕独立的,因此可能在屏幕2中需要重新连接设备。但这样不太方便。所以,更可能的是使用TinyDB在屏幕之间传递数据。 综上,正确的步骤可能如下: 屏幕1中的逻辑: - 使用蓝牙客户端选择并连接设备 - 当数据接收,保存到TinyDB - 打开屏幕2 屏幕2中的逻辑: - 在Initialize事件中,从TinyDB读取数据并显示 - 可能还需要在屏幕2中设置定器,定期检查TinyDB中的新数据 但这种方法无法实显示数据。更好的办法是使用一个单独的屏幕来管理蓝牙连接,或者在屏幕切换保持蓝牙连接的活动。 可能用户引用3中的实现方式是,在屏幕2中放置蓝牙客户端组件,并在屏幕初始化自动接收数据。这可能需要屏幕2中的蓝牙客户端组件在打开已经连接到设备。所以,用户可能在屏幕1中处理设备选择,然后将设备地址传递给屏幕2屏幕2在初始化使用该地址进行连接。 但如何在App Inventor中传递设备地址呢?可能需要使用TinyDB或者全局变量。 例如: 屏幕1: - 用户选择蓝牙设备,连接后,将设备地址保存到TinyDB - 打开屏幕2 屏幕2: - 在Initialize事件中,从TinyDB读取设备地址,并使用蓝牙客户端连接 - 在蓝牙客户端的DataReceived事件中,更新文本输入框 这样,屏幕2在初始化会自动连接设备,并开始接收数据。 这样,示例代码的结构应该是: 屏幕1中的块: - 当选择设备后,蓝牙客户端连接,保存地址到TinyDB,然后打开屏幕2 屏幕2中的块: - 初始化,从TinyDB读取地址,蓝牙客户端连接 - DataReceived事件中将数据显示到文本输入框 这可能更符合引用3中的描述。 因此,步骤总结: 1. 屏幕1完成蓝牙配对和连接,存储设备信息到TinyDB 2. 打开屏幕2,读取设备信息并自动连接 3. 屏幕2的蓝牙组件监听数据并实显示 现在需要将这些步骤转化为具体的App Inventor块示例,并注意蓝牙组件的配置。 可能需要使用Notifier组件或Clock组件来处理连接和数据接收的异步过程。 最后,根据用户提供的引用,尤其是引用3和4,生成示例代码块,并解释步骤。同,确保回答结构清晰,分步骤说明,并附上代码块。</think>在App Inventor中实现屏幕2调用蓝牙数据传递,可通过以下步骤实现: ### 分步实现方法 1. **屏幕1建立蓝牙连接** - 使用`蓝牙客户端`组件完成设备搜索与连接 - 连接成功后通过`TinyDB`存储设备地址 ```appinventor // 屏幕1连接按钮点击事件 当 连接按钮.点击 执行 如果 蓝牙客户端.地址不为空 则 TinyDB1.存储值("bt_address", 蓝牙客户端.地址) 打开屏幕(屏幕2) ``` 2. **屏幕2初始化连接** - 通过`Screen.Initialize`事件自动读取存储的设备地址 - 使用`蓝牙客户端`建立持久化连接 ```appinventor // 屏幕2初始化事件屏幕2.初始化 执行 变量 address = TinyDB1.获取值("bt_address") 如果 address 不为空 则 蓝牙客户端1.连接地址(address) ``` 3. **实数据接收显示** - 通过`蓝牙客户端.DataReceived`事件监听实数据流 - 将HEX数据转换为文本显示在UI组件 ```appinventor // 屏幕2数据接收事件 当 蓝牙客户端1.收到数据 执行 变量 receivedData = 转换工具.字节转文本(蓝牙客户端1.接收数据) 文本框1.文本 = receivedData ``` ### 关键技术点 1. **连接持久化**:通过`TinyDB`实现跨屏幕设备地址共享[^3] 2. **异步通信**:使用`DataReceived`事件监听确保数据实性[^4] 3. **编码转换**:需要处理二进制数据到可读文本的转换逻辑 ### 完整组件布局建议 | 组件类型 | 命名 | 属性设置 | |------------|---------------|-------------------------| | BluetoothClient | 蓝牙客户端1 | 在屏幕2中可见性设为隐藏 | | TextBox | 文本框1 | 启用多行显示 | | TinyDB | TinyDB1 | 使用默认配置 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI2中文网

真诚赞赏,手留余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值