我刚刚创建了小部件:
public class myWidget<T> extends FlowPanel {
private T value;
public T getValue()
{
return value;
}
public myWidget(T[] values) {
for (T value : values)
{
//do action
}
}
如何使用 UiBinder 添加它?有可能吗?
是的你可以。您必须将包含myWidget
该类的包导入 XML 命名空间。假设你的包被调用com.test.widgets
,声明式布局如下所示:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:my='urn:import:com.test.widgets'>
<my:myWidget>
<g:Label>A label</g:Label>
<g:Label>A second label</g:Label>
</my:myWidget>
</ui:UiBinder>
注意导入xmlns:my='urn:import:com.test.widgets'
和使用<my:myWidget>
。
要让您的小部件在 Uibinder 中可用,它必须至少实现 IsWidget 接口。作为一个小部件,它当然已经实现了 IsWidget。
因此,任何非小部件也可以通过实现 IsWidget 来用作 uibinder 中的子小部件元素。
IsWidget 接口需要非小部件来实现方法asWidget()
。因此,这样的非小部件必须充当小部件容器。
实现 IsWidget 将只允许将该类用作子小部件元素。
假设你的班级是
com.zzz.client.ui.HelloKitty
为了能够拥有子小部件元素,它必须实现HasWidgets
.
<ui:UiBinder
xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:z='urn:import:com.zzz.client.ui'>
<g:VerticalPanel>
<z:HelloKitty>
<g:button ..../>
<g:textbox>asdf</g:textbox>
</z:HelloKitty>
<g:VerticalPanel>
</ui:UiBinder>
或者,它也可以只实现 HasOneWidget。
为了允许类在其 uibinder 标记之间有文本,它必须实现 HasText。
<ui:UiBinder
xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:z='urn:import:com.zzz.client.ui'>
<g:VerticalPanel>
<z:HelloKitty>qwerty</z:HelloKitty>
<g:VerticalPanel>
</ui:UiBinder>
为了在其标签之间接受有效的 HTML,我相信你应该让它实现 HasHTML。
似乎没有一个答案集中在通用部分。正如其他人所提到的,您可以通过省略泛型类型轻松地在 UiBinder 模板中添加泛型小部件:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:my='urn:import:com.test.widgets'>
<my:myWidget />
</ui:UiBinder>
但是,如果您想在 Java 代码中引用这个小部件怎么办?您是否也应该在此处省略泛型类型并引起编译器警告的愤怒?
谢天谢地,没有。UiBinder 在类型方面非常松散,因为泛型类型只是提示,您可以在支持上述 UiBinder 模板的 Java 代码中摆脱以下内容:
@UiField(provided = true)
myWidget<Date> myWidget = new myWidget(new Date(), new Date());
或者,您也可以使用文档@UiFactory
中提到的方法。