Tizen原生开发采用grid布局时多屏导航跳转异常问题求助
问题根因
- 核心逻辑错误:在SCREEN1按钮的点击回调中,手动调用
elm_object_content_set(nf, grid)直接修改naviframe的全局内容,完全破坏了naviframe的页面栈管理机制。- naviframe的设计逻辑是通过内部的item栈维护所有页面,所有页面内容的显示、切换都由栈顶item触发,手动修改容器内容会直接覆盖已有item绑定的关联关系,导致栈结构失配。
- 这个错误操作发生在
elm_naviframe_item_push()之前:先把SCREEN1页面绑定的grid从naviframe的展示关系里抹掉,替换成了SCREEN2的grid,之后再push新的SCREEN2 item时,naviframe内部的SCREEN1 item已经丢失了和自身内容的绑定关系。
- 连锁反应:
- 点击NO按钮触发pop操作时,弹出SCREEN2的item后,剩下的SCREEN1 item因为没有绑定有效内容,渲染阶段没有可显示的对象,就会出现黑屏。
- 点击YES按钮弹出提示弹窗后,因为naviframe的栈结构已经错乱,弹窗关闭后栈顶依然停留在绑定了错误内容的SCREEN2 item上,无法正常回到SCREEN1。
修正方案
- 移除SCREEN1点击回调中错误的
elm_object_content_set(nf, grid);代码行。naviframe在调用elm_naviframe_item_push()时,会自动将传入的内容对象设置为当前页的展示内容,完全不需要手动操作容器的content属性。 - 不要使用全局变量存储SCREEN2页面的控件句柄,将no按钮、yes按钮都作为局部变量添加到SCREEN2的grid容器中,依赖EFL对象树的自动生命周期管理机制,避免野指针和内存泄漏问题。
- 弹窗逻辑调整:提示弹窗作为独立的对象添加到窗口层面,弹窗定时关闭后直接调用
elm_naviframe_item_pop(nf)即可正常回到SCREEN1,不要在弹窗关闭回调中额外做push操作。
修正后的核心代码片段
static void screen1_button_clicked(void *data, Evas_Object *obj, void *event_info){ Evas_Object *nf = data; Evas_Object *grid; /* 初始化SCREEN2的grid容器 */ grid = elm_grid_add(nf); evas_object_show(grid); // 错误代码已删除:elm_object_content_set(nf, grid); // 直接将grid作为push的页面内容,由naviframe自动管理栈结构 elm_naviframe_item_push(nf, "Screen 2", NULL, NULL, grid, NULL); /* 添加NO按钮 */ Evas_Object *no_button = elm_button_add(grid); elm_object_style_set(no_button, "circle"); elm_grid_pack(grid, no_button, 5, 35, 50, 50); evas_object_show(no_button); evas_object_smart_callback_add(no_button, "clicked", no_button_clicked, nf); Evas_Object *no_icon = elm_icon_add(no_button); elm_image_file_set(no_icon, ICON_DIR "/no_button.png", NULL); evas_object_size_hint_min_set(no_icon, 100, 100); evas_object_size_hint_max_set(no_icon, 100, 100); elm_object_part_content_set(no_button, "icon", no_icon); evas_object_show(no_icon); /* 添加YES按钮 */ Evas_Object *yes_button = elm_button_add(grid); elm_object_style_set(yes_button, "circle"); elm_grid_pack(grid, yes_button, 45, 35, 50, 50); evas_object_show(yes_button); evas_object_smart_callback_add(yes_button, "clicked", yes_button_clicked, nf); Evas_Object *yes_icon = elm_icon_add(yes_button); elm_image_file_set(yes_icon, ICON_DIR "/yes_button.png", NULL); evas_object_size_hint_min_set(yes_icon, 100, 100); evas_object_size_hint_max_set(yes_icon, 100, 100); elm_object_part_content_set(yes_button, "icon", yes_icon); evas_object_show(yes_icon); } static void no_button_clicked(void *data, Evas_Object *obj, void *event_info){ Evas_Object *nf = data; // 栈结构正常后,pop会正常移除SCREEN2页面,显示SCREEN1 elm_naviframe_item_pop(nf); }
按照以上调整后,导航跳转逻辑将恢复正常:NO按钮点击会直接返回SCREEN1无黑屏,YES按钮弹窗5秒关闭后会正常pop返回SCREEN1。
内容的提问来源于stack exchange,提问作者Spantula
相关产品推荐
相关产品推荐

