Gwt 基于形状因子更改入口点类

Gwt 基于形状因子更改入口点类,gwt,mobile,Gwt,Mobile,如果用户从移动web浏览器或桌面web浏览器访问,我希望在我的GWT应用程序中加载不同的用户界面。我想知道如何编辑Application.gwt.xml文件,根据形状因素更改加载的入口点类。我想这可能是一些类似的东西,但我只是黑客,所以我想知道是否有人有任何想法 <entry-point class="webapp.client.WebAppEntryPoint"> <when-property-is name="formfactor" value="desktop"/>

如果用户从移动web浏览器或桌面web浏览器访问,我希望在我的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> 


干杯

您可以使用
替换为

  <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>