如果用户正在从移动网络浏览器或桌面网络浏览器访问,我希望在我的GWT应用程序中加载不同的用户界面。我想知道如何编辑我的Application.gwt.xml文件更改基于形状因子加载哪个入口点类。我认为这可能是这些问题,但我只是在黑客攻击,所以我想知道是否有人有任何想法?
<entry-point class="webapp.client.WebAppEntryPoint">
<when-property-is name="formfactor" value="desktop"/>
</entry-point>
<entry-point class="webapp.client.MobileAppEntryPoint">
<when-property-is name="formfactor" value="mobile"/>
</entry-point>
干杯。
答案 0 :(得分:4)
它几乎和你描述的一样容易 - 也就是说,一旦你计算出formfactor
属性以及如何为它选择一个值。
事实证明,当您创建一个入口点并在模块中声明它时,编译器会使用GWT.create
来实际创建它的实例。这使得它受模块中声明的重新绑定规则的约束。因此,如果WebAppEntryPoint
和MobileAppEntryPoint
都继承自某个常见的超类,则可以在模块中声明该入口点,并对触发它们的规则略有不同:
<entry-point class="webapp.client.AbstractAppEntryPoint" />
<replace-with class="webapp.client.WebAppEntryPoint">
<when-type-is class="webapp.client.AbstractAppEntryPoint" />
<when-property-is name="formfactor" value="desktop"/>
</entry-point>
<replace-with class="webapp.client.MobileAppEntryPoint">
<when-type-is class="webapp.client.AbstractAppEntryPoint" />
<when-property-is name="formfactor" value="mobile"/>
</entry-point>
这些规则规定:“当GWT尝试启动应用时,请使用AbstractEntryPoint
(实现EntryPoint
)来执行此操作。当有人调用GWT.create(AbstractEntryPoint)
并且formfactor
时, desktop
,为他们提供WebAppEntryPoint
个实例。当有人调用GWT.create(AbstractEntryPoint)
且formfactor
为mobil
时,请为他们提供MobileAppEntryPoint
个实例。
这就留下了困难的部分 - 如何构建formfactor
属性,定义可能的值,并让应用程序在启动时选择正确的值?
为了帮助回答这个问题,让我们看一下GWT中已经存在的两个标准属性 - locale
和user.agent
。在com.google.gwt.useragent.UserAgent模块中管理用户检测 - 定义了属性,列出了一种选择属性的方法,并且一些有用的“确保将此布线工作”位添加到应用程序中。可能的语言环境在com.google.gwt.i18n.I18N中启动,但可以在您自己的应用程序中进行扩展。这里还有很多额外的东西,定义了如何选择应该激活哪个语言环境。我们想要窃取从user.agent预定义可能的形式因子的想法,并且想要从区域代码中读取正确的形式因子。
首先,定义属性。
<define-property name="formfactor" values="desktop, mobile" />
在这个例子中,我们只允许这两个可能的值 - 实际上,您可能需要桌面(即大型和鼠标/键盘),平板电脑(大型和触摸式),手机(小型和触摸式)或其他一些对此有所不同。
接下来,决定如何阅读正确的属性值。有两种基本方法可以做到这一点 - 通过简单的javascript片段,在模块文件中编写,以及根据一些配置设置编写生成JavaScript的类。我将首先使用最简单的一个,让你找出如何在javascript中实际检测这个细节(更新问题或评论,如果你可以进一步澄清你有/期望/期望):
<!-- borrowing/adapting from
http://code.google.com/p/google-web-toolkit/wiki/ConditionalProperties -->
<property-provider name="formfactor"><![CDATA[
{
var ua = window.navigator.userAgent.toLowerCase();
if (ua.indexOf('android') != -1) { return 'mobile'; }
if (ua.indexOf('iphone') != -1) { return 'mobile'; }
return 'desktop';
}
]]></property-provider>
同样,这是在模块中,并定义了一些简单的JavaScript来选择formfactor
的值 - 如果useragent包含字符串'android'或'iphone',则激活mobile
值,否则激活desktop
。此代码将放在您的.nocache.js
文件中,用于选择正确的排列(使用正确的入口点,如上所述)。
答案 1 :(得分:2)
除了科林的详细答案,您可以查看GWT的mobilewebapp标准示例 - http://code.google.com/p/google-web-toolkit/source/browse/#svn%2Ftrunk%2Fsamples%2Fmobilewebapp
示例FormFactor.gwt.xml - http://code.google.com/p/google-web-toolkit/source/browse/trunk/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/FormFactor.gwt.xml
答案 2 :(得分:0)
您可以使用replace with
<replace-with class="webapp.client.MobileAppEntryPoint">
<when-type-is class="webapp.client.WebAppEntryPoint" />
<any>
<when-property-is name="formfactor" value="mobile"/>
</any>
</replace-with>
注意:我没有尝试使用入口点类..但是对于某些Widget
类
详情请参阅Gwt differed binding
答案 3 :(得分:0)
解决:
好的,感谢所有回复的人。我使用了一点点每个人的答案来解决问题!首先,我遵循SSR并查看示例FormFactor.gwt.xml文件。我将其复制到我的项目中并在我的App.gwt.xml文件中引用它。然后我跟着Colins并将以下代码添加到我的App.gwt.xml文件中,以便根据外形加载不同的EntryPoint:
<entry-point class="webapp.client.AbstractEntryPoint" />
<replace-with class="webapp.client.WebAppEntryPoint">
<when-type-is class="webapp.client.AbstractEntryPoint" />
<when-property-is name="formfactor" value="desktop"/>
</replace-with>
<replace-with class="webapp.client.MobileAppEntryPoint">
<when-type-is class="webapp.client.AbstractEntryPoint" />
<when-property-is name="formfactor" value="mobile"/>
</replace-with>