You need to enable JavaScript to run this app. Tizen原生开发采用grid布局时多屏导航跳转异常问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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已经丢失了和自身内容的绑定关系。
  • 连锁反应:
    1. 点击NO按钮触发pop操作时,弹出SCREEN2的item后,剩下的SCREEN1 item因为没有绑定有效内容,渲染阶段没有可显示的对象,就会出现黑屏。
    2. 点击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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 22:15:02