Gwt 基于形状因子更改入口点类
如果用户从移动web浏览器或桌面web浏览器访问,我希望在我的GWT应用程序中加载不同的用户界面。我想知道如何编辑Application.gwt.xml文件,根据形状因素更改加载的入口点类。我想这可能是一些类似的东西,但我只是黑客,所以我想知道是否有人有任何想法Gwt 基于形状因子更改入口点类,gwt,mobile,Gwt,Mobile,如果用户从移动web浏览器或桌面web浏览器访问,我希望在我的GWT应用程序中加载不同的用户界面。我想知道如何编辑Application.gwt.xml文件,根据形状因素更改加载的入口点类。我想这可能是一些类似的东西,但我只是黑客,所以我想知道是否有人有任何想法 <entry-point class="webapp.client.WebAppEntryPoint"> <when-property-is name="formfactor" value="desktop"/>
<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>
干杯 您可以使用
替换为
<replace-with class="webapp.client.MobileAppEntryPoint">
<when-type-is class="webapp.client.WebAppEntryPoint" />
<any>
<when-property-is name="formfactor" value="mobile"/>
</any>
</replace-with>
这几乎和您描述的一样简单——也就是说,一旦您计算出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>
在本例中,我们只允许这两个可能的值-实际上,您可能需要桌面(即大屏幕和鼠标/键盘)、平板电脑(大屏幕和触摸屏)、手机(小屏幕和触摸屏)或其他一些变体
接下来,决定如何读取正确的属性值。有两种基本方法可以做到这一点——通过在模块文件中编写的简单javascript片段,以及根据一些配置设置编写生成javascript的类。首先,我将使用最简单的方法,让您了解如何在javascript中实际检测此细节(如果您可以进一步澄清您拥有/需要/期望的内容,请更新问题或注释):
同样,这会出现在模块中,并定义一些简单的JavaScript来选择formfactor
的值-如果useragent包含字符串“android”或“iphone”,则激活mobile
值,否则激活desktop
。此代码将放在您的.nocache.js
文件中,并用于选择正确的排列(具有正确的入口点,如上所述)。除了Colin的详细回答之外,您还可以看看GWT的mobilewebapp标准示例-
示例FormFactor.gwt.xml-已解决:
好的,谢谢所有回复的人。我使用了一点每个人的答案来获得解决方案!首先,我介绍了SSRs,并查看了示例FormFactor.gwt.xml文件。我将其复制到我的项目中,并在App.gwt.xml文件中引用它。然后,我跟随Colins并将以下代码添加到我的App.gwt.xml文件中,以便根据形状因素加载不同的入口点:
<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>
谢谢-希望也能有所帮助!科林,非常感谢你这么详细的回答。我非常感激。我是GWT的新手,一直在看一些谷歌I/O视频寻求帮助。在这一点上,他谈到了形状因子检测,并且似乎建议在FormFactor.gwt.xml中进行形状因子检测?或者这是你必须自己写的东西?我从上面的评论中的链接中偷了一个简单的检测片段,但是是的,同样的想法也适用于任何属性-行下面的部分都是关于如何定义你自己的属性,如果需要,你可以发布你的解决方案作为答案。通过选择自己的答案来结束问题。同时,对你认为有用的答案和你认为有用的内容进行投票和评论。
<!-- 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>
<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>