2

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

干杯。

4

4 回答 4

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(which implements EntryPoint) 来执行此操作。当有人调用GWT.create(AbstractEntryPoint)and formfactorisdesktop时,给他们一个WebAppEntryPoint实例。当有人调用GWT.create(AbstractEntryPoint)and formfactorismobil时,给他们一个MobileAppEntryPoint实例。


这就留下了困难的部分——你如何构建formfactor属性,定义可能的值,并让应用程序在启动时选择正确的值?

为了帮助回答这个问题,让我们看看 GWT 中已经存在的两个标准属性 -localeuser.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- 如果用户代理包含字符串 'android' 或 'iphone',则激活该 mobile值,否则激活desktop。此代码将放置在您的.nocache.js文件中,并用于选择正确的排列(使用正确的入口点,如上所述)。

于 2013-02-03T19:12:11.290 回答
2

除了 Colin 的详细回答之外,您还可以查看 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

于 2013-02-04T05:43:55.670 回答
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 不同的绑定

于 2013-02-03T19:06:24.200 回答
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> 
于 2013-02-06T11:50:23.397 回答