首页 > 解决方案 > Tizen:使用循环 Genlist

问题描述

我正在 Tizen Studio 中使用 UI Builder 创建一个可穿戴应用程序。

据说这是一种方便的 UI 方式,但这是一个谎言:因为不允许您手动编辑生成的代码。

请告诉我有一些方法可以做到这一点。

更详细地说:我想在下面有一个小图标和一个可滚动列表,以及 Circle Genlist(列表包含 UI Builder 中定义的 6 个项目):https ://docs.tizen.org/application/native/guides/ui/ efl/可穿戴设备/component-circle-genlist/

上面的这个网站指出,对于 Circle Genlist,我必须首先定义正常的 Genlist:

genlist = elm_genlist_add(parent);
circle_genlist = eext_circle_object_genlist_add(genlist, surface);

然后我必须设置滚动策略:

eext_circle_object_genlist_scroller_policy_set(circle_genlist,
                                           ELM_SCROLLER_POLICY_OFF,
                                           ELM_SCROLLER_POLICY_ON);

然后我必须启用它:

eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);

如果我将 Genlist 放到面板中,UI 构建器会添加这些行:

vc->genlist1= elm_genlist_add(vc->box7);
...
vc->circle_object_genlist1= eext_circle_object_genlist_add(vc->genlist1, uib_views_get_instance()->get_window_obj()->circle_surface);
eext_rotary_object_event_activated_set(vc->circle_object_genlist1, EINA_TRUE);

所以它看起来几乎完美,但它并没有制定政策。没问题,只要把那条线放在那里!不。您不能,因为下一个保存/运行操作将重新创建整个 UI,因此将删除您的额外行,并且没有已知的方法可以避免这种情况。(除了手动创建整个 UI)。

但!我可以在创建视图时获取控件,并添加了以下几行:

if(vc2->box7 && vc2->circle_object_genlist1) {
    eext_circle_object_genlist_scroller_policy_set(vc2->circle_object_genlist1, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON);

    Elm_Genlist_Item_Class *title_itc = elm_genlist_item_class_new();
    Elm_Genlist_Item_Class *pad_itc = elm_genlist_item_class_new();

    title_itc->item_style = "title";
    title_itc->func.text_get = _gl_title_text_get;
    //title_itc->func.content_get = gl_title_icon_get;
    title_itc->func.del = NULL;

    pad_itc->item_style = "padding";
    pad_itc->func.del = NULL;

    elm_genlist_item_prepend(vc2->circle_object_genlist1, title_itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
    elm_genlist_item_append(vc2->circle_object_genlist1, pad_itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
}

政策下方的行也是上面链接的 Tizen 网站的建议。

但是,当然也有未知的功能需要进行逆向工程。我最喜欢的是gl_title_icon_get。如果您在 Google 中搜索此内容,您将得到 1 个结果。(或者现在是 2,因为我在这篇文章中也提到了它。)

正如您可能已经发现的那样:即使添加了这些行,模拟器根本不会在侧面显示圆形滚动条。

所以,我想要得到这样的东西:

在此处输入图像描述

但是有了漂亮的圆形滚动条,Samsung Gears 无处不在(仅滚动 Genlist,并将图标留在顶部):

在此处输入图像描述

标签: tizen

解决方案


我没有 UI Builder 的任何专长,但我可以给你一些关于 genlist 小部件的建议。

  1. 滚动条政策

对于circle genlist,我认为您必须仅启用滚动策略的垂直轴。

eext_circle_object_genlist_scroller_policy_set(vc2->circle_object_genlist1, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO); 
// Auto is show scroll bar when the list items can scrollable.

但请检查这个 vc2->circle_object_genlist1 是正确的对象。您可以打印对象指针并检查它是否是相同的地址。

  1. 图标标题

可悲的是,Genlist标题样式只有文本。要显示图标,您可以使用“完整”样式而不是“标题”样式。内容部分名称为“elm.swallow.content”。

在 gl_title_icon_get 回调中,检查部件名称是否为“elm.swallow.content”并返回正确的图像。

所以代码将是,


    title_itc->item_style = "full";
    //title_itc->func.text_get = _gl_title_text_get;
    title_itc->func.content_get = gl_title_icon_get;
    title_itc->func.del = NULL;
    

而 gl_title_icon_get 将是,

static Evas_Object*
gl_title_icon_get(void *data, Evas_Object *obj, const char *part)
{
   if (!strcmp(part, "elm.sawllow.content"))
   {
      Evas_Object *image = elm_image_add(obj);
      elm_image_file_set(image, IMG_URL); //image resource url
      return image;
   }
   return NULL;
}
  1. 添加标题和填充
 elm_genlist_item_prepend(vc2->circle_object_genlist1, title_itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
    elm_genlist_item_append(vc2->circle_object_genlist1, pad_itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);

您在 genlist API 中传递 vc2->circle_object_genlist1 但它需要是 genlist 对象而不是 circle_genlist,因此 vc2->genlist1 是正确的。

 elm_genlist_item_prepend(vc2->genlist1, title_itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
    elm_genlist_item_append(vc2->genlist1, pad_itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);

请检查这里,如果您有更多问题,请在此处回复!谢谢你。


推荐阅读