GWT共享CSS样式不';行不通
我需要在一些UI活页夹模板中使用相同的样式,所以我按照中所述完成了所有操作: 因此,我做了以下工作: 一,。创建的资源接口: public interface Resources extends ClientBundle { @Source("shared.css") Style style(); public interface Style extends CssResource { String grayedOut(); } } 三,。将带有元素的GWT共享CSS样式不';行不通,css,gwt,uibinder,gwt2,Css,Gwt,Uibinder,Gwt2,我需要在一些UI活页夹模板中使用相同的样式,所以我按照中所述完成了所有操作: 因此,我做了以下工作: 一,。创建的资源接口: public interface Resources extends ClientBundle { @Source("shared.css") Style style(); public interface Style extends CssResource { String grayedOut(); } } 三,。将带有
添加到UI活页夹模板中:
四,。添加了对UI活页夹模板中样式的引用:addStyleNames=“{res.style.grayedOut}”
但是它不起作用。该视图的渲染方式与完全未应用灰色输出样式一样
但我观察到两件事:
在Firebug/Chrome开发工具中,我可以看到元素分配了一个与我试图添加的样式相对应的分散样式名:class=“GAWERH0MI gwt TabLayoutPanelContent”
(GAWERH0MI
似乎与我的grayedOut
类相对应),但我在“元素样式”中找不到它面板,这可能意味着这个类是空的(没有主体)。(我做了实验,并将空类分配给元素,效果与工具中的相同)
当我在.css中更改样式名称时,我得到了一个运行时错误,即无法找到stylegrayedOut
,这似乎意味着我的样式类通常可以成功找到,但由于某些原因无法按预期工作
您可能忘记在Resources.Style
实例上调用ensureInjected()
这是为
自动完成的(因为您没有对ClientBundle
和CssResource
接口进行编码,它们是由UiBinder为您生成的),但不适用于任何其他CssResource
但是,您可以使用@UiField Resources res
,它将被注入
的值,因此在调用createAndBindUi
之后调用res.style().ensureInjected()
在我看来,您最好将资源
实例注入视图,并使用@UiField(provided=true)
,从而确保在实例注入视图之前调用ensureInjected()
,或者选择在每个视图中调用ensureInjected()
。如在ui小部件java文件中所示:
@UiField
Resources res;
public YourWidget() {
initWidget(uiBinder.createAndBindUi(this));
res.style().ensureInjected();
}
ui小部件xml文件:
<ui:with field='res' type="your path to Resource class" />
及
谢谢你,托马斯。但是要调用Resources.style(),我需要一个Resources
的实例,它是由UIBinder内部声明的(您可以通过元素将资源提供给您的模板,但代价是为您实例化它们。
)。那么,我应该何时/如何调用此方法?同样遗憾的是,在我链接的文档中,似乎有一些内容是完整的、有效的示例,但没有提到调用ensureInjected()
,这是该代码正常工作所必需的:(.从不起作用的文档复制示例很容易浪费大量时间。调用ensureInjected
是一件痛苦的事。幸运的是,在CssResource的第二个实例上调用ensureInjected
,对所有相同类型的CssResource都有效。我已经学习了快速的静态{GWT.create();css.ensureInjected();}
在每个UiBinder的Java文件顶部。@Thomas Broyer:这样会很方便(而且不会更贵?)要在
ed ClientBundles的所有CssResource子级上自动调用ensureInjected。@PiotrSobczyk:它记录在@RileyLark:中,您还可以使用@UiField Resources res
注入
的值,从而调用res.style().ensureInjected()
在调用createAndBindUi
之后。自动调用ensureInjected()
意味着将特定于CssResource
的行为添加到
和/或{expansions}
中,这是完全通用的(更不用说你GWT.创建ClientBundle
,而不是CssResource
,并且你可以在UiBinder模板中使用ClientBundle
中定义的CssResource
中的任何/任何/所有s。因此,不,这不会发生。托马斯,请你更新你的答案,以包含以下语句:“您可以使用@UiField Resources res,它将被注入的值,并因此在调用createAndBindUi之后调用res.style().ensureInjected()。”因为这部分对我解决问题来说是最重要的。当您这样做时,我会将您的答案标记为已接受。我认为它比静态初始值设定项优雅得多:).无论如何,谢谢你的意见Riley!
<ui:with field='res' type="your path to Resource class" />
<g:Label addStyleNames="{res.style.grayedOut}" ui:field="icon"></g:Label>