首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于形状因数更改入口点类

基于形状因数更改入口点类
EN

Stack Overflow用户
提问于 2013-02-04 01:24:31
回答 4查看 922关注 0票数 2

如果用户从移动web浏览器或桌面web浏览器访问,我希望在我的GWT应用程序中加载不同的用户界面。我想知道如何编辑我的Application.gwt.xml文件,更改哪个入口点类是基于形状因子加载的。我认为这可能是沿着这些路线,但我只是黑客,所以我想知道是否有人有任何想法?

代码语言:javascript
复制
<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> 

干杯。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-06 19:50:23

已解决:

好的,感谢所有回复的人。我使用了一些每个人的答案来得到解决方案!首先,我跟踪SSR并查看了示例FormFactor.gwt.xml文件。我将其复制到我的项目中,并在App.gwt.xml文件中引用它。然后,我跟随Colins并将以下代码添加到我的App.gwt.xml文件中,以便根据形状因子加载不同的EntryPoint:

代码语言:javascript
复制
<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> 
票数 0
EN

Stack Overflow用户

发布于 2013-02-04 03:12:11

这几乎和您所描述的一样简单--也就是说,一旦您确定了formfactor属性以及如何为它选择一个值。

事实证明,当您创建一个入口点并在模块中声明它时,编译器使用GWT.create来实际创建它的一个实例。这使得它受到模块中声明的重新绑定规则的约束。因此,如果WebAppEntryPointMobileAppEntryPoint都继承自某个公共超类,则可以在模块中声明入口点,并对触发它们的规则进行细微的修改:

代码语言:javascript
复制
<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)并且formfactordesktop时,给他们一个WebAppEntryPoint实例。当有人调用GWT.create(AbstractEntryPoint)并且formfactormobil时,给他们一个<代码>d14实例。

然后剩下困难的部分-如何构建formfactor属性,定义可能的值,并让应用程序在启动时选择正确的值?

为了帮助回答这个问题,让我们看一下GWT中已经存在的两个标准属性- localeuser.agent。用户代理检测是在com.google.gwt.useragent.UserAgent模块中管理的-属性被定义,一个选择属性的方法被列出,一些有用的‘确保这个布线工作’的部分被添加到应用程序中。可能的区域设置是在com.google.gwt.i18n.I18N中启动的,但被设计为在您自己的应用程序中扩展。这里还有很多额外的东西,定义了如何选择应该激活的语言环境。我们想要从user.agent中窃取预定义可能的formfactor的想法,并且想要从地区代码中读取正确的formfactor的想法。

首先,定义属性。

代码语言:javascript
复制
 <define-property name="formfactor" values="desktop, mobile" />

在本例中,我们将只允许这两个可能的值--实际上,您可能需要桌面(即大尺寸和鼠标/键盘)、平板电脑(大尺寸和触摸屏)、手机(小尺寸和触摸屏)或其他一些变体。

接下来,决定如何读取正确的属性值。有两种基本的方法可以做到这一点--通过编写在模块文件中的简单的javascript片段,以及根据一些配置设置编写一个生成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文件中,并用于选择正确的排列(具有正确的入口点,如上所述)。

票数 4
EN

Stack Overflow用户

发布于 2013-02-04 13:43:56

除了科林的详细回答之外,您还可以看看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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14675098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档