Я не уверен, что у вас есть такая же необычная мотивация, чтобы разместить более двух корневых виджетов под тегом uibinder. Во всяком случае, так я это делаю.
Поскольку тег uibinder допускает использование только одного корневого виджета, я помещаю HTML-тег ui в качестве корневого виджета, а затем складываю несколько псевдо-корневых виджетов в этот тег.
В следующем примере обратите внимание, что у фактического корневого виджета нет имени поля ui:, потому что мы не собираемся его использовать. Насколько нам известно, эффективными корневыми виджетами являются "tabLayout" и "content".
Файл Hello.ui.xml:
<ui:UiBinder
xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<g:HTML>
<g:TabLayoutPanel ui:field="tabLayout" ... >
blah ... blah
</g:TabLayoutPanel>
<g:VerticalPanel ui:field="content">
blah .. blah
</g:VerticalPanel>
</g:HTML>
</ui:UiBinder>
Не расширяйте составные элементы как Java-код за шаблоном.
Создайте класс, импортированный точкой входа вашего модуля, или используйте шаблон непосредственно в вашем модуле.
У меня есть разные причины, по которым мне нужно более одного корневого виджета. В этом примере я прикрепляю «эффективный корневой виджет» условно:
public class Hello
implements EntryPoint{
private static HelloUiBinder uiBinder = GWT.create(HelloUiBinder.class);
interface HelloUiBinder
extends UiBinder<Widget, Hello>{}
@UiField TabLayoutPanel tabLayout;
@UiField VerticalPanel content;
@Override public void onModuleLoad() {
uiBinder.createAndBindUi(this);
if (condition1)
RootPanel.get().add(tabLayout);
else
RootPanel.get().add(content);
blah ... blah
}
}
Итак, хитрость заключается в том, чтобы вообще не использовать настоящий корневой виджет.