2

ユーザーがモバイル 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> 

乾杯。

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> 

これらのルールは次のように述べていAbstractEntryPointます。EntryPointGWT.create(AbstractEntryPoint)formfactordesktopWebAppEntryPointGWT.create(AbstractEntryPoint)formfactormobilMobileAppEntryPoint


これで難しい部分が残ります。どのようにしてformfactorプロパティを構築し、可能な値を定義し、アプリが起動時に適切な値を選択できるようにするのでしょうか?

これに答えるために、GWT に既に存在する 2 つの標準プロパティと を見てみましょlocaleuser.agent。ユーザー エージェントの検出は com.google.gwt.useragent.UserAgent モジュールで管理されます。プロパティが定義され、プロパティを選択する方法がリストされ、いくつかの役立つ「この配線が機能していることを確認する」ビットがアプリに追加されます。可能なロケールは com.google.gwt.i18n.I18N で開始されますが、独自のアプリ内で拡張できるように設計されています。ここにも多くの余分なものがあり、どのロケールを有効にするかを選択する方法を定義しています。user.agent から可能なフォームファクタを事前に定義するというアイデアを盗み、ロケール コードから適切なフォームファクタを読み取るというアイデアが必要になります。

まず、プロパティを定義します。

 <define-property name="formfactor" values="desktop, mobile" />

この例では、これら 2 つの可能な値のみを許可します。実際には、デスクトップ (大とマウス/キーボード)、タブレット (大とタッチ)、電話 (小とタッチ)、またはこれの他のバリエーションが必要になる場合があります。 .

次に、正しいプロパティ値を読み取る方法を決定します。これを行うには 2 つの基本的な方法があります。モジュール ファイルに記述された 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値をアクティブにし、そうでない場合は activate を指定しdesktopます。このコードは.nocache.jsファイルに配置され、適切な順列を選択するために使用されます (上記で定義したように、適切なエントリポイントを使用)。

于 2013-02-03T19:12:11.290 に答える
0

解決済み:

わかりました、答えてくれたみんなに感謝します。みんなの答えを少し使って解決策を見つけました!まず、SSR をたどり、サンプルの FormFactor.gwt.xml ファイルを調べました。これをプロジェクトにコピーし、App.gwt.xml ファイルで参照しました。次に、フォーム ファクターに基づいて別の EntryPoint をロードするために、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> 
于 2013-02-06T11:50:23.397 に答える
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 に答える