ヘッダーをスキップ

Oracle® Enterprise Pack for Eclipse Oracle Mobile Application Framework (OEPE Edition)でのモバイル・アプリケーションの開発 リリース2.0.1 E57593-01 |
| 目次

前 | 次 |

# 4 モバイル・アプリケーションの定義

この章では、Oracle Mobile Application Frameworkの概要エディタを使用して、モバイル・アプリケーションのSpringboardおよびナビゲーション・バーの表示動作を定義する方法と、アプリケーション機能を埋め込むことでコンテンツを指定する方法について説明します。

この章には次の項が含まれます:

- 第4.1項「モバイル・アプリケーションの定義の概要」

- 第4.2項「Oracle MAFパースペクティブの使用」

- 第4.3項「モバイル・アプリケーションの構成ファイル(maf-application.xml)について」

- 第4.4項「モバイル・アプリケーションの基本情報の設定」

- 第4.5項「カスタムURLスキームを使用したモバイル・アプリケーションの起動」

- 第4.6項「Springboardとナビゲーション・バーの動作の構成」

- 第4.7項「モバイル・アプリケーション内のアプリケーション機能の構成」

- 第4.8項「ライフサイクル・イベント・リスナーについて」

- 第4.9項「モバイル・アプリケーション機能の構成ファイルについて」

- 第4.10項「アプリケーション機能の基本構成の設定」

- 第4.11項「アプリケーション機能のコンテンツ・タイプの定義」

- 第4.12項「ローカライズ・コンテンツの操作」

- 第4.13項「モバイル・アプリケーションのスキニング」

- 第4.14項「機能アーカイブ・ファイルの使用」

- 第4.15項「モバイル・アプリケーションへのCordovaプラグインの統合」

## 4.1 モバイル・アプリケーションの定義の概要

モバイル・アプリケーションには1つ以上のビュー・コントローラタイプのプロジェクトを含めることができます。これらにはそれぞれ、`maf-feature.xml`ファイル内の一連の機能が記述されています。第3章「モバイル・アプリケーション開発のスタート・ガイド」で説明したように、MAFは、モバイル・アプリケーションそのものに対して`maf-application.xml`構成ファイルを、アプリケーションのコンテンツ定義用に`maf-feature.xml`ファイルを提供しています。これらのファイルは手動で変更することもできますが、MAFでは、これらのファイルを宣言的にビルドできるようにする2つの概要エディタを提供しています。

- MAFアプリケーション・エディタは、`maf-application.xml`ファイルを編集するための宣言的なインタフェースを提供します。

- モバイル機能エディタは、`maf-feature.xml`ファイルを編集するための宣言的なインタフェースを提供します。

### 4.1.1 maf-application.xmlでのMAFアプリケーション・エディタの使用

MAFアプリケーション・エディタでは、`maf-application.xml`ファイルを構成して、モバイル・アプリケーションとそのリソースを記述できます。エディタの各ページで、構成ファイルの要素を追加または更新できます。これらのページから、登録された機能(MAF機能エディタで作成)、ナビゲーション、デバイス・アクセス、セキュリティ、機能アーカイブおよびプラグインにアクセスできます。詳細は、第4.4項「モバイル・アプリケーションの基本情報の設定」を参照してください。

### 4.1.2 maf-features.xmlでのモバイル機能エディタの使用

MAF機能エディタでは、`maf-features.xml`ファイルを編集して、アプリケーションに機能を追加できます。このエディタを使用して機能を作成し、その特性(ID、名前、説明、ベンダー情報、バージョン、ライフサイクル・イベント・リスナー、セキュリティ、ナビゲーションおよびspringboard用のイメージ)を指定します。詳細は、第4.10項「アプリケーション機能の基本構成の設定」を参照してください。

## 4.2 Oracle MAFパースペクティブの使用

Eclipseのパースペクティブとは、特定のタイプの開発に適した特定のレイアウトで配置されるビューのコレクションです。MAFには、MAFアプリケーションを開発する際に使用する必要がある独自のパースペクティブがあります。それによって、このマニュアルの他の場所で説明するメニューおよびツールバーのオプションへのアクセスが可能になります。

Oracle MAFパースペクティブを変更するには:

1. IDEで、「ウィンドウ」→「パースペクティブを開く」→「その他」をクリックします。

   または、をクリックします。

2. パースペクティブを開くダイアログ・ボックスで、「Oracle MAF」を選択します。「OK」をクリックします。

## 4.3 モバイル・アプリケーション構成ファイル(maf-application.xml)について

`maf-application.xml`構成ファイルでは、表示名と一意のアプリケーションID (名前の競合を防ぐ)を指定し、アプリケーションのSpringboard (スマートフォンのホーム・ページに相当)に表示するアプリケーション機能を選択することで、モバイル・アプリケーションの基本構成を設定できます。さらに、このファイルでは、モバイル・アプリケーションのユーザー・プリファレンス・ページも作成できます。このファイルは、第3.2項「アプリケーション・ワークスペースの作成」で説明されているようにアプリケーション作成ウィザードを完了した後でOracle Enterprise Pack for Eclipseで生成されるものであり、表4-1に記載された要素で構成されます。

表4-1 アプリケーション識別子ファイルの要素

要素 | 説明
--- | ---
`<adfmf:application>` | `maf-application.xml`のルート要素。
`<adfmf:description>` | アプリケーションの説明。
`<adfmf:featureReference>` | 機能参照は、FAR (機能アーカイブ・ファイル)にパッケージされているか、`maf-feature.xml`ファイルで定義されているアプリケーション機能のうち、モバイル・アプリケーションのコンテンツに関連するものを指定します。機能参照を選択することで、モバイル・アプリケーションの特性とコンテンツを定義します。FARの詳細は、第4.14項「機能アーカイブ・ファイルの使用」を参照してください。
`<adfmf:preferences>` | ユーザー・プリファレンスのオプションおよび動作をアプリケーション・レベルで設定できます。`maf-feature.xml`ファイル内のアプリケーション機能に対するユーザー・プリファレンスの表示および動作方法も設定できます。詳細は、第13章「ユーザー・プリファレンスの有効化」を参照してください。
`<adfmf:login>` | アプリケーション機能のログイン・ページを設定できます。詳細は、第21章「モバイル・アプリケーションの保護」を参照してください。
`<adfmf:navigation>` | ナビゲーション・バーとSpringboardの動作を定義できます。Springboardはホーム・ページで、ここには、埋め込まれたアプリケーション機能のすべてのアプリケーション・アイコンとラベルがリスト・ビューに整理されて表示されます。Springboardには、ユーザーが使用可能なすべてのアプリケーションの最上位のビューが表示されます。ユーザーは内容に目を通してアプリケーションを選択できます。詳細は、第4.6項「Springboardとナビゲーション・バーの動作の構成」を参照してください。

例4-1は、Acme Salesという名前のアプリケーションの`maf-application.xml`ファイルを示しており、Acme Salesはモバイル・アプリケーションで、そのコンテンツには顧客の連絡先アプリケーション(`<adfmf:featureReference id="customers" showOnNavigationBar="true"/>`)が含まれており、このアプリケーションはSpringboardに表示されます(図4-1を参照)。

例4-1 maf-application.xmlファイル

    <?xml version="1.0" encoding="UTF-8" ?>
    <adfmf:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                       xmlns:adfmf="http://xmlns.oracle.com/adf/mf"
                       name="Acme Sales"
                       id="com.company.AcmeSales"
                       appControllerFolder="ApplicationController"
                       version="1.0"
                       vendor="Oracle"
                       listener-class="application.LifeCycleListenerImpl">
        <adfmf:description>Sample Application</adfmf:description>
    <adfmf:featureReference id="Customers"
                            showOnSpringboard="true"
                            showOnNavigationBar="true"/>
    <adfmf:featureReference id="HCM"
                            showOnSpringboard="true"
                            showOnNavigationBar="true"/>
    <adfmf:featureReference id="PROD"
                            showOnSpringboard="true"
                            showOnNavigationBar="true"/>
        <adfmf:preferences>
            <adfmf:preferenceGroup id="Root.Security" label="Security">
                <adfmf:preferenceText id="OracleSecurityProvider_serviceURL"
                                      label="Security URL"
                                      default="http://somecomputer.example.com:someaddress/
                                               idaas_rest/rest/tokenservice1/tokens/getprofile"/>

                <adfmf:preferenceText id="OracleADFMobile_UserName" label="User Name" default="sean"/>
                <adfmf:preferenceText id="OracleADFMobile_Password" label="Password" default="welcome1"
                                                                    secret="true"/>
            </adfmf:preferenceGroup>
        </adfmf:preferences>
        <adfmf:navigation>
            <adfmf:springboard enabled="false"/>
            <adfmf:navigationBar enabled="true"/>
        </adfmf:navigation>
    </adfmf:application>

図4-1 モバイル・アプリケーションのSpringboardに表示されるアプリケーション機能

これらの要素は、MAFアプリケーション・エディタを使用して宣言的に変更するか(図4-2を参照)、XMLエディタまたはソース・エディタを使用して手動で変更できます。これらのアプローチは、いずれも同じように使用できます。

図4-2 maf-application.xmlファイルのMAFアプリケーション・エディタ

## 4.4 モバイル・アプリケーションの基本情報の設定

MAFアプリケーション・エディタでは、名前、アプリケーションID、モバイル・アプリケーションの表示方法を設定できます。ベンダーおよびバージョンの情報の入力、ライフサイクル・イベント・リスナーの選択または作成(第4.8項を参照)、カスタムURLスキームの定義(第4.5項を参照)を行うこともできます。

MAFアプリケーション・エディタにアクセスするには:

- プロジェクト・エクスプローラで、「アプリケーション」フォルダを展開し、次に「MAF」フォルダを展開し、「MAFアプリケーション・エディタ」をダブルクリックします。

### 4.4.1 モバイル・アプリケーションのIDおよび表示動作の設定方法

MAFアプリケーション・エディタの「アプリケーション」ページ(図4-2を参照)では、モバイル・アプリケーションに名前を付けたり、Springboardやナビゲーション・バーでのモバイル・アプリケーションの表示を制御できます。

始める前に:

「MAFアプリケーション・エディタ」(図4-3に示すように「プロジェクト・エクスプローラ」パネル内のアセンブリ・プロジェクトのMAFノードにある)をダブルクリックして、`maf-application.xml`ファイルのMAFアプリケーション・エディタを開きます。

図4-3 プロジェクト・エクスプローラでのMAFアプリケーション・エディタの選択

モバイル・アプリケーションの基本情報を設定するには:

1. 「アウトライン」でアプリケーションの名前を選択して、「アプリケーション」ページを選択します。

   注意: エディタでは、デフォルトで「アプリケーション」ページが開きます。

   図4-4は、「アプリケーション」ページの一部分であり、ここで基本情報を定義します。

   図4-4 モバイル・アプリケーションの基本情報の設定

2. 「名前」フィールドに、アプリケーションの表示名を入力します。この属性はローカライズ可能です。詳細は、第4.12.1項「リソース・バンドルの使用」を参照してください。

   注意: MAFでは、このフィールドに入力した値をiOSアーカイブ(`.ipa`または`.app`)ファイルの名前として使用します。このファイルは、iOSデバイスまたはシミュレータにアプリケーションをデプロイすると作成されます。詳細は、第19.2.6項「iOSデプロイメント構成の作成方法」を参照してください。

3. デフォルト値を使用するか、または「ID」フィールドに一意のIDを入力します。

   名前の競合を避けるため、AndroidとiOSでは、リバースパッケージ名が使用されます(例: com.company.application)。Oracle Enterprise Pack for Eclipseによって、アプリケーション名の前には、com.companyがリバース・パッケージとして付加されますが、この値は別の値で上書きできます。ただし、上書きする値は一意で、iOSとAndroidの両方のデバイスのIDガイドラインを順守するものでなくてはなりません。iOSアプリケーションについては、『iOS Team Administration Guide』 (`http://developer.apple.com/library/ios`のiOS Developer Libraryで入手可能)の「Creating and Configuring App IDs」を参照してください。Androidについては、Android開発者のWebサイト(`http://developer.android.com/guide/topics/manifest/manifest-intro.html`)で入手可能な「The AndroidManifest.xml File」を参照してください。第19.2.4項「Androidデプロイメント構成の作成方法」および第19.2.6項「iOSデプロイメント構成の作成方法」で説明するデプロイメント・プロファイル内でこのIDを上書きできます。

   注意: Androidデバイスまたはエミュレータにアプリケーションが正しくデプロイされるようにするには、IDの先頭を数字やピリオドではなく、文字にする必要があります。たとえば、IDが925090のように(com.company.925090)完全に数値で構成されている場合、アプリケーションはデプロイできません。hello925090などの文字で始まるIDであれば(com.company.hello925090)、デプロイメントは正常に実行できます。

4. 「説明」フィールドに、アプリケーションの目的を説明した、短いけれども詳細な要約を入力します。

5. 「バージョン」フィールドに、バージョンを入力します。

6. 「ベンダー」フィールドに、このアプリケーションを最初に作成したベンダーの名前を入力します。

7. 「ライフサイクル・イベント・リスナー」フィールドの横にある「参照」をクリックして、「プロパティの編集」ダイアログ(図4-5を参照)を開き、イベントを起動、停止、アクティブ化、非アクティブ化するためのランタイム・コールを有効にするイベント・リスナーを登録します。イベント・リスナーの完全修飾クラス名を入力する必要があります。これはオプションのフィールドです。

   注意: ライフサイクル・イベント・リスナーのラベルにマウス・ポインタを置くと、リスナー・クラスを説明するツールチップが表示されます。

   図4-5 アプリケーション・イベント・リスナーの取得

   デフォルトのアプリケーション・リスナー・クラスは、`application.LifeCycleListenerImpl`です。MAFでは、このクラスがJVMを起動することから、各モバイル・アプリケーションに適さない可能性があるので、デフォルトではこのクラスは登録されません。かわりに、「クラスの選択」ダイアログ(図4-5を参照)を使用して、手動でこのクラスを登録する必要があります。このダイアログを閉じると、Oracle Enterprise Pack for Eclipseにより、`<adfmf:application>`要素が`listener-class`属性によって更新されます(例4-2を参照)。

   注意: アプリケーション・ライフサイクル・リスナーは引き続き、アプリケーション・コントローラ・プロジェクト(デフォルトの場所)内に存在している必要があります。

   例4-2 listener-class属性の追加

       <adfmf:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                          xmlns:adfmf="http://xmlns.oracle.com/adf/mf"
                          name="OracleMobileApplication"
                          id="com.company.OracleMobileApplication"
                          appControllerFolder="ApplicationController"
                          listener-class="application.LifeCycleListenerImpl"
                          version="1.1"
                          vendor="Oracle">
          <adfmf:description>This is a mobile application</adfmf:description>
          <adfmf:featureReference id="feature1"/>
       </adfmf:application>

   詳細は、第4.8項「ライフサイクル・イベント・リスナーについて」を参照してください。

## 4.5 カスタムURLスキームを使用したモバイル・アプリケーションの起動

カスタムURLスキームを使用してネイティブ・アプリケーションを他のアプリケーションから起動することができます。

モバイル・アプリケーションを別のアプリケーションから起動するには、次の手順を実行します。

1. カスタムURLスキームを登録します。このURLスキームは、図4-4に示すようにMAFアプリケーション・エディタの「URLスキーム」フィールドを使用して構成します。このスキームを持つURLを使用すれば、モバイル・アプリケーションを起動し、そのアプリケーションにデータを渡すことができます。

2. アプリケーション・コントローラ・プロジェクトで、URLを通知されるカスタムURLイベント・リスナー・クラス(`CustomURLEventListener`など)を作成します。このクラスには、イベント・リスナーを定義する`oracle.adfmf.framework.event.EventListener`インタフェースを実装する必要があります。`oracle.adfmf.framework.event.EventListener`インタフェースの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

   このモバイル・アプリケーションを起動するのに使用されるURLで呼び出された`onMessage(Event e)`メソッドをオーバーライドおよび実装します。`Event`オブジェクトを使用して、URLペイロードおよびアプリケーションの状態に関する有用な情報を取得できます。`URL`ペイロードを取得するには、`Event.getPayload`メソッドを使用します。URLイベント発生時にアプリケーションの状態を取得するには、`Event.getApplicationState`メソッドを使用します。詳細は、Oracle Mobile Application Framework Java APIリファレンスで`Event`クラスを参照してください。

3. アプリケーション・ライフサイクル・イベント・リスナー(ALCL)クラスを登録します。詳細は、第4.4項「モバイル・アプリケーションの基本情報の設定」および第4.8項「ライフサイクル・イベント・リスナーについて」を参照してください。

   カスタムURLイベントのソースを表すALCLクラスの`start`メソッドで`EventSource`オブジェクトを取得します。

       EventSource openURLEventSource = EventSourceFactory.getEventSource(EventSourceFactory.OPEN_URL_EVENT_SOURCE_NAME);

   カスタムURLイベント・リスナー・クラスのオブジェクトを作成し、イベント・ソースに追加します。

       openURLEventSource.addListener(new CustomURLEventListener());

モバイル・アプリケーションでは、次の2つの方法を使用して別のネイティブ・アプリケーションを起動することができます。

- URLがネイティブ・アプリケーションにより登録されたカスタムURLスキームで始まるMAF AMXページの`amx:goLink`を使用します。次に例を示します。

      <amx:goLink text="Open App" id="gl1" url="mycustomurlscheme://somedata"/>

- `href`属性値がネイティブ・アプリケーションにより登録されたカスタムURLスキームで始まるHTMLページのHTMLリンク要素を使用します。次に例を示します。

      <a href="mycustomurlscheme://somedata">Open App</a>

## 4.6 Springboardとナビゲーション・バーの動作の構成

Springboardとナビゲーション・バーの表示動作を次のように制御するよう、モバイル・アプリケーションを構成できます。

- Springboardとナビゲーション・バーを表示または非表示にすることで、モバイル・デバイスの画面を最適に使用できるようになります。これらのオプションは、ナビゲーション・バーのデフォルトの表示動作をオーバーライドします。ナビゲーション・バーは、アプリケーション機能によって別の状態に指定されていないかぎり、デフォルトで表示されます。

- Springboardを右からスライドできるようにします。デフォルトでは、Springboardは表示全体を占有せず、そのかわりに左からスライドして、アクティブ・コンテンツ(ナビゲーション・バーの「ホーム」ボタンとアプリケーション機能を含む)を右へプッシュします。

### 4.6.1 アプリケーションのナビゲーションの構成方法

「アプリケーション」ページの「ナビゲーション」のオプション(図4-6を参照)を使用して、ナビゲーション・バーを表示または非表示にしたり、アプリケーションによって使用されるSpringboardのタイプを選択したり、ユーザーがアプリケーションをめくるように見ていくときのSpringboardの反応方法を定義できます。

図4-6 「アプリケーション」ページの「ナビゲーション」のオプション

始める前に:

プロジェクト・エクスプローラのアセンブリ・プロジェクト→「MAF」から「MAFアプリケーション・エディタ」を選択して、`maf-application.xml`ファイルを開く必要があります。

ナビゲーション・バーの表示動作を設定するには:

1. 「ナビゲーション・バーを表示」を選択して、モバイル・アプリケーションがデフォルトで、Springboardではなくナビゲーション・バーを表示するようにします(図4-7を参照)。

   図4-7 デフォルトでナビゲーション・バーを表示

   「ナビゲーション・バーを表示」をオフにすると、アプリケーションの起動時にナビゲーション・バーが表示されなくなり、ユーザーにはSpringboardがナビゲーションの唯一の方法として提示されます。ナビゲーション・バーはSpringboardと同じ目的を果たすものなので、これを非表示にすることで冗長な機能を削除できる場合もあります。

2. 選択したアプリケーション機能のコンテンツが表示されているときにナビゲーション・バーを非表示にするには、「切替えボタンの表示」を選択します。図4-8はこのオプションを示したもので、図4-7に示されているナビゲーション・バーを、アプリケーション機能のコンテンツによって非表示にする方法が示されています。

   図4-8 ナビゲーション・バーを非表示

   このオプションはデフォルトで選択されており、アプリケーション機能によって表示/非表示状態が指定されていなければ、ナビゲーション・バーはデフォルトで表示されます。

Springboardの表示動作を設定するには:

1. Springboardを表示するには、「Springboardの表示」を選択します。デフォルトでは、これが選択されます。

2. 「アプリケーションの起動時に表示」を選択して、モバイル・アプリケーションの起動後にエンド・ユーザーに対してSpringboardを表示できるようにします。

3. 「Springboardトグル・ボタンの表示」を選択して、Springboardのボタンを表示できるようにします(図4-9を参照)。このボタンはアプリケーション機能内に表示されます。図4-7「デフォルトでナビゲーション・バーを表示」では、アプリケーション機能のコンテキスト内にこのボタンが表示されています。

   図4-9 Springboardトグル・ボタン

Springboardのスライドアウト動作を設定するには:

1. 「アニメーション」で`「右にスライド」`を選択します。Springboardは、「幅」オプションで入力したピクセル数値(またはパーセント)によって指定された領域を占有します。`「<なし>」`を選択した場合、Springboardは右からスライドできません(つまり、MAFではこのアクションを有効にするためのアニメーションが提供されません)。Springboardが表示領域全体を占有します。

2. 幅を設定します(ピクセル単位)。iOSデバイスのSpringboardのデフォルト幅は320ピクセルです。Androidデバイスでは、デフォルトでSpringboardは画面全体を占有するので、使用可能な幅がすべて占有されます。

   注意: Springboardが表示領域全体を占有しない場合は、アクティブなアプリケーション機能が残りの表示領域を占有します。詳細は、第4.6.3項「Springboardにアニメーションを設定する場合の処理」を参照してください。

### 4.6.2 ナビゲーション・オプションの構成時の処理

Springboardおよびナビゲーション・バーのオプションを設定すると、`maf-application.xml`ファイルの`<adfmf:navigation>`要素に対して要素の更新や追加が行われます。たとえば、`「なし」`を選択すると、`<springboard enabled="false">`によってコードが更新されます(例4-3を参照)。

例4-3 Springboardを表示しないようにする処理

    <adfmf:application>
      ...
      <adfmf:navigation>
         <adfmf:navigationBar enabled="true"/>
         <adfmf:springboard enabled="false"/>
      </adfmf:navigation>
    </adfmf:application>

ヒント: デフォルトでは、ナビゲーション・バーは有効ですが、Springboardは有効ではありません。XMLを手動で更新すると、次のようにSpringboardを有効化できます。
    <adfmf:application>
      ...
    <adfmf:navigation>
        <adfmf:springboard enabled="true"/>
      </adfmf:navigation>
      ...
    </adfmf:application>

例4-4は、「デフォルト」を選択したときに、`enabled`属性が`true`に設定される様子を示しています。

注意: Springboardはデバイスの画面全体を占有するので、ナビゲーション・バーとSpringboardは同時には表示されません。

例4-4 デフォルトのSpringboardの表示の有効化

    <adfmf:application>
      ...
      <adfmf:navigation>
         <adfmf:navigationBar enabled="true"/>
         <adfmf:springboard enabled="true"/>
      </adfmf:navigation>
    </adfmf:application>

### 4.6.3 Springboardにアニメーションを設定する場合の処理

例4-5は、`maf-application.xml`ファイルのナビゲーション・ブロックを示しており、ここでは、Springboardはスライドアウトし、指定された表示領域(213ピクセル)を占有するように設定されています。

例4-5 Springboardアニメーションの構成

    <adfmf:navigation>
       <adfmf:navigationBar enabled="true"
                            displayHideShowNavigationBarControl="true"/>
       <!-- default interpretation of width is pixels -->
       <adfmf:springboard enabled="true"
                          animation="slideright"
                          width="213"
                          showSpringbaordAtStartup="true"/>
    </adfmf:navigation>

次の行ではアニメーションを無効にしています。

    <adfmf:springboard enabled="true" animation="none"/>

次の行では、Springboardが表示領域の左から100ピクセル分を占有するように設定し、アクティブなアプリケーション機能が表示領域の残りの部分を占有できるようにしています。

    <adfmf:springboard enabled="true" animation="slideright" width="100px"/>

アニメーション以外に、例4-5は次の処理を示しています。

- `showSpringboardAtStartup`属性の使用。アプリケーションの起動時にSpringboardを表示するかどうかを定義します。(デフォルトでは、Springboardは表示されます。)

- `navigationBar`の`displayHideShowNavigationBarControl`属性の使用。

Springboardが表示されないようにするには、`enabled`属性を`false`に設定します。

### 4.6.4 HTMLコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項

MAFによって提供されるデフォルトのHTML Springboardページでは次のテクノロジが使用されており、これらは、カスタマイズしたログイン・ページに含めることもできます。

- Cascading Style Sheets (CSS): 色とレイアウトを定義します。

- JavaScript: Springboardページ内に埋め込まれた`<script>`タグには、第B章「アプリケーション・コンテナAPI」で説明するメソッド(Apache Cordova APIをコールする)への参照が格納されています。また、HTMLページはJavaScriptを使用して、コールバックに応答したり、ページ・スワイプを検出します。スワイプ・イベントが検出されたら、JavaScriptでは、スタイル・シートの動的変更によってページ・モーションをアニメートできるようになります。

  HTML(または任意のカスタムHTMLページ)を使用して作成されたSpringboardでは、`base.js`ライブラリを参照する`<script>`タグを含めることによって、Apache Cordova APIを活用できます。このライブラリ(または他のJavaScriptライブラリ)の場所を特定するには、まずMAFアプリケーションをデプロイした後、`deploy`ディレクトリに格納されたプラットフォーム固有のアーティファクト内にある`www/js`ディレクトリを探します。Androidアプリケーションの場合、`www/js`ディレクトリは、Androidアプリケーション・パッケージ(`.apk`)ファイル内にあります。その場所を次に示します。

      application workspace directory/deploy/deployment profile name/deployment profile name.apk/assets/www/js

  iOSの場合、このライブラリは次の場所にあります。

      application workspace directory/deploy/deployment profile name/temporary_xcode_project/www/js

  詳細は、第B.1項「MAF APIを使用したカスタムHTML Springboardアプリケーション機能の作成」を参照してください。

- WebKit: レイアウト間および異なるSpringboardページ間での遷移時に、アイコンのなめらかなアニメーションが提供されます。WebKitレンダリング・エンジンの詳細は、`http://www.webkit.org/`を参照してください。

HTMLで記述されるSpringboardは、`maf-feature.xml`ファイルで宣言され、`maf-application.xml`ファイルで参照されるアプリケーション機能です。

### 4.6.5 MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項

HTMLの場合と同様、MAF AMXを使用して記述されたSpringboardは、アプリケーション機能としてモバイル・アプリケーションによって参照されます(第4.7.1項「モバイル・アプリケーションのコンテンツの指定方法」を参照)。通常、Springboardはタスク・フローではなく単一のMAF AMXページとして記述されるため、埋込みアプリケーション機能の起動には、`gotoFeature`メソッドが使用されます(例4-6のメソッド式を参照)。

注意: カスタムSpringboardページ(HTMLまたはMAF AMXによって作成されたもの)は、ビュー・コントローラ・プロジェクト内に配置する必要があり、ビュー・コントローラ・プロジェクト内には`maf-feature.xml`ファイルも格納されています。詳細は、第4.7.1項「モバイル・アプリケーションのコンテンツの指定方法」を参照してください。

デフォルトSpringboard (`adfmf.default.springboard.jar`)は、機能アーカイブ(FAR) JARファイルにバンドルされ、モバイル・アプリケーションに含められた他のFARとともにデプロイされるMAF AMXページです。JARファイルには、`DataBindings.cpx`ファイルや`PageDef.xml`ファイルなど、Springboardに関連付けられたすべてのアーティファクトが含まれます。このファイルは、`maf-application.xml`ファイルのSpringboardオプションで「デフォルト」が選択された後のみ使用できます。このオプションを選択すると、このFARもアプリケーション・クラスパスに追加されます。詳細は、第19.3項「機能アーカイブ・ファイル(FAR)のデプロイ」を参照してください。

デフォルトのSpringboard (例4-6に示す`springboard.amx`)は、MAF AMXアプリケーション機能として実装されます。

例4-6 デフォルトのSpringboardページ、springboard.amx

    <?xml version="1.0" encoding="UTF-8" ?>
    <amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:amx="http://xmlns.oracle.com/adf/mf/amx"
              xmlns:dvtm="http://xmlns.oracle.com/adf/mf/amx/dvt">
       <amx:panelPage id="pp1">
          <amx:facet name="header">
             <amx:outputText value="#{bindings.name.inputValue}" id="ot3"/>
          </amx:facet>
          <amx:listView var="row"
                        value="#{bindings.features.collectionModel}"
                        fetchSize="#{bindings.features.rangeSize}"
                        id="lv1"
                        styleClass="amx-springboard">
             <amx:listItem showLinkIcon="false"
                           id="li1"
                           actionListener="#{bindings.gotoFeature.execute}">
                <amx:tableLayout id="tl1"
                                 width="100%">
                   <amx:rowLayout id="rl1">
                      <amx:cellFormat id="cf11"
                                      width="46px"
                                      halign="center">
                          <amx:image source="#{row.image}"
                                     id="i1"
                                     inlineStyle="width:36px;height:36px"/>
                      </amx:cellFormat>
                      <amx:cellFormat id="cf12"
                                      width="100%"
                                      height="43px">
                         <amx:outputText value="#{row.name}"
                                         id="ot2"/>
                      </amx:cellFormat>
                   </amx:rowLayout>
                </amx:tableLayout>
                   <amx:setPropertyListener from="#{row.id}"
                                            to="#{pageFlowScope.FeatureId}"/>
             </amx:listItem>
          </amx:listView>
       </amx:panelPage>
    </amx:view>

図4-10に示すように、MAF AMXファイルでは、リスト・アイテムがモバイル・アプリケーションの埋込みアプリケーション機能であるリスト・ビューを使用してSpringboardを定義します。これらのアプリケーション機能は、デプロイ後は、名前と関連アイコンによって表示されます。`AdfmfContainerUtilities` APIの`gotoFeature`メソッドでは、ページのナビゲーション機能が提供されます。このメソッドを使用した特定のアプリケーション機能の表示の詳細は、第B.2.6項「gotoFeature」を参照してください。また、第6.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」も参照してください。

図4-10 デフォルトのSpringboard

MAFでは、ApplicationFeaturesデータ・コントロール内にカスタムSpringboardを作成(またはデフォルトのSpringboardを拡張)するための基本ツールが提供されています。このデータ・コントロール(図4-11を参照)により、モバイル・アプリケーションとそのアプリケーション機能の両方を記述する属性のデータ・コレクションを使用して、Springboardを宣言的に構築できます。カスタムSpringboardページの例は、APIDemoサンプル・アプリケーションを参照してください。このアプリケーション(およびMAFに付属の他のサンプル)の詳細は、付録F「モバイル・アプリケーション・フレームワークのサンプル・アプリケーション」を参照してください。

図4-11 ApplicationFeaturesデータ・コントロール

ApplicationFeaturesデータ・コントロールのメソッドにより、ナビゲーション機能を追加できます。これらの`adfmf.containerUtilities`メソッドについて、表4-2に説明します。詳細は、第B.2項「MAFコンテナ・ユーティリティAPI」を参照してください。また、第7章「バインディングの使用とデータ・コントロールの作成」も参照してください。

表4-2 ApplicationFeatureメソッド

メソッド | 説明
--- | ---
`gotoDefaultFeature` | デフォルトのアプリケーション機能に移動します。
`gotoFeature` | このメソッドに渡されたパラメータによって指定される特定のアプリケーションに移動します。
`gotoSpringboard` | Springboardに移動します。
`hideNavigationbar` | ナビゲーション・バーを非表示にします。
`showNavigationbar` | ナビゲーション・バーを表示します(非表示になっている場合)。
`resetFeature` | このメソッドに渡されたパラメータによって指定されるアプリケーション機能をリセットします。

### 4.6.6 Springboardの実行時の動作に関する必知事項

アプリケーションの起動時に表示オプションを選択し、スライドアウト幅を画面のフル・サイズに指定している場合は、起動時にMAFによってバックグラウンドにデフォルトのアプリケーション機能がロードされます。モバイル・アプリケーションが休止している場合、MAFはSpringboardを非表示にします。

## 4.7 モバイル・アプリケーション内のアプリケーション機能の構成

各モバイル・アプリケーションには、少なくとも1つのアプリケーション機能が必要です。

### 4.7.1 モバイル・アプリケーションのコンテンツの指定方法

図4-14は、「機能参照」ページを示しています。このページで、モバイル・アプリケーションのコンテンツを構築できます。第4.3項「モバイル・アプリケーション構成ファイル(maf-application.xml)について」に示したように、モバイル・アプリケーション識別子ファイルの`<adfmf:featureReference>`要素によって、これらのアプリケーション機能を指定します。

例4-7 maf-application.xmlファイルでの機能参照の指定

    <adfmf:featureReference id="Prod"
                            showOnNavigationBar="true"
                            showOnSpringboard="true"/>
    <adfmf:featureReference id="Customers"
                            showOnNavigationBar="true"
                            showOnSpringboard="true"/>
    <adfmf:featureReference id="HCM"
                            showOnNavigationBar="true"
                            showOnSpringboard="true"/>
    <adfmf:featureReference id="custom_springboard"
                            showOnNavigationBar="false"
                            showOnSpringboard="false"/>
    <adfmf:navigation>
       <adfmf:springboard enabled="true">
          <adfmf:springboardFeatureReference id="custom_springboard"/>
       </adfmf:springboard>
    </adfmf:navigation>

例4-7では、いくつかの定義済の機能参照とそれらに関連する属性を示しています。MAFアプリケーション・エディタでは、これらの機能参照が「機能参照」表に表示されます。図4-14は、カスタマおよび製品のアプリケーション機能をそれぞれ表すHCMおよびPRODに対して定義された機能参照を示しています。

図4-12 アプリケーション・ページ内の登録機能

登録された機能を使用して、アプリケーション機能に対する参照を入力し、モバイル・アプリケーションのSpringboard内での表示を設定します(図4-12を参照)。

さらに、このページでは、ナビゲーション・バーおよびSpringboard上でのアプリケーション機能の表示順序を設定できます。実行時には、デバイス画面の幅によってナビゲーション・バーに表示されるアプリケーション機能の数が制限される場合があります。ナビゲーション・バーに収まりきれない機能は「次へ」タブに表示されます(図4-37を参照)。ユーザーは「次へ」タブに表示されるアプリケーション機能を編集機能を使用して並べ替えることができます。

図4-13 「次へ」タブ

注意: モバイル・アプリケーションの構築は反復型のプロセスなので、新しいFARが使用可能になり、新しいアプリケーション機能が`maf-feature.xml`ファイルに追加されると、機能参照を追加、削除または更新できます。

図4-14 「機能参照」ページを使用したアプリケーション機能の指定

始める前に:

第4.10項「アプリケーション機能の基本構成の設定」に示すように、アプリケーション機能がMAFアプリケーション・エディタ内で構成されている必要があります。さらに、MAFアプリケーション・エディタを開く必要があります。

機能参照を指定するには:

1. MAFアプリケーション・エディタのアウトラインで登録された機能を選択します。

2. 「参照」をクリックして、モバイル機能の登録ダイアログを開きます(図4-15を参照)。

   図4-15 アプリケーションの機能の登録

   このダイアログには、`maf-feature.xml`ファイルの`<adfmf:feature>`要素に記述されているすべてのアプリケーション機能がリストされます。このダイアログを使用することで、`<adfmf:featureReference>`要素と`<adfmf:feature>`要素の両方の`id`属性が確実に一致するようになります。第4.7.2項「機能参照IDと機能IDに関する必知事項」も参照してください。

3. アプリケーションに登録するアプリケーション機能のIDを選択します。[Shift]キーと[Ctrl]キーを使用して2つ以上を選択し、「OK」をクリックすることもできます。

   インポートされた機能アーカイブ(FAR)ファイルに含まれるアプリケーション機能への参照を追加することもできます。詳細は、第4.14.1項「アプリケーション・ライブラリとしてのFARのインポート」を参照してください。

4. MAFアプリケーション・エディタの登録された機能ページ(図4-14を参照)では、上/下矢印を使用して機能参照の表示順を並べ替えることができます。

   一番上のアプリケーション機能はデフォルトのアプリケーション機能です。このアプリケーションのセキュリティ構成に応じて、MAFはユーザーが匿名でログインして保護されていないコンテンツを表示するのを許可したり、認証資格証明を提供するようにユーザーに求めることができます。詳細は、第21.1項「モバイル・アプリケーション・フレームワークのセキュリティについて」を参照してください。

   注意: 「機能参照」表の一番上のIDは、モバイル・アプリケーション内で最初に表示されるアプリケーション機能です。例として、図4-7に示されているFeature 1アプリケーション機能を参照してください。

   図4-16 機能参照の順序変更

5. 「ナビゲーション・バーに表示」列および「Springboardに表示」列の行のドロップダウン・リストから、 `「true」`または`「false」`を選択することで、Springboardとナビゲーション・バーのアプリケーション機能に対する表示動作を設定します。図4-17は、アプリケーション機能がナビゲーション・バーに表示されなくなるオプションの選択状態を示しています。

   ヒント: アプリケーションによってカスタムSpringboardが使用される場合、またはアプリケーション機能がスライディング・ウィンドウとして表示される場合は、これらのオプションを`false`に設定します。詳細は、第4.8.6項「スライディング・ウィンドウの有効化」を参照してください。

   図4-17 ナビゲーション・オプションの変更

   デフォルトでは、Springboardとナビゲーション・バーが表示されます(つまり、これらの属性は`true`に設定されます)。ナビゲーション・バーとSpringboardの両方の属性を`false`に設定すると、アプリケーション機能は最初の位置にある場合のみ表示されるようになります。第B.2.11項「hideNavigationBar」および第B.2.12項「showNavigationBar」も参照してください。

   注意: Springboard機能は、ナビゲーション・バー上またはモバイル・アプリケーションのSpringboard内には表示されないので、カスタムSpringboardアプリケーション機能として使用される機能参照については、「ナビゲーション・バーに表示」および「Springboardに表示」を両方とも`「false」`に設定する必要があります。第4.6.5項「MAF AMXコンテンツによるカスタムSpringboardアプリケーション機能に関する必知事項」も参照してください。

### 4.7.2 機能参照IDと機能IDに関する必知事項

モバイル・アプリケーションには多数のプロジェクトを格納できるので、複数の`maf-feature.xml`ファイルを含めることもできます。アプリケーション構成ファイルでは、機能参照は`maf-feature.xml`ファイルによって記述される機能と関連しています。`<adfmf:featureReference>`のIDは、対応するアプリケーション機能が定義される場所を識別します。言い換えれば、`maf-application.xml`ファイル内の`<adfmf:featureReference>`要素の`id`属性は、`maf-feature.xml`内の`<adfmf:feature>`要素に対して定義された`id`属性と同じである必要があります。たとえば、`maf-application.xml`の`<adfmf:featureReference id="customers">`は、`maf-feature.xml`の`<adfmf:feature id="customers">`によって定義されます。Oracle Enterprise Pack for Eclipseは、同じモバイル・アプリケーション内のアプリケーションと機能識別子ファイルの間の参照を監査し、矛盾を発見したら警告を行います。図4-18に示すように、Oracle Enterprise Pack for Eclipseは、機能参照と機能アプリケーション識別子ファイルで宣言された機能との間の不一致をコード内で波状の下線で強調表示し、「参照が見つかりません」という警告を表示します。この場合は、機能参照IDが正しい`Prod`ではな`Prid`と定義されています。

図4-18 id属性の監査

機能IDはアプリケーション全体を通して一意である必要があります。アプリケーション機能は再使用できるので、適切な命名規則によって機能IDを必ず一意にしてください。

注意: MAFビュー・コントローラ・プロジェクトを、別のMAFビュー・コントローラ・プロジェクトの依存性またはモバイル・アプリケーション・コントローラ・プロジェクトの依存性として追加しないでください。これを行った場合、追加したビュー・コントローラ・プロジェクトに、元のMAFビュー・コントローラ・プロジェクトの`maf-feature.xml`ファイルに含まれる`<admf:feature>`要素と同じ`id`属性を持つ`<adfmf:feature>`要素が追加されます。その結果、モバイル・アプリケーション全体で`<adfmf:feature>`要素の`id`属性が一意でないことが検出されるため、デプロイメント・フレームワークによるデプロイメントは終了します。

## 4.8 ライフサイクル・イベント・リスナーについて

MAFランタイムでは、クラスが様々な`LifeCycleListener`メソッドを実装して、ネイティブ・オペレーティング・システムのフレームワークからJVMに送信されるイベント通知を伝達します。これらのイベント通知は、モバイル・アプリケーションと埋込みのアプリケーション機能の両方の様々な状態(起動、停止または休止)について記載しています。MAFは、汎用的な起動メッセージを使用して、JVMでクラス関数を呼び出します。

MAFアプリケーション・エディタ(`maf-application.xml`)およびMAF機能エディタ(`maf-feature.xml`)では、イベント発生時にMAFがコールするライフサイクル・リスナー・クラスを宣言的に追加できます。エディタのライフサイクル・イベント・リスナー・クラス・フィールドにある「クラスおよびパッケージ・ブラウザ」を使用して、完全修飾クラス名(パッケージを含む)を入力すると、Oracle Enterprise Pack for EclipseによってXMLページに`listener-class`属性が移入されます。モバイル・アプリケーションでは、この属性は`<adfmf:application>`要素に含まれています(例4-8を参照)。

例4-8 maf-application.xmlファイルのlistener-class属性

    <adfmf:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                       xmlns:adfmf="http://xmlns.oracle.com/jdev/adfmf"
                       id="app-20110308"
                       name="#{strings.Title}"
                       vendor="Oracle"  version="1.0"
                       listener-class="oracle.adfmf.application.AppListener">

    ...

    </adfmf:application>

`maf-feature.xml`ファイルでは、`listener-class`属性は、`<adfmf:feature>`属性内に格納されています(例4-9を参照)。

例4-9 maf-feature.xmlファイルのlistener-class属性

    ...

       <adfmf:feature id="mycompany.phonelist"
                     name="Phone List"
                     icon="mycompany.phonelist/phoneicon.png"
                     listener-class="oracle.adfmf.feature.LifeCycleListener">
                     image="mycompany.phonelist/phoneimage.png"
          <adfmf:content id="general">

             <adfmf:amx file="mycompany.phonelist/phone.amx"/>
          </adfmf:content>

       </adfmf:feature>

    ...

モバイル・アプリケーションを作成すると、Oracle Enterprise Pack for Eclipseによって、アプリケーション用の`LifeCycleListenerImpl.java`というライフサイクル・リスナー・クラスが作成されます。このファイルを使用して、特定のメソッドを実装できます(第17章「プッシュ通知の有効化」を参照)。Lifecycle Eventsサンプル・アプリケーションでは、`maf-application.xml`ファイルおよび`maf-feature.xml`ファイル内の両方でイベント・リスナー・クラスを宣言する例が提供されます。

このサンプル・アプリケーションを操作するには、「ファイル」→「新規MAFサンプル」を選択し、LifecycleEventsを選択し、「終了」をクリックします。

### 4.8.1 モバイル・アプリケーションのイベント

アプリケーション・ライフサイクル・イベントを実行するには、モバイル・アプリケーションのライフサイクル・リスナー・クラスで、`LifeCycleListener`インタフェースの`start`、`stop`、`activate`および`deactivate`メソッドを実装する必要があります(例4-10を参照)。

例4-10 モバイル・アプリケーションのLifeCycleListenerインタフェース

    package oracle.adfmf.application;

    public interface LifeCycleListener
    {
       void start();
       void stop();
       void activate();
       void deactivate();
    }

注意: アプリケーション・ライフサイクル・リスナーは、匿名ユーザーによって実行されます(つまり、そのリスナーのメソッドにはどのユーザーも関連付けられず、セキュアなWebサービスもコールされません)。

例4-11に示す`AppListener`クラスでは、イベントを開始または停止するために`LifeCycleListener`メソッド・コールを使用します。また、アプリケーションを休止させる(`deactivate`)場合や、休止から戻す(`activate`)場合にも、これらのメソッド・コールを使用します。詳細は、第4.8.2項「モバイル・アプリケーション・イベントのタイミング」を参照してください。Oracle Mobile Application Framework Java APIリファレンスでLifeCycleListenerインタフェースも参照してください。

例4-11 LifeCycleListenerインタフェースの実装

    package some.package;
    import oracle.adfmf.application.LifeCycleListener;

    public class AppListener implements LifeCycleListener
    {
        public AppListener()
        {
            super();
        }
        public void start()
        {
            // Perform application startup tasks...
        }
        public void stop()
        {
            // Perform tasks to stop the application...
        }
        public void activate()
        {
            // Perform appplication activation tasks...
        }
        public void deactivate()
        {
            // Perform application deactivation tasks...
        }
    }

LifeCycleEventsサンプル・アプリケーションのアプリケーション・コントローラ・プロジェクト(付録F「モバイル・アプリケーション・フレームワークのサンプル・アプリケーション」を参照)には、`LifeCycleListener`インタフェースを実装するクラス(`LifeCycleListenerImpl.java`)が含まれています。

注意: 起動ライフサイクル・コードを実行する前に、マネージドBeanとデータ・バインディングを初期化する必要があります。

### 4.8.2 モバイル・アプリケーション・イベントのタイミング

MAFは、モバイル・アプリケーションの起動時、シャットダウン時、休止時における特定のタイミングでアプリケーション・ライフサイクル・メソッドをコールします。表4-3は、これらのメソッドがコールされるタイミングと、各イベントに対応するObjective-Cを示しています。

表4-3 MAFライフサイクル・メソッド

メソッド | タイミング | いつコールされるか | 使用方法 | iOSアプリケーション委任メソッドとの関係
--- | --- | --- | --- | ---
`start` | モバイル・アプリケーションがアプリケーション機能を完全にロードした後、ユーザーに最初のアプリケーション機能またはSpringboardを表示する直前にコールされます。これはブロック化コールです。 | アプリケーションの処理が開始されたとき。 | 次の使用方法があります。 モバイル・アプリケーションの更新があるかどうかを確認する。 ローカル・データベースにデータをダウンロードするよう、リモート・サーバーにリクエストする。 | このイベントは特定のアプリケーション委任メソッドには対応していません。`maf-application.xml`ファイルと`maf-feature.xml`ファイルのロード後、スプラッシュ画面が非表示になる直前にコールされます。
`stop` | モバイル・アプリケーションがシャットダウンを開始するときにコールされます。 | アプリケーションの処理が終了したとき。 | 次の使用方法があります。 任意のリモート・サービスからログオフする。 アプリケーションが終了する前に、データの変更をサーバーにアップロードする。 | アプリケーション委任の`applicationWillTerminate:`メソッド内でコールされます。
`activate` | モバイル・アプリケーションを背景にある(休止)状態からアクティブ化するときにコールされます。これはブロック化コールです。 | `start`メソッドがコールされた後。 | 次の使用方法があります。 キャッシュ・ストアを読み取り、再移入する。 Webサービス・リクエストを処理する。 必要なリソースを取得する。 チェックポイントを適用する。詳細は、第4.8.3項「アクティブ化および非アクティブ化メソッドを使用したアプリケーションの状態の保存」を参照してください。 | アプリケーション委任の`applicationDidBecomeActive:`メソッド内でコールされます。
`deactivate` | モバイル・アプリケーションを非アクティブ化し、背景に移動(休止)するときにコールされます。これはブロック化コールです。 | `stop`メソッドがコールされる前。 | 次の使用方法があります。 リストア可能な状態を書き込む。 チェックポイントを適用する。詳細は、第4.8.3項「アクティブ化および非アクティブ化メソッドを使用したアプリケーションの状態の保存」を参照してください。 データベース・カーソルとデータベース接続を閉じる。 | アプリケーション委任の`applicationWillResignActive:`メソッド内でコールされます。

### 4.8.3 アクティブ化および非アクティブ化メソッドを使用したアプリケーションの状態の保存

チェックポイントの適用によってアプリケーションの状態が保存されるため、ユーザーは、チェックポイント・エントリを`activate`および`deactivate`メソッドに追加することによって、休止前にアクティブであったモバイル・アプリケーションの最後のページを引き続き使用できます。ライフサイクル・リスナーは、`activate`クラスに追加されたチェックポイント・エントリを読み取り、アプリケーションが休止から戻った後、処理を再開できるようにします。ユーザーは再度ログインする必要がなくなるため、アプリケーションを中断することなく引き続き使用できます。休止中にアプリケーションが終了した場合、`deactivate`メソッドの一部として、チェックポイント情報をデータベースまたはデバイスのキャッシュ・ディレクトリに書き込むよう指定することによって、アプリケーションを再開できるようになります。アクティブ化中にこのチェックポイント情報を読み取ることによって、アプリケーションが同じページから再開されます。

### 4.8.4 アプリケーション機能ライフサイクル・リスナー・クラスについて

モバイル・アプリケーション機能ライフサイクル・リスナー・クラス(例4-13に示した`FeatureListenerPhoneList`など)では、`LifeCycleListener`インタフェースの`activate`および`deactivate`メソッドを実装する必要があります(例4-12を参照)。

例4-12 アプリケーション機能LifeCycleListenerのインタフェース

    package oracle.adfmf.feature;
    public interface LifeCycleListner
    {
       void activate();
       void deactivate();
    }

例4-13は、`FeatureListenerPhoneList`と呼ばれるクラスを示しており、このクラスでは、`LifeCycleListener`を実装することで、`activate`または`deactivate`メソッドを使用してアプリケーション機能を表示/非表示にします(表4-4を参照)。これらのメソッドでは、アプリケーション機能をアプリケーションの休止時に非表示にしたり、休止から戻ったときに表示したりできます。

注意: Oracle Mobile Application Framework Java APIリファレンスで説明されているように、`activate`および`deactivate`メソッドはブロック化コールです。これらのメソッドは、完全に実行されるまで、ユーザー・インタフェースを停止させるので、実行時間の長い処理がこれらのメソッドに含まれている場合は、別のアプリケーション機能のアクティブ化に遅延が生じます。アプリケーションにおいて実行時間の長い処理がアプリケーションの非アクティブ化の前に完了しなくてもよい場合は、その処理をこれらのメソッドに含めるのでなく、バックグラウンド・スレッドに含めてください。

例4-13 アプリケーション機能ライフサイクルの実装

    package some.package;
    import oracle.adfmf.feature.LifeCycleListener;
    public class FeatureListenerPhoneList implements LifeCycleListener
    {
        public FeatureListenerPhoneList()
        {
            super();
        }
        public void activate()
        {
            // Perform application activation tasks...
        }
        public void deactivate()
        {
            // Perform application deactivation tasks...
        }
    }

ヒント: LifeCycle Eventsサンプル・アプリケーションでは、`Feature1Handler.java`および`Feature2Handler.java`ファイルにより、アプリケーション機能レベルで`LifeCycleListener`インタフェースを使用する例が提供されています。これらのファイルは、ビュー・コントローラ・プロジェクトのApplication Sourcesフォルダ内にあります。

### 4.8.5 アプリケーション機能のライフサイクルでイベントをアクティブ化および非アクティブ化するタイミング

アプリケーション機能ライフサイクル・リスナー・クラスを実装することによって、アプリケーション機能で、`applicationScope`変数や、アプリケーション機能が非アクティブ化されたときに変更されたアプリケーション機能固有の変数に対する、すべてのデータ変更を自動的に取得できるようになります。表4-4は、アプリケーション機能に対してactivateイベントおよびdeactivateイベントを実行するタイミングを示しています。詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

表4-4 アプリケーション機能に対するactivateおよびdeactivateメソッド

メソッド | タイミング | いつコールされるか | 使用方法
--- | --- | --- | ---
`activate` | 現在のアプリケーション機能がアクティブ化される前にコールされます。 | ユーザーがモバイル・アプリケーションの起動後に初めてアプリケーション機能を選択したとき、またはアプリケーション機能が再選択されたとき(つまり、フォアグラウンドに戻されたとき)にコールされます。 | 次の使用方法があります。 `applicationScope`変数を読み取る。 最初のMAF AMXビューにおける現在の行を設定する。
`deactivate` | 次のアプリケーション機能がアクティブ化される前、またはアプリケーション機能が終了する前にコールされます。 | ユーザーが別のアプリケーション機能を選択したときにコールされます。 | たとえば、`deactivate`イベントを使用して、`applicationScope`変数や、次のアプリケーション機能が使用するその他の状態情報を記述できます。

### 4.8.6 スライディング・ウィンドウの有効化

`oracle.adfmf.framework.api.AdfmfSlidingWindowUtilities`インタフェースをアプリケーション・ライフサイクル・リスナー(ALCL)に実装することにより、アプリケーション機能をスライディング・ウィンドウとして使用できます。このウィンドウは、ナビゲーション・バーまたはSpringboard内に表示される他のアプリケーション機能と同時に表示されます。スライディング・ウィンドウは、アプリケーション内に常に存在しているコンテンツ(グローバル・ツール・バー)を表示するために使用したり、一時的な(ポップアップ)コンテンツ(ヘルプ・ウィンドウなど)を表示するために使用したりできます。Springboardまたはナビゲーション・バー内でアプリケーション機能を表示する方法の詳細は、第4.7.1項「モバイル・アプリケーションのコンテンツの指定方法」を参照してください。`AdfmfSlidingWindowUtilities` APIのメソッドの使用方法の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

## 4.9 モバイル・アプリケーション機能の構成ファイルについて

`maf-feature.xml`ファイル(例4-14を参照)では、対応する`maf-application.xml`ファイルの`<adfmf:featureReference>`要素によって参照される実際のモバイル・アプリケーション機能を構成できます。

例4-14 maf-feature.xmlファイル

    <?xml version="1.0" encoding="UTF-8" ?>
    <adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:adfmf="http://xmlns.oracle.com/adf/mf">
        <adfmf:feature id="PROD"
                       name="Products"
                       icon="images/logo.png">
            <adfmf:constraints>
            </adfmf:constraints>
            <adfmf:description>Products</adfmf:description>
            <adfmf:content id="PROD.1">
                <adfmf:amx file="PROD/products_page.amx"/>
            </adfmf:content>
        </adfmf:feature>
        <adfmf:feature id="HCM"
                       name="Contents"
                       icon="images/directory.png">
            <adfmf:description>People Finder</adfmf:description>
            <adfmf:content id="HCM.1">
                <adfmf:remoteURL connection="Connections1"/>
            </adfmf:content>
        </adfmf:feature>
        <adfmf:feature id="Customers.1"
                       name="Customers"
                       icon="images/people.png">
            <adfmf:constraints>
                <adfmf:constraint property="user.roles"
                                  operator="equal"
                                  value="field sales"/>
                <adfmf:constraint property="user.roles"
                                  operator="not"
                                  value="consultant"/>
            </adfmf:constraints>
            <adfmf:description>Customers</adfmf:description>
            <adfmf:content id="Customers.2">
                <adfmf:localHTML url="Customers/customers_page.html"/>
            </adfmf:content>
        </adfmf:feature>
    </adfmf:features>

`maf-feature.xml`ファイルの要素を定義することで、アプリケーション機能の動作を設定します。このためには、今度はXMLファイル内のルート要素`<adfmf:features>`の下で最上位の要素である`<Feature>`機能の子要素を定義します。`<Feature>`要素そのものは、名前、バージョン、セキュリティ保護の有無など、アプリケーション機能の基本情報について記述しています。詳細は、第21章「モバイル・アプリケーションの保護」を参照してください。`<Feature>`要素の子要素を表4-5に示します。`maf-application.xml`識別子ファイルのMAFアプリケーション・エディタのように、`maf-feature.xml`ファイルのMAF機能エディタを使用して、このファイルをこれらの要素で宣言的に更新(または編集)できます(第4.10項「アプリケーション機能の基本構成の設定」を参照)。

表4-5 <Feature>要素の子要素

要素 | 説明
--- | ---
`<adfmf:content>` | 特定のデバイスやユーザーに対してアプリケーション機能で使用される形式を記述します。アプリケーション機能のコンテンツ(通常はユーザー・インタフェース)は、MAF AMXページやHTML5ページとして記述することも、リモートWebサーバー上でホストされるWebページから配信することもできます。コンテンツをWebアプリケーションとして指定する方法の詳細は、第12章「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。
`<adfmf:constraint>` | 指定したアプリケーション機能を実行時にアプリケーションに表示できるようにするかどうかを決定します。制約を使用すると、ユーザー・ロールやデバイスのプロパティなどの基準に基づいてアプリケーション機能の使用を許可または回避できます。詳細は、第14章「アプリケーション機能に関する制約の設定」を参照してください。

## 4.10 アプリケーション機能の基本構成の設定

各モバイル・アプリケーションには、少なくとも1つのアプリケーション機能が必要です。各アプリケーション機能はそれぞれ別個に(モバイル・アプリケーション自体とも別に)開発できるので、`maf-feature.xml`ファイルのMAF機能エディタでは、`<adfmf:features>`の子要素を定義して、それぞれの名前とIDを割り当て、コンテンツの実装方法を設定することで、アプリケーション機能を区別できます。アプリケーション機能のMAF機能エディタを使用すると、モバイル・アプリケーション内のアプリケーション機能のランタイム表示を制御したり、アプリケーション機能がユーザー認証を必要とするタイミングを指定することもできます。

### 4.10.1 アプリケーション機能の基本情報の定義方法

MAF機能エディタ(図4-19を参照)では、アプリケーション機能を追加したり、その基本情報や表示アイコンを指定できます。

図4-19 アプリケーション機能の「一般」タブ

始める前に:

アプリケーション機能で、MAFによって提供されるデフォルト・イメージではなく、ナビゲーション・バーやSpringboardのカスタム・イメージを使用する場合、これらのイメージは、Android開発者のWebサイト(`http://developer.android.com/design/style/iconography.html`)および、iOS Developer Library (`http://developer.apple.com/library/ios/navigation/`)で入手できる『iOS Human Interface Guidelines』の「Custom Icon and Image Creation Guidelines」の章に示されている仕様に従って作成する必要があります。

これらのイメージは、ビュー・コントローラ・プロジェクトの`viewContent`ディレクトリに配置します。第4.11.2項「外部リソースの選択に関する必知事項」も参照してください。

さらに、MAF機能エディタを開く必要があります。

アプリケーション機能の基本情報を設定するには:

1. アウトラインでをクリックして、新規オブジェクト・ダイアログを開きます。

2. 作成している機能について、アプリケーション機能の一意の識別子を入力します。

3. MAF機能エディタで目的のフィールドへの入力を完了し(図4-20を参照)、「OK」をクリックします。このダイアログは次のように入力します。

   - 「名前」フィールドに、アプリケーション機能の表示名を入力します。

   - 必要に応じて、アプリケーション機能の場所を、`public_html`ディレクトリ(デフォルトの親ディレクトリ)内の任意のディレクトリに変更します。この場所を「ディレクトリ」フィールドに入力します。

   - 新しく定義したアプリケーション機能をモバイル・アプリケーションに追加するには、「機能ID」に入力した値と一致する`id`属性を持つ`maf-application.xml`ファイルに、新しい`<adfmf:featureReference>`要素を追加します。「対応する機能参照をmaf-application.xmlに追加」を選択します。このダイアログの入力を完了すると、「機能参照」ページの表(図4-14を参照)に機能参照が追加されます。第4.7.2項「機能参照IDと機能IDに関する必知事項」も参照してください。

     図4-20 アプリケーション機能の追加

4. 「説明」フィールドに、アプリケーションの目的の簡単な説明を入力します。これはオプションの値です。

5. 「ベンダー」フィールドに、アプリケーション機能を最初に作成したベンダーの名前を入力します。これはオプションの値です。

6. 「バージョン」フィールドに、アプリケーション機能のバージョン番号を入力します。これはオプションの値です。

7. 「ライフサイクル・イベント・リスナー」の「クラスおよびパッケージ・ブラウザ」を使用して、完全修飾クラス名(`oracle.adfmf.feature`のようにパッケージを含む)を入力して、イベントを起動、停止、休止および休止から戻すためのランタイム・コールを有効にします。詳細は、第4.8項「ライフサイクル・イベント・リスナーについて」を参照してください。これはオプションの値です。

8. アプリケーションでセキュリティを使用する場合は、「セキュリティの有効化」チェックボックスを選択します。

9. 「ナビゲーション・バー・アイコン」および「Springboardイメージ」フィールドで、ナビゲーション・バーのアイコンとして使用するイメージと、Springboardの表示アイコンとして使用するイメージを、プロジェクトから参照して選択します。プロジェクト・エクスプローラから「ファイルの場所」フィールドにイメージ・ファイルをドラッグ・アンド・ドロップすることもできます。これはオプションの値です。

## 4.11 アプリケーション機能のコンテンツ・タイプの定義

アプリケーション機能のコンテンツ・タイプには、ユーザー・インタフェースの形式が記述されます。このコンテンツ・タイプは、MAF AMXコンポーネントまたはHTML(5)タグを使用して構成できます。また、アプリケーション機能では、モバイル・コンテキストに適したコンテンツを含む、リモートでホストされたページから、自身のコンテンツを導出することもできます。このようなWebページとして考えられるのは、スマートフォン向けのApache Trinidadで作成されたJavaServerページや、タブレット・デバイス上で実行されるアプリケーション向けのADF Facesコンポーネントから構成されたページです。モバイル・アプリケーションに埋め込まれた各アプリケーション機能では、様々なコンテンツ・タイプを保持できます。

ヒント: 複数のコンテンツ・タイプを含むモバイル・アプリケーションを設計してください。

モバイル・アプリケーションには、様々なコンテンツ・タイプを持つアプリケーション機能が含まれますが、アプリケーション機能自体も、ユーザーおよびデバイス固有の要件に応じた様々なコンテンツ・タイプを保持する場合があります。アプリケーション機能によって、様々なコンテンツ・タイプがどのように提供されるかについては、第14章「アプリケーション機能に対する制約の設定」を参照してください。例4-15のように、子要素を`<adfmf:content>`要素に追加すると、アプリケーション機能にユーザー・インタフェースをどのように実装するかを定義できます。

例4-15 <adfmf:content>要素

    <adfmf:content id="Feature1">
          <adfmf:amx file="FeatureContent.amx">
    </adfmf:content>

### 4.11.1 アプリケーション・コンテンツの定義方法

MAF機能エディタで機能を作成したら、機能のコンテンツを定義するために、各機能を右クリックして新規オブジェクト・ダイアログ(図4-21を参照)を開きます。このダイアログでは、目的のコンテンツ関連要素を選択できます。このダイアログの選択項目を使用すると、アプリケーション機能用に配信されるコンテンツのタイプと、そのコンテンツ・タイプで使用するナビゲーションとSpringboardアイコンのイメージを制御できます。

各コンテンツ・タイプには、独自のパラメータ・セットがあります。たとえば、図4-21に示すように、MAF AMXコンテンツとして実装するアプリケーション機能のMAF AMXページまたはタスク・フローの場所を指定する必要があります。さらにオプションで、アプリケーション機能に他のアプリケーション機能(またはモバイル・アプリケーション自体)とは異なるルック・アンド・フィールを設定するCSSファイルを選択したり、MAF AMXコンポーネントのアクションを制御するJavaScriptファイルを選択することもできます。

図4-21 アプリケーション機能の実装の定義

始める前に:

各コンテンツ・タイプには、次のような独自の前提条件があります。

- 「AMXページ」: 個々のMAF AMXページの両方が含まれる、アプリケーション機能のデフォルトのコンテンツ・タイプ。MAF AMXコンテンツは、一連のモバイル固有のユーザー・インタフェース・コンポーネント、ADFデータ・バインディング、カメラなどのデバイス・サービスを統合するデータ・コントロール、およびチャート、グラフ、テーマ・マップなどのデータ視覚化ツールを使用して、宣言的に構築できます。MAF AMXページの構築の詳細は、第5章「MAF AMXページの作成」を参照してください。

  MAF AMXとして実装されるアプリケーション機能には、既存のビュー(つまり、単一のMAF AMXページ)が必要です。JavaScriptファイルを追加すると、MAF AMXコンポーネントに対するレンダリング・ロジックが提供されるか、または既存のレンダリング・ロジックがオーバーライドされます。アプリケーション機能に対するカスタムのルック・アンド・フィールを指定するセレクタを持つスタイル・シート(CSS)を含めます。これは、モバイル・アプリケーション・レベルで定義されたスタイル(アプリケーション機能にデフォルトで使用されるスタイル)をオーバーライドします。つまり、アプリケーション機能全体で確実に独自のルック・アンド・フィールを持つようになります。

  MAF AMXページとこれらを格納するモバイル・アプリケーションは、両方とも「ファイル」→「新」から呼出し可能なウィザードを使用して作成できます。プロジェクト・エクスプローラでビュー・プロジェクトを右クリックして「新」を選択したときに表示されるポップアップ・メニュー(図4-22を参照)を使用してMAF AMXページを作成することもできます。

  注意: `maf-feature.xml`ファイル内にある、タスク・フロー、MAF AMXページ、CSSおよびJavaScriptファイルへの参照を手動で編集する場合、デバイスで使用されているファイル・システムによって大文字と小文字が区別され、特殊文字が許可されない可能性があることに注意してください。これらのファイルを確実に参照できるようにするには、モバイル・デバイスの仕様を確認してください。

  図4-22 MAFページを作成するためのポップアップ・メニュー

- 「タスク・フロー」: タスク・フロー・ページでは、アプリケーション内のパスを機能ごとに定義します。タスク・フロー・ファイルにはコントロール・フローの仕様とアクティビティが含まれ、アクティビティとしてメソッドのコール、ルーターの使用、別のタスク・フローのコール、タスク・フローからの復帰、ビュー・ページの表示などがあります。詳細は、第5.2項「タスク・フローの作成」を参照してください。

- ローカルHTML: モバイル・アプリケーション内にパッケージ化されたHTMLページを参照します。そのようなHTMLページでは、`HelloWorld`サンプル・アプリケーション(付録F「モバイル・アプリケーション・フレームワークのサンプル・アプリケーション」を参照)で示したようなJavaScriptを参照できます。MAFがアプリケーションの機能を実装するのに最適でない場合は、Cordova JavaScript APIを介してアプリケーション機能を実装するこのコンテンツ・タイプの使用を検討してください。JavaScript APIおよびMAFの詳細は、付録B「アプリケーション・コンテナAPI」を参照してください。

- リモートURL: Webアプリケーションへの参照。既存のWebアプリケーションをモバイル用に拡張し、さらにデバイス・サービスを拡張できます。リモート・コンテンツでは、ローカル・データ・キャッシュや、サーバー側データおよび機能の一式を提供することによって、MAF AMXおよびローカルHTMLコンテンツの両方を補完できます。リモートURL実装には、有効なWebアドレスとホストされたモバイル・アプリケーションが必要です。詳細は、第12章「リモートURLを使用したアプリケーション機能コンテンツの実装」を参照してください。

新しいアプリケーション・コンテンツを作成するには:

1. MAF機能エディタの「アウトライン」にリストされているアプリケーション機能を選択します。

2. 右マウス・ボタンをクリックし、「新」を選択します(図4-23を参照)。

   図4-23 新しい機能のためのポップアップ・メニュー

3. 新規オブジェクト・ダイアログで、「コンテンツ」ノードを展開し、必要に応じて、生成されたIDに対応する次のコンテンツ・タイプのいずれかを選択し、「OK」をクリックします。

   - 「AMXページ」。図4-27を参照してください。

   - 「タスク・フロー」。

   - 「ローカルHTML」。図4-24を参照してください。

   - 「リモートURL」。図4-26を参照してください。

4. コンテンツ固有のパラメータを定義します。

   - AMXページの場合は、「参照」をクリックして既存のページを指定するか、または「作成」をクリックして新規MAFページ・ダイアログを開きます。図4-27を参照してください。

   - タスク・フローの場合は、「参照」をクリックして既存のページを指定するか、または「作成」をクリックして新規MAFタスク・フロー・ダイアログを開きます。

   - ローカルHTMLファイルの場合は、「参照」をクリックして既存のページを指定するか、または「作成」をクリックして新規モバイルHTMLページ・ダイアログを開きます。図4-24を参照してください。

   - ローカルHTMLファイルの場合は、「参照」をクリックして既存のページを指定するか、または「作成」をクリックして新規モバイルHTMLページ・ダイアログを開きます。図4-24を参照してください。このファイルの親フォルダを選択し、後で使用できるように説明的なファイル名を付けます。ファイルをHTMLまたはXHTMLのいずれの形式で保存するかを選択し、「終了」をクリックします。これはアプリケーション機能なので、このページはビュー・コントローラ・プロジェクトのWeb Contentフォルダに格納されます。

     図4-24 アプリケーション機能のコンテンツとしてのローカルHTMLページの作成

   - リモートURLコンテンツの場合は、図4-25のように接続を選択します。これは、サーバー上のWebページのアドレス(および起動ページの場所)を表しています。

     図4-25 ホスト・アプリケーションの接続の選択

     この接続を作成するには、まず「作成」をクリックし、次に「URL接続の作成」ダイアログに入力します(図4-26を参照)。このダイアログの詳細は、Oracle Enterprise Pack for Eclipseのオンライン・ヘルプを参照してください。この接続は、`connections.xml`ファイルに格納されます。

     図4-26 URL接続の作成

アプリケーション機能のコンテンツをAMXページとして指定するには:

1. 新しいAMXページの親フォルダを選択します。

2. モバイル・アプリケーションでの作業時に簡単に識別できるよう説明的な名前をページに付けます。

3. 「終了」をクリックしてページを保存します。図4-27に新規MAFページ・ダイアログを示します。

   図4-27 MAF AMXをコンテンツ・タイプとして選択

### 4.11.2 外部リソースの選択に関する必知事項

デプロイメントを可能にするために、次の属性によって参照されるすべてのリソースは、ビュー・プロジェクトの`ViewContent`ディレクトリ内に配置する必要があります。

- `<adfmf:feature>`の`icon`および`image`属性(例: `<adfmf:feature id="PROD" name="Products" icon="feature_icon.png" image="springboard.png">`)。第4.10.1項「アプリケーション機能の基本情報の定義方法」も参照してください。

- `<adfmf:content>`の`icon`および`image`属性(例: `<adfmf:content id="PROD" icon="feature_icon.png" image="springboard_image.png">`)。第4.11項「アプリケーション機能のコンテンツ・タイプの定義」も参照してください。

- `<adfmf:amx>`の`file`属性(例: `<adfmf:amx file="PRODUCT/home.amx" />`)。第4.11項「アプリケーション機能のコンテンツ・タイプの定義」も参照してください。

- <`adfmf: localHTML`>の`url`属性(例: `<adfmf:localHTML url="oracle.hello/index.html"/>`)。第4.11項「アプリケーション機能のコンテンツ・タイプの定義」および第21.5.3.2項「カスタム・ログイン・ページ」も参照してください。

- `<adfmf:includes>`の`type=stylesheet`および`type=JavaScript`に対して定義するファイル属性(例: `<adfmf:include type="JavaScript" file="myotherfile.js"/>`または`<adfmf:include type="StyleSheet" file="resources/css/stylesheet.css" id="i3"/>`)。第4.13項「モバイル・アプリケーションのスキニング」も参照してください。

MAFは、別の場所から参照されるリソースをサポートしていません。つまり、たとえば`../`を接頭辞として使用して、`public_html`ディレクトリ外部に値を入力することはできません。

## 4.12 ローカライズ・コンテンツの操作

ローカライゼーションは、テキストを変換し、ロケール固有のコンポーネントを追加することで、特定地域の言語または文化にアプリケーションを適応させるプロセスです。様々なロケールを使用するようにMAFアプリケーションとそのユーザー・インタフェース・ページを構成することにより、モバイル・デバイス上で設定された言語にあわせて作成されているかのようにMAFアプリケーションを表示することができます。たとえば、フランス語を話す人がMAFアプリケーションを閲覧できるようにすることで、MAFアプリケーションの利用の拡大を図る場合は、デバイスのSpringboardとMAFのWeb ビュー内の両方で使用されるアプリケーションのテキスト文字列とイメージがフランス語で表示されるようにアプリケーションをローカライズすることができます(つまり、productsをles produitsに変換するという具合に)。

Oracle Enterprise Pack for Eclipseでは、これらのテキスト・リソースを28の言語に自動的に変換します。Oracle Enterprise Pack for Eclipseでは、ロケール固有のリソースを提供する抽象クラス`java.util.ResourceBundle`を使用してMAFコンポーネントのローカライズをサポートします。ローカライゼーションのサポートはOracle Enterprise Pack for EclipseのMAF実装に組み込まれていますが、デザインタイム・エディタでは自動的にはサポートされません。ローカライゼーション用のテキスト文字列を手動で入力できます。

翻訳可能な文字列(バリデータ・エラー・メッセージや属性コントロール・ヒントなど)を定義すると、定義したものがOracle Enterprise Pack for Eclipseによってプロジェクトレベルのリソース・バンドル・ファイルに格納されます。MAFでは英語の言語テキスト・リソースを指定します(ただし、他の言語では、任意のツールを使用して、リソース・バンドル・ファイルを生成できます)。変換可能なUI文字列をアプリケーション・レベルとビュー・プロジェクト・レベルの両方で格納するように、モバイル・アプリケーションを構成できます。

### 4.12.1 リソース・バンドルの使用

MAFは、ローカライゼーションにXLIFF (XML Localization Interchange File Format)ファイルのみを使用します。つまり、Oracle Enterprise Pack for Eclipseは、文字列を格納するためのリソース・バンドルとして`.xlf`ファイルを作成します。XLIFFの詳細は、次を参照してください。

`http://docs.oasis-open.org/xliff/xliff-core/xliff-core.html`.

#### 4.12.1.1 リソース・バンドルでの文字列の入力方法

プロジェクト・レベルではリソース・バンドル・ファイルを作成します。このとき使用するリソース・バンドル・ダイアログにアクセスするには、MAF機能エディタまたはMAFアプリケーション・エディタを開き、「名前」フィールドの横にある外部化ボタンをクリックします。文字列の外部化ダイアログが開くので、このダイアログを使用して、表4-6および表4-7に示す`maf-application.xml`属性および`maf-feature.xml`属性用のベース・リソース・バンドルにテキスト・リソースを自動的に作成することができます。

アプリケーション・レベルでは、MAFアプリケーション・エディタを使用してアプリケーション名やプリファレンス・ページのラベルなどの属性の文字列をローカライズできます。表4-6にこれらを示します。

表4-6 ローカライズ可能なMAFアプリケーションの属性

要素 | 属性
--- | ---
`<adfmf:Application>` | `name`
`<adfmf:PreferenceGroup>` | `label`
`<adfmf:PreferencePage>` | `label`
`<adfmf:PreferenceBoolean>` | `label`
`<adfmf:PreferenceText>` | `label`
`<adfmf:PreferenceNumber>` | `label`
`<adfmf:PreferenceList>` | `label`
`<adfmf:PreferenceValue>` | `name`

プロジェクト(ビュー・コントローラ)レベルでは、MAF機能エディタを使用して、表4-7に示すアプリケーション機能関連の属性をローカライズできます。

表4-7 アプリケーション機能のローカライズ可能な属性

要素 | 属性
--- | ---
`<adfmf:Feature>` | `name`
`<adfmf:Constraint>` | `value`
`<adfmf:Parameter>` | `value`
`<adfmf:PreferencePage>` | `label`
`<adfmf:PrefrenceGroup>` | `label`
`<adfmf:PreferenceBoolean>` | `label`
`<adfmf:PreferenceText>` | `label`
`<adfmf:PreferenceNumber>` | `label`
`<adfmf:PreferenceList>` | `label`
`<adfmf:PreferenceValue>` | `name`

ローカライズされた文字列をリソース・バンドル内に作成するには:

1. MAF機能エディタで属性を選択し(図4-28の`「名前」`など)、「外部化」をクリックします。これによって文字列の外部化ダイアログが開きます。

2. リストから既存のプロパティを選択し、「OK」をクリックします。

   図4-28 外部化文字列の編集ダイアログの選択

3. 文字列の外部化ダイアログ(図4-29を参照)で、「新規プロパティの作成」をクリックして新しい文字列ソースを作成します。表示値、キー、説明を入力して、「OK」をクリックします。

   図4-29 外部化文字列の編集ダイアログの選択

   注意: 既存の外部化された文字列を編集するには、既存のプロパティの一覧からいずれか1つを選択し、鉛筆のアイコンをクリックします。これによって外部化文字列の編集ダイアログが開きます(このダイアログでは文字列の値とその説明を変更できますが、キーは変更できません)。

#### 4.12.1.2 リソース・バンドル追加時の処理

「テキスト・リソースの選択」ダイアログでリソースを追加すると、Oracle Enterprise Pack for Eclipseによって、指定した表示名の文字列とキー・ファイルをADF Meta-INFファイルに格納した、新しいプロジェクト・リソース・バンドルが作成されます(`mafapplication.xliff`を参照)。

属性を初めてローカライズすると、Oracle Enterprise Pack for Eclipseによって`<adfmf:loadbundle>`要素が追加されます。この要素の`basename`属性が、新しく作成したリソース・バンドルを参照します。

さらにOracle Enterprise Pack for Eclipseは、ローカライズされた属性文字列を、リソース・バンドル内で定義された文字列のキーを参照するEL式に変更します。たとえば、Oracle Enterprise Pack for Eclipseは、Acme Salesというアプリケーション名属性を、「テキスト・リソースの選択」ダイアログでキーとして入力されたACME_SALES値に基づいて、`name="#{acmeBundle.Acme_Sales}"`に変更します。

アプリケーション・レベルではリソース・バンドル・ファイルが1つしか存在しないので、Oracle Enterprise Pack for Eclipseは、ローカライズされた各文字列を同じリソース・バンドル・ファイルに追加します。

`maf-application.xml`および`maf-feature.xml`ファイルには、それぞれ`adfmf:loadBundle`要素が1つのみ格納されています。アプリケーションをデプロイすると、リソース・バンドルはランタイムによって想定される言語フォーマットに変換されます。

#### 4.12.1.3 MAF AMXコンポーネントの文字列のローカライズ方法

`<amx:commandButton>`の`text`属性のようなMAF AMXコンポーネントの属性には、リソース・バンドルを作成できます。表4-8に、これらのMAF AMX (`amx`)コンポーネントを示します。

表4-8 MAF AMXコンポーネントのローカライズ可能な属性

コンポーネント | 属性
--- | ---
`<amx:inputDate>` | `label`
`<amx:inputNumberSlider>` | `label`
`<amx:panelLabelAndMessage>` | `label`
`<amx:selectBooleanCheckBox>` | `label`
`<amx:selectBooleanSwitch>` | `label`
`<amx:selectItem>` | `label`
`<amx:selectManyCheckBox>` | `label`
`<amx:selectManyChoice>` | `label`
`<amx:selectOneButton>` | `label`
`<amx:selectOneChoice>` | `label`
`<amx:selectOneRadio>` | `label`
`<amx:commandButton>` | `text`
`<amx:commandLink>` | `text`
`<amx:goLink>` | `text`
`<amx:inputText>` | `label`、`value`、`hintText`
`<amx:outputText>` | `value`

MAF AMXコンポーネントで文字列を使用するには:

1. 図4-30のように`<amx:selectOneButton>`コンポーネントに定義されている値属性などの属性をAMXエディタで選択します。

   図4-30 プロパティによる文字列の外部化

2. 右マウス・ボタンをクリックし、「ソース」→「文字列の外部化」を選択します。「文字列の外部化」ダイアログが表示されます(図4-31を参照)。

3. 「文字列の外部化」ダイアログで、表示名、キーを入力することで文字列リソースを編集し、「終了」をクリックします。

   図4-31 リソース・バンドルへの文字列の追加

#### 4.12.1.4 MAF AMXコンポーネントのプロジェクトレベルのリソース・バンドルを作成する場合の処理

例4-16の`<amx:outputText>`の`value`属性のように、コンポーネントをローカライズすると、Oracle Enterprise Pack for Eclipseによって文字列がEL式に変換されます(たとえば、例4-16の`#{viewControllerBundle.NewPage_header}`)。

例4-16 MAF AMXコンポーネントのローカライズ

    <amx:facet name="header">
          <amx:outputText value="#{viewControllerBundle.NewPage_header}"
           id="ot1" />
        </amx:facet>

さらに、例4-17の`ViewControllerBundle.xlf`のように、Oracle Enterprise Pack for Eclipseはプロジェクトのデフォルト・パッケージの下にリソース・バンドルを作成します。生成された`<amx:loadBundle>`コンポーネントでは、`basename`はこのパッケージを表しています。

例4-17 <amx:loadBundle>コンポーネント

    <amx:loadBundle basename="mycomp.mobile.ViewControllerBundle"
                     var="viewcontrollerBundle"
                     id="lb1"/>

#### 4.12.1.5 イメージ・ファイルのローカライズに関する必知事項

イメージがテキストを格納していたり、特定の国または地域を反映している場合(たとえば旗のピクチャなど)、文字列の外部化に使用する同じXLIFFファイル・プロセスを介して、ローカライゼーション・プロセスの一環として代替イメージを指定できます。図4-32を参照してください。

図4-32 XLIFFファイルでのイメージの外部化

イメージをハードコード化することはできません(`icon="/feature1/test.png"`など)。そのかわり、イメージのパスの`<trans-unit>`要素を追加することで、`ViewControllerBundle.xlf`ファイルを手動で編集する必要があります(例4-18を参照)。

例4-18 <amx:image>コンポーネントのリソースの定義

    <amx:image id="i1" source="#{viewControllerBundle.NewPage_icon2JPG}"
     shortDesc="#{viewControllerBundle.NewPage_myFavoriteImage}" />
             <trans-unit id="NewPage_icon2JPG">
                 <source>/icon2.JPG</source>
                 <target/>
             </trans-unit>
             <trans-unit id="NewPage_myFavoriteImage">
                 <source>My Favorite Image</source>
                 <target/>
             </trans-unit>
    <trans-unit id="IMAGEPATH">
         <source>/feature1/test.jpg</source>
         <target/>
    </trans-unit>

注意: 例4-18の`<source>`要素で定義されているイメージの場所は、`ViewController\public_html`のアプリケーション機能ファイルの場所を基準にした相対的な場所です。または、イメージ・ファイルの名前を入力することもできます(例: `<source>test.png</source>`)。第4.11.2項「外部リソースの選択に関する必知事項」も参照してください。

`ViewControllerBundle.xlf`を更新すると、Oracle Enterprise Pack for Eclipseによって`icon`属性のソース属性のEL式が自動的に作成されます。

#### 4.12.1.6 リソース・バンドル・ファイルの編集方法

XLIFFファイルまたはJavaクラス・ファイルを作成したら、ソース・エディタを使用して編集できます。MAFエディタのいずれかを使用する場合は、ファイル上でExternalizeコマンドを呼び出すことができます。

#### 4.12.1.7 iOSアプリケーションのXLIFFファイルに関する必知事項

`<adfmf:loadBundle>`要素によって説明された場所には、1つ以上のXLIFFファイルが存在している必要があります。XLIFFファイルのファミリには、次のファイルが含まれています。

- ベースXLIFFファイル: ベースXLIFFファイルの名前は、`basename`属性によって指定されたパス内の最後のトークンと一致する必要があります。このファイルには`.xlf`という拡張子が付きます(例: `ViewControllerBundle.xlf`)。次の定義では、ファイルの名称は`ViewControllerBundle`です。

      <adfmf:loadBundle var="stringBundle" basename="view.ViewControllerBundle"/>

- ゼロ個以上のローカライズされたXLIFFファイル: 各ベースXLIFFファイルには、ゼロ個(以上)のローカライズされたXLIFFファイルを存在させることができます。各ファイルには次のきまりがあります。

  - ファイル拡張子は`.xlf`である必要があります。

  - 対応するベースXLIFFファイルと同じディレクトリにコロケートさせる必要があります。

  - ファイル名の形式は次のようになります。

        <BASE_XLIFF_FILE_NAME>_<LANGUAGE_TOKEN>.xlf

    ここでは、次のようになります。

    - `<BASE_XLIFF_FILE_NAME>`は、ベースXLIFFファイル名です(拡張子`.xlf`は含みません)。

    - `<LANGUAGE_TOKEN>`の形式は次のとおりです。

          <ISO-639-lowercase-language-code>

      注意: MAFは、国または地域をサポートしていません。

      たとえば、スペインの場合、言語トークンは`es`になります。

    たとえば、言語コードが`en`、`es`、`fr`の場合、`stringBundle.xlf`という名前のベースXLIFFを参照するXLIFFファイルのローカライズされたファイル名は次のようになります。

    - `stringBundle_en.xlf`

    - `stringBundle_es.xlf`

    - `stringBundle_fr.xlf`

#### 4.12.1.8 iOSアプリケーションの国際化

`maf-application.xml`および`maf-feature.xml`ファイルのローカライズ可能な要素は、表4-7および表4-6に示す属性内で、ELに似た文字列を使用して国際化された文字列を参照します。これらの構成ファイルはアプリケーション・ライフサイクルの初期に読み取られるので、これらの文字列は実行時にはEL文として評価されません。そのかわり、これらの文字列は、ネイティブ・デバイス変換インフラストラクチャにおいて変換された文字列の完全なキーとして取得されます。

式言語の構文は`"${BUNDLE_NAME.STRING_KEY}"`ですが、MAFは`"#{}"`によって囲まれた文字列全体をキーとして使用して、変換された文字列を検索します。これらの文字列の形式は、`#{bundleName.['My.String.ID']}` (ここではXLIFF文字列がピリオドによって分割されています)と、`#{bundleName.['MyStringID']}` (これはピリオドによって分割されない文字列の識別子に対してのみ使用されます)になります。例4-19には、`#{strings.CONTACTS}` (`name`属性を変更します)など、後者の例が示されています。iOSネイティブ・フレームワークでは、デプロイメントで、その文の内容が、変換に使用される`*.string`ファイル内の適切なキーと必ず一致するようになっています。

エンド・ユーザーに表示される属性、またはエンド・ユーザーに表示されるコンテンツの場所を制御する属性のみが、国際化された文字列の使用をサポートしています。そこには次のような属性が含まれています。

- `<adfmf:application>`要素の`name`属性

- `<adfmf:feature>`要素の`name`属性

- `<adfmf:feature>`要素の`icon`属性

- `<adfmf:feature>`要素の`image`属性

- `<adfmf:content>`要素の`icon`属性

- `<adfmf:content>`要素の`image`属性

例4-19では、`name`、`icon`、`image`属性を持つアプリケーション機能が国際化文字列を使用しています。

例4-19 文字列を使用した国際化

    <adfmf:feature id="CTCS" name="#{strings.CONTACTS}"
                             icon="#{strings.CONTACTS_ICON}"
                             image="#{strings.CONTACTS_IMAGE}">
            <adfmf:constraints>
                <adfmf:constraint property="user.roles"
                                  operator="contains"
                                  value="employee" />
            </adfmf:constraints>
            <adfmf:description>The HTML Device Contacts</adfmf:description>
            <adfmf:loadBundle basename="mobile.adfmf-stringsBundle"
                              var="strings"/>
            <adfmf:content id="CTCS.Generic">
                <adfmf:constraints />
                <adfmf:localHTML url="contacts.html" />
            </adfmf:content>
      </adfmf:feature>

`<adfmf:loadBundle>`要素を定義するときに(例4-20を参照)、バンドル名と実際のバンドルとのマッピングを作成します。バンドル名は、式を評価するときに使用します。

例4-20 <adfmf:loadBundle>を使用したバンドル名のマッピング

       <adfmf:constraints>
          <adfmf:constraint property="user.roles"
                            operator="contains"
                            value="employee" />
       </adfmf:constraints>
            <adfmf:description>The HTML Device Contacts</adfmf:description>
            <adfmf:loadBundle basename="mobile.adfmf-featureBundle"
                              var="mobileBundle"/>
            <adfmf:loadBundle basename="mobile.adfmf-stringsBundle"
                              var="strings"/>

MAFのランタイムでは、JVMへの最初のアクセスまで、`<adfmf:loadBundle>`要素が保持されます。メッセージがJVMに送信され、パッケージのベース名からバンドルのEL名へのマッピングが初期化されます。例4-21は、JVMに送信されるメッセージの構造を示しています。

例4-21 ベース名からEL名へのマッピングを初期化するメッセージ

    {classname:"oracle.adfmf.framework.api.Model",method:"setBundles",
     params:[[{basename:"mobile.adfmf-featureBundle",elname:"mobileBundle"},
              {basename:"mobile.adfmf-stringsBundle",elname:"strings"}]]}

## 4.13 モバイル・アプリケーションのスキニング

MAFではCSS (Cascading Style Sheet)言語ベースのスキンを使用するので、モバイル・アプリケーション内の(その要素のアプリケーション機能で使用されるものを含む)すべてのアプリケーション・コンポーネントが一貫したルック・アンド・フィールを確実に共有するようになっています。MAF AMXまたはHTMLコンポーネントを再構成してモバイル・アプリケーションの外観を変更するかわりに、コンポーネントの表示方法を変更するスキンを作成または拡張できます。MAFは実行時にスキンを適用するので、スキンに対する変更はアプリケーションの起動時に有効になります。

第3.2.2項「MAFアプリケーション作成時の処理」に示したように、アプリケーション・コントローラ・プロジェクトの作成によって生成されるアーティファクトには、2つのスキニング関連ファイル、`maf-config.xml`および`maf-skins.xml`が含まれます。これらのファイルを使用して、モバイル・アプリケーションのスキニングを制御します。`maf-config.xml`ファイルでは、アプリケーション・コンポーネントのレンダリングに使用するデフォルト・スキン・ファミリを指定し、`maf-skins.xml`ファイルでは、デフォルト・スキン・ファミリをカスタマイズしたり、新しく定義することができます。

### 4.13.1 maf-skins.xmlファイルについて

モバイル・アプリケーションを作成すると、Oracle Enterprise Pack for Eclipseによって、`maf-skins.xml`ファイルがモバイル・アプリケーションのsrc/META-INFノードに移入されます。ファイル自体には空の`adfmf-skins`タグが移入され、`skin`タグと`skin-addition`タグは後で追加できます。

例4-22 adfmf-skinsタグが移入されたmaf-skins.xmlファイル

    <?xml version="1.0" encoding="UTF-8" ?>
    <adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/skin"></adfmf-skins>

注意: 実行時にEL式を使用してスキン値を決定できます。詳細は、第4.13.11項「実行時の動的スキン選択の有効化」を参照してください。

MAFでは、階層としてスキンを適用します。最上位はデバイス固有のスキン、その後にプラットフォーム固有のスキン、ベース・スキンの`mobileAlta`と続きます。MAFの`mobileAlta`スキン・ファミリの場合、この階層は次のように表されます。

1. `mobileAlta.``<DeviceModel>` (たとえば、`mobileAlta.iPhone5,3`)

2. `mobileAlta.iOS`または`mobileAlta.Android`

3. `mobileAlta`

MAFでは、この階層のデバイス固有のレベルで定義されたセレクタを優先します。つまり、MAFでは、`mobileAlta.iOS`で定義されたセレクタを、同じセレクタに対する`mobileAlta.iPhone`の定義で上書きします。第4.13.3項「maf-skins.xmlファイルについて」で定義されている`<extends>`要素によって、この階層がMAFランタイム用に定義されます。様々なレベルでのスキンの適用方法の詳細は、第4.13.10項「スキニングに関する必知事項」を参照してください。

### 4.13.2 MAFスタイルに関する必知事項

ベース・スキン・ファミリ`mobileAlta`の基礎となるスキニング・スタイルは、`amx.css`、`amx-mobileAlta-1.2.css`および`amx-v1.2.css`ファイル内で定義されます。MAF AMXページのセレクタを定義するこれらのファイルは、`www\css`ディレクトリ内にあります。このディレクトリにアクセスするには、シミュレータまたはデバイスにモバイル・アプリケーションをデプロイしてから、アセンブリ・プロジェクトのデプロイメント・サブディレクトリ(たとえば、`assembly project\.main.android`)に移動します。`www\css`ディレクトリは、デプロイメントによって生成された、プラットフォーム固有のアーティファクト内にあります。iOSデプロイメントの場合、このディレクトリは`temporary_xcode_project`ディレクトリ内にあります。Androidデプロイメントの場合、このディレクトリはAndroidアプリケーション・パッケージ(`.apk`)ファイルの`build/release/assets`または`build/debug/assets`ディレクトリ内にあります。

注意: MAF DOM構造に依存するスタイルを記述しないでください。また、これらのファイル内で定義されている一部のセレクタは、サポートされていない場合があります。

### 4.13.3 maf-skins.xmlファイルについて

アプリケーション・コントローラ・プロジェクトのMETA-INFノードにある`maf-skins.xml`ファイルは、`<skin>`および`<skin-addition>`要素を使用します。既存のスキンを拡張して新しいスキンを作成するには、`<skin>`要素を使用します。`<skin-addition>`要素は、既存のスキンにスタイル・シートを追加します。

デフォルトでは、このファイルは空ですが、表4-9に示されている要素によって子要素を記述します。これらの子要素をこのファイルに移入することで、`mobileAlta`を拡張したり、アプリケーションで使用できるCSSファイルを定義できます。新しいスキンを作成したり、既存のスキンを拡張するには、`<skin>`要素を使用します。

表4-9 <skin>要素の子要素

要素 | 説明
--- | ---
`<id>` | `maf-skins.xml`ファイル内でスキンを識別する必須の要素。指定する値は、次のいずれかの形式に準拠している必要があります。 skinFamily-version skinFamily-version.platform たとえば、Apple iPadまたはiPhoneへのデプロイ時にアプリケーションの外観を定義するアプリケーションのスキンを登録する場合は、`mySkin-v1.iOS`を指定します。登録したスキンによって、iPadまたはiPhoneのアプリケーションの外観が定義される場合は、`iOS`を`iPad`または`iPhone`に置き換えます。Androidプラットフォームへのデプロイ時にアプリケーションの外観を定義するスキンを登録する場合は、`.android`を指定します。
`<family>` | スキン・ファミリを識別する必須の要素。
`<extends>` | 既存のスキンを拡張するには、この要素を使用し、拡張するスキンのスキンIDを指定します。
    <skin>
      <id>mySkin-v1</id>
      <family>mySkin</family>
      <extends>mobileAlta-v1.2</extends>
      <style-sheet-name>styles/myskin.css</style-sheet-name>
      <version>
        <name>v1</name>
      </version>
    </skin>
`<style-sheet-name>` | 相対URLを使用して、モバイル・アプリケーションのプロジェクト内のCSSファイルの場所を指定します。たとえば、SkinningDemoサンプル・アプリケーション内の`maf-skins.xml`ファイルには、アプリケーション・コントローラ・プロジェクトの`css`ディレクトリにある`v1.css`スタイル・シートへの次の参照が含まれます。 `<style-sheet-name>css/v1.css</style-sheet-name>`
`<version>` | 様々なバージョンのスキンを指定します。詳細は、第4.13.7項「MAFスキンのバージョニング方法」を参照してください。

表4-10は、スタイル・シートを既存のスキンに統合する場合に、MAF CSS内で`<skin-addition>`要素を定義するために使用できる要素を示しています。

表4-10 <skin-addition>の子要素

要素 | 説明
--- | ---
`<skin-id>` | スタイル・シートを追加する必要のあるスキンのIDを指定します。使用可能な値には、MAFで提供されるスキン(例: `mobileAlta-v1.2.iOS`)またはユーザーが作成するカスタム・スキンなどがあります。
`<style-sheet-name>` | 相対URLを使用して、モバイル・アプリケーションのプロジェクト内のCSSファイルの場所を指定します。たとえば、SkinningDemoサンプル・アプリケーション内の`maf-skins.xml`ファイルには、アプリケーション・コントローラ・プロジェクトの`css`ディレクトリにある`v1.css`スタイル・シートへの次の参照が含まれます。 `<style-sheet-name>css/v1.css</style-sheet-name>`

例4-23では、`<style-sheet-name>`要素でCSSファイルの場所を、`<skin-id>`でターゲット・スキン・ファミリを指定しています。

例4-23 <skin-addition>要素の使用

    <?xml version="1.0" encoding="UTF-8" ?>
    <adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/config">
      <skin-addition>
        <skin-id>mobileAlta-v1.2.iOS</skin-id>
        <style-sheet-name>skins/mystyles.iphone.addition1.css</style-sheet-name>
      </skin-addition>
    </adfmf-skins>

`<skin-id>`要素および`<style-sheet-name>`要素を使用して特定のiOSデバイスまたはAndroidデバイスにレンダリングすることも、プラットフォームのすべてのデバイスのスタイル設定を処理するように、これらの要素を定義することもできます。表4-11に、iOSプラットフォームに属するすべてのデバイスと、特定のiOSデバイス・タイプ(タブレット、電話、シミュレータ)をターゲットとするこれらの要素の使用例を示します。

ヒント: デバイス・モデルに関する情報を取得するには、付録F「モバイル・アプリケーション・フレームワークのサンプル・アプリケーション」に記載されているDeviceDemoサンプル・アプリケーションの使用を検討してください。

表4-11 プラットフォームおよびデバイス固有のスタイル設定

デバイス | 例
--- | ---
iPhone |
    <skin-addition>
       <skin-id>mobileAlta-v1.2.iPhone5,1</skin-id>
       <style-sheet-name>iPhoneStylesheet.css</style-sheet-name>
    </skin-addition>
iPad |
    <skin-addition>
       <skin-id>mobileAlta-v1.2.iPad4,2</skin-id>
       <style-sheet-name>iPadStylesheet.css</style-sheet-name>
    </skin-addition>
iPhone Simulator |
    <skin-addition>
       <skin-id>mobileAlta-v1.2.iPhone Simulator x86_64</skin-id>
       <style-sheet-name>iPhoneSimStylesheet.css</style-sheet-name>
    </skin-addition>
すべてのiOSデバイス |
    <skin-addition>
       <skin-id>mobileAlta-v1.2.iOS</skin-id>
       <style-sheet-name>iOSSimStylesheet.css</style-sheet-name>
    </skin-addition>

### 4.13.4 アプリケーションへのカスタム・スキンの追加方法

アプリケーションにカスタム・スキンを追加するには、まずアプリケーション・コントローラ・プロジェクトのViewContentディレクトリ内にCSSファイルを作成し、次にそのファイルを`skin-addition`または`skin tag`のいずれかを使用して`maf-skins.xml`から参照します。

カスタム・スキンをアプリケーションに追加する手順:

1. メイン・メニューから「ファイル」→「新」→「その他」を選択し、フィルタにCSSと入力します。「Web」→「CSSファイル」を選択します。

2. 新規CSSファイル・ウィザードで、CSSファイルの名前とディレクトリ(ViewContentディレクトリのサブディレクトリ)を指定します。

3. 「OK」をクリックします。

### 4.13.5 アプリケーションで使用するスキンの指定方法

`maf-config.xml`ファイルで、アプリケーションで使用されるスキンを決定する値を構成します。

アプリケーションで使用するスキンを指定するには:

1. プロジェクト・エクスプローラで、アセンブリ・プロジェクト、`adf`、`META-INF`の順に展開し、`maf-config.xml`ファイルをダブルクリックしてXMLエディタで開きます。

2. `maf-config.xml`ファイルに、使用するスキンの`<skin-family>`要素、および`<skin-version>`要素(オプション)の値を指定します(図4-33を参照)。

   図4-33 maf-config.xmlの編集

   ソース・エディタにファイルを表示するには、XMLエディタの下部にある「ソース」タブをクリックします。例4-24に、モバイル・アプリケーションで`mobileAlta.v1.2`スキンを使用するために必要な構成を示します。

   例4-24 アプリケーションのスキンを指定する構成

       <adfmf-config xmlns="http://xmlns.oracle.com/adf/mf/config">
         <skin-family>mobileAlta</skin-family>
         <skin-version>v1.2</skin-version>
       </adfmf-config>

注意: 実行時にアプリケーションによって使用されるスキンを動的に選択する場合は、EL式を`<skin-family>`要素の値として設定します。詳細は、第4.13.11項「実行時の動的スキン選択の有効化」を参照してください。

新しいスタイルシートをスキンに追加するには:

1. プロジェクト・エクスプローラで、「アプリケーション・プロジェクト」→「src」→「META-INF」フォルダの順に展開し、`maf-skins.xml`ファイルをダブルクリックしてXMLエディタで開きます。

2. 「設計」タブに切り替えます。`adfmf-skins`タグを選択し、右クリックします。「子の追加」→「skin-addition」を選択します。

   - skin-additionタグの下でskin-idタグを選択します。「コンテンツ」列に移動し、新しいスタイルを追加するスキンのIDを入力します(たとえば、`mobileAlta-v1.2`)。

   - skin-additionタグを右クリックし、「子を追加」→「style-sheet-name」を選択します。style-sheet-nameタグを選択し、「コンテンツ」列に進みます。ViewContentフォルダに対するcssファイルの相対パスを指定します。たとえば、`ViewContent/css/myaddedcss.css`にcssファイルを作成した場合は、値として`css/myaddedcss.css`を入力します。

3. `maf-skins.xml`ファイルを保存します。

注意: DOM変更構造を使用するカスタム・スタイルを作成すると、モバイル・アプリケーションがハングする可能性があります。特に、`display`プロパティでは、MAF AMXから変換されたHTMLでレンダリングに問題が発生します。このプロパティは、`table`、`table-row`、`table-cell`などの値を使用してコンポーネントを表に変換しており、適切な親の表オブジェクト内に含まれていない表関連の構造が作成される可能性があります。この問題はアプリケーションのユーザー・インタフェース自体には表示されないことがありますが、ロギング・コンソールではSignal 10の例外によってレポートされます。

### 4.13.6 カスタム・スキンの登録方法

アプリケーションへのカスタム・スキンを識別するプロパティ値を`maf-skins.xml`ファイルに追加することにより、カスタム・スキンを登録します。

カスタム・スキンを登録する手順:

1. プロジェクト・エクスプローラで、「アプリケーション・プロジェクト」→「src」→「META-INF」の順に展開し、maf-skins.xmlをダブルクリックしてXMLエディタで開きます。

2. 「設計」タブに切り替えます。adfmf-skinsタグを選択し、右クリックします。「子を追加」→「skin」を選択します。

3. skinノードを展開し、デフォルトでidタグとfamilyタグが作成されていることを確認してください。右クリックしてから、「子を追加」→「extends」を選択して`extends`を作成するか、または「子を追加」→「style-sheet-name」を選択して`style-sheet-name`を作成することができます。

4. 次のフィールドのいずれかを選択し、値を次のように編集するために「コンテンツ」列に進みます。

   - family: スキンのファミリ名の値を入力します。

     新しい名前を入力することも、既存のファミリ名を指定することもできます。既存のファミリ名を指定した場合は、第4.13.7項「MAFスキンのバージョニング方法」に示すように、スキンをバージョニングして、同じファミリ値を持つスキンを区別します。

     入力した値は、作成したスキンを登録する場所である`maf-skins.xml`ファイル内の`<family>`要素の値として設定されます。実行時に、アプリケーションの`maf-config.xml`に含まれる`<skin-family>`要素は、この値を使用して、アプリケーションで使用されるスキンを識別します。

   - id: 名前書式`skinFamily-version`または`skinFamily-version.platform`のいずれかを使用してスキンのIDを入力します。`mySkinFamily-v1.1.android`は一例です。

   - extends: 拡張する親スキンの名前を入力します。たとえば、カスタム・スキンで`mobileAlta-v1.2`スキンを拡張する場合、`mobileAlta-v1.2`を入力します。

   - style-sheet-name: スタイルシートの名前を入力または選択します。

5. `maf-skins.xml`ファイルを保存します。

### 4.13.7 MAFスキンのバージョニング方法

`<version>`要素を使用して、`maf-skins.xml`ファイルでスキンのバージョン番号を指定できます。`maf-skins.xml`ファイル内の`<family>`要素の値が同じであるスキンを区別する場合はこのオプション機能を使用します。この機能は、既存のなんらかの動作を変更するために既存のスキンの新しいバージョンを作成するシナリオで役に立ちます。特定のスキンを使用するようにアプリケーションを構成する場合は、第4.13.5項「アプリケーションで使用するスキンの指定方法」に説明されているように、`maf-config.xml`ファイルで値を指定してください。

`maf-skins.xml`ファイル内の`<version>`要素に値を入力して、スキンのバージョンを指定します。

ベスト・プラクティス: アプリケーションの`maf-skins.xml`ファイルに登録したスキンごとにバージョン情報を指定します。

MAFスキンをバージョニングするには:

1. プロジェクト・エクスプローラで、「アプリケーション・プロジェクト」→「src」→「META-INF」の順に展開し、`maf-skins.xml`をダブルクリックしてXMLエディタで開きます。

2. 「設計」タブに切り替えます。skinタグを選択し、右クリックします。「子を追加」→「version」を選択します。

3. 「version」を右クリックし、「子を追加」→「default」を選択します。第4.13.5項「アプリケーションで使用するスキンの指定方法」に示すように、`maf-config.xml`ファイルの`<skin-version>`要素に値が指定されていないときアプリケーションでスキンのこのバージョンを使用する場合には、defaultタグを選択し、「コンテンツ」列に移動し、デフォルト値を`true`として設定します。

4. skinタグの下のnameタグを選択し、「コンテンツ」列に進みます。「名前」フィールドの値を入力します。たとえば、これがスキンの最初のバージョンである場合は`v1`と入力します。

5. `maf-skins.xml`ファイルを保存します。

### 4.13.8 スキンをバージョニングした場合の処理

アプリケーションが実行時にスキンを適用する場合、スキンに対して構成したバージョン情報はプラットフォームおよびデバイスの値より優先されます。実行時に、モバイル・アプリケーションはデバイス固有のスキンを適用してからプラットフォーム固有のスキンを適用します。スキンのバージョン情報が指定されている場合、アプリケーションはまず指定されたスキン・バージョン値と一致するスキンを検索します。アプリケーションは、スキン・バージョンおよびデバイス値と一致するスキンを見つけると、そのスキンを適用します。指定されたスキン・バージョンを持つスキンがデバイス固有のスキン内で見つからなかった場合、アプリケーションは次にプラットフォーム固有のスキン内を探します。指定されたバージョンに一致するスキンが、有効なプラットフォーム固有のスキン内で見つからなかった場合は、ベース・スキン内を探します。

例4-25に、3つのスキン(`customFamily-v1.iphone5,3`、`customFamily-v2.iPhone`および`customFamily-v3.iPhone`)を参照する`maf-skins.xml`の例を示します。これらの各スキンの`<family>`要素は同じ値(`customFamily`)になっています。`<version>`要素の子要素の値によって、これらのスキンがそれぞれ区別されます。

実行時に、アプリケーションの`maf-config.xml`ファイルにおける`<skin-family>`要素の値として`customFamily`が指定されたアプリケーションでは、`customFamily-v1.iphone5,3`を使用します。これは、このスキンが`maf-skins.xml`ファイルでデフォルト・スキンとして構成されているためです(`<default>true</default>`)。この動作は、第4.13.5項「アプリケーションで使用するスキンの指定方法」で説明されているように、`maf-config.xml`ファイル内の`<skin-version>`要素に値を指定してオーバーライドできます。たとえば、`maf-config.xml`ファイル内の`<skin-version>`要素の値として`v2`を指定した場合、アプリケーションは`maf-skins.xml`ファイル内でデフォルトとして定義されている`customFamily-v1.iphone5,3`ではなく`customFamily-v2.iPhone`を使用します。

(`maf-config.xml`ファイル内の`<skin-version>`要素を使用して)選択するスキンのバージョンを指定しない場合、アプリケーションは`maf-skins.xml`内の`<default>true</default>`要素を使用してデフォルトとして定義されているスキンを使用します。デフォルトのスキンを指定しない場合、アプリケーションは`maf-skins.xml`内で定義される最後のスキンを使用します。例4-25において、定義される最後のスキンは`customFamily-v3.iPhone`です。

例4-25 バージョニングされたスキン・ファイルが含まれたmaf-skins.xmlファイル

    <?xml version="1.0" encoding="UTF-8" ?>
    <adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/skin">
      <skin id="s1">
        <family>customFamily</family>
        <id>customFamily-v1.iphone5,3</id>
        <extends>customFamily-v1.iOS</extends>
        <style-sheet-name>iphone.css</style-sheet-name>
        <version>
          <default>true</default>
          <name>v1</name>
        </version>
      </skin>
      <skin id="s2">
        <family>customFamily</family>
        <id>customFamily-v2.iPhone</id>
        <extends>customFamily-v1.iOS</extends>
        <style-sheet-name>iphone-v2.css</style-sheet-name>
        <version>
          <name>v2</name>
        </version>
      </skin>
      <skin id="s3">
        <family>customFamily</family>
        <id>customFamily-v3.iPhone</id>
        <extends>customFamily-v1.iOS</extends>
        <style-sheet-name>iphone-v3.css</style-sheet-name>
        <version>
          <name>v3</name>
        </version>
      </skin>
    </adfmf-skins>

### 4.13.9 デフォルト・スキン・スタイルのオーバーライド

MAF AMXアプリケーションでは、MAF AMXとして実装されたアプリケーション機能に対して特定のスタイルを指定することで、`maf-config.xml`および`maf-skins.xml`ファイル内のアプリケーション・レベルで設定されているデフォルトのスキン・スタイルをオーバーライドできます。アプリケーション機能に個別のスタイルを追加するには、CSSファイルを包含ファイルとして使用します。

#### 4.13.9.1 アプリケーション機能に新しいスタイル・クラスを適用する方法

`maf-feature.xml`ファイルのMAF機能エディタの「包含」セクションでは、MAF AMXアプリケーション機能にCSS (Cascading Style Sheet)を追加できます。

図4-34 「包含」セクション

始める前に:

第5.2項「タスク・フローの作成」に示すように、MAFタスク・フローを作成します。スキン用のCascading Style Sheet (CSS)ファイルを作成または追加します。CSSファイルを作成するには、ビュー・コントローラ・プロジェクトのViewContentフォルダを右クリックし、「ファイル」→「新」→「その他」を選択し、フィルタにCSSと入力します。「Web」→「CSSファイル」を選択します。

アプリケーション機能にスタイルを追加するには:

1. `maf-feature.xml`ファイルを開きます。コンテンツ・タイプとして「AMXページ」を持つ機能があることを確認します。

2. 「アウトライン」セクションで、「機能」→機能名→「コンテンツ」→「機能ID」の順に展開し、「包含」を選択します。選択時に、「包含」セクションはエディタの右側に表示されます(図4-35を参照)。

   図4-35 「スタイルシート」オプションの選択

3. 「参照」ボタンを選択し、「包含」セクションに含めるファイルを選択します。これによって、CSSスタイルシートまたはJavaScriptファイルの選択ダイアログが開きます(図4-35)。

4. ビュー・コントローラ・プロジェクトのViewContentディレクトリの下で、以前に作成したCSSファイルを選択します。

   注意: `.css`ファイルはビュー・コントローラ・プロジェクトに存在している必要があり、アプリケーション・コントローラ・プロジェクト内に存在する`.css`ファイルを含めることはできません。

   図4-36 アプリケーション機能のCSSの選択

5. `maf-feature.xml`ファイルを保存します。

### 4.13.10 スキニングに関する必知事項

`maf-skins.xml`ファイルで定義されるCSSファイル(例4-26参照)は、Apple iPhoneとiPadの異なる表示要件に適応するようにスキンを拡張する方法を示します。これらのスタイルは降順で適用されます。SkinningDemoサンプル・アプリケーションでは、アプリケーションを異なるデバイスにデプロイするときに、カスタマイズされたスタイルを適用できるようにする方法のデモが提供されています。この例を確認するには、「ファイル」→「新」→「MAFサンプル」を選択し、MAFサンプル・ページからSkinningDemoを選択します。

たとえば、iOSレベルでは、スタイルシート(例4-26の`mobileAlta`)がiPhoneまたはiPadのどちらにも適用されます。デバイス固有のスタイル用には、iPhoneおよびiPadのスキンに対して`<skin-id>`要素を定義します。スキニングのデモ・アプリケーションでは、この要素によって定義されたカスタム・スキンの使用方法が示されています。

例4-26 maf-skins.xmlファイルで定義されるスキニング・レベル

    <?xml version="1.0" encoding="UTF-8" ?>
    <adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/skins">
        <skin>
            <id>mobileAlta-v1.2.iPhone</id>
            <family>mobileAlta</family>
            <extends>mobileAlta-v1.2.iOS</extends>
            <style-sheet-name>skins/mobileAlta-v1.2.iphone.css</style-sheet-name>
        </skin>
        <skin>
            <id>mobileAlta-v1.2.iPad</id>
            <family>mobileAlta</family>
            <extends>mobileAlta-v1.2.iOS</extends>
            <style-sheet-name>skins/mobileAlta-v1.2.ipad.css</style-sheet-name>
        </skin>
        <skin>
            <id>mobileAlta-v1.2.iPod</id>
            <family>mobileAlta</family>
            <extends>mobileAlta-v1.2.iOS</extends>
            <style-sheet-name>skins/mobileAlta-v1.2.ipod.css</style-sheet-name>
        </skin>
        <!--  Skin Additions -->
        <skin-addition>
            <skin-id>mobileAlta-v1.2.iPhone</skin-id>
            <style-sheet-name>skins/mystyles.iphone.addition1.css</style-sheet-name>
        </skin-addition>
        <skin-addition>
            <skin-id>mobileAlta-v1.2.iPhone</skin-id>
            <style-sheet-name>skins/mystyles.iphone.addition2.css</style-sheet-name>
        </skin-addition>
        <skin-addition>
            <skin-id>mobileAlta-v1.2.iOS</skin-id>
            <style-sheet-name>skins/mystyles.ios.addition2.css</style-sheet-name>
        </skin-addition>
    </adfmf-skins>

### 4.13.11 実行時の動的スキン選択の有効化

実行時にエンド・ユーザーが他のスキンを選択できるように、アプリケーションを構成できます。この例を確認するには、「ファイル」→「新」→「MAFサンプル」を選択し、MAFサンプル・ページからSkinningDemoを選択します。エンド・ユーザーがニーズにより適したスキンを使用して、アプリケーションをレンダリングできるようにする場合に、この機能を構成できます。

図4-37では、実行時にアプリケーションで使用されるスキンをエンド・ユーザーが変更できるようにするボタンを表示することで、この機能を実装する方法を示しています。ページ上のボタンを構成して、後からアプリケーションの`maf-config.xml`ファイルの`skin-family`プロパティにより評価されるscope値を設定します。

図4-37 実行時におけるアプリケーションのスキンの変更(iOS)

#### 4.13.11.1 エンド・ユーザーによる実行時のアプリケーション・スキンの変更を有効にする方法

アプリケーションの`maf-config.xml`ファイルの`skin-family`プロパティの値の更新を可能にするコンポーネントを公開することにより、エンド・ユーザーがアプリケーションのスキンを変更できるようにします。

エンド・ユーザーに実行時のアプリケーションのスキンの変更を許可するには:

1. `maf-config.xml`のスキン・ファミリ・プロパティを設定するのに使用するコンポーネントを構成するページを開きます。

2. 図4-37のように、エンド・ユーザーが実行時に多数の使用可能なスキンの1つを選択できるようにする多数のコンポーネント(ボタン・コンポーネントなど)を構成します。

   例31-6に、図4-37のようにエンド・ユーザーが実行時に使用可能なスキンを選択できるようにする、`amx:commandButton`コンポーネントの構成方法を示します。各`amx:commandButton`コンポーネントにより、`actionListener`属性の値を指定します。エンド・ユーザーがボタンをクリックすると、この属性で`actionEvent`が`skins`というマネージドBean上のメソッド(`skinMenuAction`)に渡されます。

   例4-27 コンポーネントを使用したスキン・ファミリの設定

       ...
       <amx:commandButton text="Switch to Alta"
            actionListener="#{applicationScope.SkinBean.switchToMobileAlta}" id="cb1"/>
       <amx:commandButton text="Switch to Fusion Fx"
            actionListener="#{applicationScope.SkinBean.switchToMobileFusionFx}" id="cb2"/>
       ...

3. アプリケーションのビュー・コントローラ・プロジェクトにマネージドBeanを書き込み、エンド・ユーザーによって選択されたスキンの値を格納します。例4-28に、エンド・ユーザーが選択した値をとり、それをマネージドBean内の`skinFamily`の値の設定に使用するメソッドを示します。例4-28には、新しいスキンを使用するためにアプリケーション内のすべての機能をリセットするメソッドも記載されています。

   例4-28 アプリケーションのスキンを変更するためのマネージドBean

       package application;

       import javax.el.ValueExpression;
       import oracle.adfmf.amx.event.ActionEvent;
       import oracle.adfmf.framework.FeatureInformation;
       import oracle.adfmf.framework.api.AdfmfContainerUtilities;
       import oracle.adfmf.framework.api.AdfmfJavaUtilities;
       import oracle.adfmf.java.beans.PropertyChangeListener;
       import oracle.adfmf.java.beans.PropertyChangeSupport;

       public class SkinBean

       {
           private String skinFamily = "mobileAlta";
           private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

           public void setSkinFamily(String skinFamily) {
               String oldSkinFamily = this.skinFamily;
               this.skinFamily = skinFamily;
               propertyChangeSupport.firePropertyChange("skinFamily", oldSkinFamily, skinFamily);

           }

           public String getSkinFamily() {
               return skinFamily;
           }

           public void addPropertyChangeListener(PropertyChangeListener l) {
               propertyChangeSupport.addPropertyChangeListener(l);
           }

           public void removePropertyChangeListener(PropertyChangeListener l) {
               propertyChangeSupport.removePropertyChangeListener(l);
           }

           public void switchToMobileAlta(ActionEvent ev){
               this.switchSkinFamily("mobileAlta");
           }

           public void switchToMobileFusionFx(ActionEvent ev) {
               this.switchSkinFamily("mobileFusionFx");
           }

           public void switchSkinFamily(String family) {
               this.setSkinFamily(family);
               // reset all the features individually as follows to load the new skin
               FeatureInformation[] features = AdfmfContainerUtilities.getFeatures();
               for (int i = 0; i < features.length; i++) {
                   AdfmfContainerUtilities.resetFeature(features[i].getId());
               }
           }
       }

4. プロジェクト・エクスプローラで、「アプリケーション・リソース」パネルを展開し、「ディスクリプタ」→ADF Meta-INFノードの順に展開し、maf.config.xmlファイルをダブルクリックします。

5. `maf-config.xml`ファイルで、EL式を記述してスキン・ファミリを動的に評価します。

   `<skin-family>#{applicationScope.SkinBean.skinFamily}</skin-family>`

#### 4.13.11.2 実行時の処理: エンド・ユーザーによるアプリケーション・スキンの変更方法

実行時に、エンド・ユーザーは公開されたコンポーネントを使用して、別のスキンを選択します。例4-27では、これは多数の`amx:commandButton`コンポーネントの1つです。このコンポーネントは、エンド・ユーザーが選択した値をマネージドBeanに発行し、次にこれがマネージドBeanのプロパティ(`skinFamily`)の値を設定します。実行時に、`maf-config.xml`ファイルの`<skin-family>`プロパティでは、EL式を使用してマネージドBeanから値を読み取ります。また、例4-28のマネージドBeanは、新たに指定されたスキンを使用するためにアプリケーションに機能をリロードします。

ヒント: `<skin-family>`プロパティと同様に、実行時にEL式を使用して`maf-config.xml`ファイル内の`<skin-version>`プロパティの値を設定することができます。

例4-28に示すようにアプリケーションの機能を個別にリセットして新しいスキンをロードするかわりに、次のクラスから`resetApplication`メソッドを呼び出すことができます。

`oracle.adfmf.framework.api.AdfmfContainerUtilities`

詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。

## 4.14 機能アーカイブ・ファイルの使用

`maf-application.xml`ファイルは、少なくとも1つのアプリケーション機能を参照します。これらのアプリケーション機能は、機能アーカイブ・ファイル(FAR)と呼ばれるJARファイルにパッケージ化されると、他のモバイル・アプリケーションが使用できる再使用可能なコンテンツを提供します。FARは本質的に、アイコンのイメージ、リソース・バンドル、HTMLファイル、JavaScriptファイル、その他の実装固有のファイルなど、アプリケーション機能が必要とするすべてのものを格納した自己完結型のコレクションです。第19.3項「機能アーカイブ・ファイル(FAR)のデプロイ」で説明するように、FARのコンテンツには1つの`maf-feature.xml`ファイルが含まれます。このファイルでは、パッケージ化された各アプリケーション機能が一意のIDによって識別されます。このファイルを編集することで(第4.9項「モバイル・アプリケーション機能の構成ファイルについて」を参照)、コンテンツ実装(ローカルまたはリモートのHTMLファイルや、MAF AMXページ)などの機能プロパティを更新し、ユーザー・ロールや権限またはデバイス・プロパティなどのファクタに基づいて表示できます。モバイル・アプリケーションでは、1つまたは複数のFARを参照することも、何も参照しないようにすることもできます。

MAFアプリケーション・エディタを使用してFARをMAFアプリケーションに追加できます。追加されると、それに含まれる機能を参照できるようになります。参照しなければ、FAR機能は使用されません。参照する場合は、FARで使用する任意の接続を、使用するアプリケーションで設定する必要があります。FARのコンテンツはカスタマイズできず、またその個々のアーティファクトを再利用することもできません。モバイル・アプリケーションではFAR全体を利用できます。たとえば、FARのタスク・フローは、タスク・フロー・コール・アクティビティのターゲットになることはできません。

注意: 機能アーカイブに、地理マップを使用するAMXページが含まれる場合、アプリケーションの`adf-config.xml`ファイルで数多くのプロパティを設定する必要があります。第6.5.18.1項「地理プロバイダ情報を指定した地理マップ・コンポーネントの構成」を参照してください。

### 4.14.1 アプリケーション・ライブラリとしてのFARのインポート

FARをアプリケーション・ライブラリとしてインポートして、MAFアプリケーションからその機能にアクセスできるようにすることができます。

FARをアプリケーション・ライブラリとしてインポートするには:

1. プロジェクト・エクスプローラで、最上位のアセンブリ・プロジェクトのフォルダを展開し、MAFフォルダを展開します。

2. MAFアプリケーション・エディタをダブルクリックして、`maf-application.xml`を開きます。

3. 機能アーカイブ・フォルダを右クリックし、「新」→「機能アーカイブ」を選択します。

4. アーカイブ名を指定するか、デフォルト名(`featureArchive1`で、後続のアーカイブには連番が付けられる)をそのまま使用します。

5. 「URI」フィールドの「参照」ボタンをクリックして、モバイル機能のアーカイブ場所ダイアログを開き、FARを配置できるURIを入力します。Oracle Enterprise Pack for Eclipseによって、選択したファイルに機能の定義が含まれているかどうかと、場所がアクセス可能かどうかが検証されます。

6. URIを指定し、Oracle Enterprise Pack for Eclipseによってそれが確認されたら、「OK」をクリックします。

### 4.14.2 FARを使用したsync-config.xmlファイルの更新に関する必知事項

`sync-config.xml`ファイルにより、モバイル・アプリケーションが、様々なタイプのWebサービス(SOAP、REST-XML、JSONペイロードによるREST)を介してアクセスされるサーバー側リソースから取得されたデータをSQLite埋込みデータベースにキャッシュできるようになるだけでなく、キャッシュ内のこのデータおよびサーバー側リソースも更新できるようになります。

ビュー・コントローラ・プロジェクトがFARとしてデプロイされると、`sync-config.xml`ファイルは機能アーカイブ・ファイルに含まれます。connections.xmlファイルと同様に、FARをアプリケーションに追加すると、MAFではFAR (jar-sync-config.xml)内の`sync-config.xml`ファイルの内容と、使用するアプリケーションの`sync-config.xml`ファイルの内容をマージします。sync-config.xmlファイルは、モバイル・アプリケーションで使用されるWebサービス・エンドポイントを記述しているため、FARを追加することによって、モバイル・アプリケーションを構成するアプリケーション機能によって使用されるすべてのWebサービスのエンドポイントを更新できます。

FARをアプリケーションに追加すると、MAFでは、アプリケーションの`sync-config.xml`ファイルおよび`connections.xml`ファイルを確認し、必要に応じて変更するように求めるメッセージがログに記録されます。図4-38に示すように、これらのメッセージは、使用するアプリケーションの`sync-config.xml`ファイルの状態を反映します。

図4-38 メッセージ・ログ

使用するアプリケーションにsync-config.xmlファイルがない場合、MAFではこのファイルをアプリケーションに追加し、次のようなメッセージを書き込みます。

`oracle.adfmf.framework.dt.deploy.features.deployers.SyncConfigMerger _logNoSyncConfigInAppUsingFar`

`WARNING: The application does not contain a synchronization file, "sync-config.xml". Creating one containing the synchronization configuration in the Feature Archive.`

`sync-config.xml`ファイルの`<ServerGroup>`要素に、使用するアプリケーションの`connections.xml`ファイルで定義された対応する`<Reference>`要素がない場合、MAFでは接続の確認(または作成)をリクエストする次のようなログ・メッセージを書き込みます。

`oracle.adfmf.framework.dt.deploy.features.deployers.SyncConfigMerger _logAddedServerGroups`

`WARNING: The following server groups were added sync-config.xml by the Add to Application` `operation:{ ServerGroup1 - there is no existing application connection defined for this server group. Please create the connection. ServerGroup2 - verify its configuration.}`

使用するアプリケーションの`config-sync.xml`ファイルの`<ServerGroup>`定義が、FAR内の対応する`config-sync.xml`ファイルの定義を複製する場合、MAFでは次の`SEVERE`レベルのメッセージをログに書き込みます。

`oracle.adfmf.framework.dt.deploy.features.deployers.SyncConfigMerger _logDuplicateServerGroups`

`SEVERE: Cannot merge the server groups from the Feature Archive because the following definitions already exist:`

`ServerGroup1`

`ServerGroup2`

### 4.14.3 FARのビュー・コントローラ・プロジェクトとしての追加時に行われる処理

FARをビュー・コントローラ・プロジェクトとして追加する場合:

- MAFは、インポートしたFARと同じ名前のビュー・コントローラ・プロジェクトを生成します。このビュー・コントローラ・プロジェクトには、MAFビュー・コントローラ・プロジェクトのデフォルトの構造およびメタデータ・ファイルが含まれています。特に、FARビュー・コントローラ・プロジェクトには、`maf-feature.xml`ファイルが含まれています。MAFアプリケーションに他のビュー・コントローラ・プロジェクトが含まれている場合、いずれのプロジェクトにもIDが同じアプリケーション機能が含まれていないことを確認する必要があります。

- ライブラリとしてインポートしたFARと同様に、機能アーカイブJARにある`connections.xml`ファイル内の情報は、使用するアプリケーションの`connections.xml`ファイルにマージされます。ターゲット・アプリケーションに`connections.xml`ファイルが存在しない場合、MAFではこのファイルが作成されます。同様に、`sync-config.xml`ファイルは、使用するアプリケーションの`sync-config.xml`ファイルにマージされます。

- MAFでは、FARに含まれる.classおよびJARファイルをビュー・コントローラ・プロジェクトでライブラリとして使用できるように、これらをそのlibディレクトリ(`C:\jdeveloper\mywork\application\FAR view controller project\lib`など)にコピーします。MAFでは、これらのファイルを`classesFromFar.jar`というファイルにコンパイルします。

- ライブラリとしてインポートしたFARとは異なり、ビュー・コントローラ・プロジェクトのファイルはカスタマイズできます。

- ライブラリとしてインポートしたFARと同様に、FARの`maf-feature.xml`ファイル内で宣言されたすべてのアプリケーション機能は、使用するアプリケーションで使用できるようになります。

### 4.14.4 機能アーカイブ・リソースの再使用の有効化に関する必知事項

FARのリソースをアプリケーションで使用可能にするためには、FARの名前とその機能参照IDが両方ともグローバルに一意である必要があるため、`maf-application.xml`ファイル内に機能参照IDの重複がないことを確認してください。FARの内部では、`DataControl.dcx`ファイルが一意のパッケージ・ディレクトリ内に存在する必要があります。これらのパッケージ・ディレクトリのデフォルト名をそのまま使用するのではなく、プロジェクト用に一意のパッケージ階層を作成する必要があります。さらに機能参照IDについても、同じようなパッケージ・ネーミング・システムを使用する必要があります。

## 4.15 モバイル・アプリケーションへのCordovaプラグインの統合

MAFによって作成されるアプリケーションはハイブリッド・モバイル・アプリケーションであるので、これらのアプリケーションはApache Cordova JavaScript APIを使用してネイティブ・デバイスAPIにアクセスできます。Apache Cordovaのドキュメント(`http://cordova.apache.org/`で入手可能)のプラグイン・デプロイメント・ガイドに説明されているように、Cordovaプラグインは、プラットフォーム固有のSDK (XcodeまたはAndroid SDK)およびJavaScriptを使用して作成するネイティブ・コードから構成されます。

MAFにはサードパーティのCordovaプラグインが付属していないので、Cordovaプラグインはデプロイ先のプラットフォーム用のSDKを使用して開発する必要があります。つまり、Xcodeを使用してiOSアプリケーション用のプラグインを作成し、Android SDKを使用して、Androidデバイスをターゲットとするアプリケーション用のプラグインを作成します。プラグイン自体の作成に加えて、プラグインのリソースをアプリケーションに追加する方法を説明する手順(つまり、Readmeまたはマニフェスト・ファイル)を添付することも必要です。

サードパーティ・プラグインがMAFによってサポートされているCordovaのバージョンに準拠していることを確認してください。プラグインで使用されるAPIのバージョンとは異なるバージョンをMAFがサポートしている場合、有効にされた機能がモバイル・アプリケーションで使用できなくなる可能性があります。

注意: プラグインにはCordova 2.2.0 (MAFによってサポートされている唯一のバージョン)との互換性が必要です。

### 4.15.1 iOSおよびAndroidでのCordovaプラグインの統合方法

「Cordovaプラグイン」ページ(図4-39を参照)を使用すると、プラグインの開発者から提供されたプラグインの手順に従ってプラットフォーム固有のXMLファイル(iOSの場合は`cordova.plist`ファイル、Androidの場合は`config.xml`ファイル)を更新することによって、モバイル・アプリケーションにプラグインを統合することができます。

図4-39 「Cordovaプラグイン」ページ

OEPEでは、デプロイメント時にアーティファクトを目的の場所にコピーするために使用するファイル・マッピング指示を使用してプラグインを管理します。

OEPEではソース・プロジェクトにコピーできます。これは開発作業には有用です。IDEでは、これらのファイルを削除して、ファイル・マッピングを使用してすべてのファイルがデプロイされるようにします。

「参照」ダイアログでドラッグ・アンド・ドロップを行うと、次のファイル・フィルタに従ってマッピングを作成できます。

`foo.xyz`マッピングは、`foo.xyz`をターゲット・ルート・ディレクトリにコピーすることを意味します。

*.xyzマッピングは、現在のディレクトリにある、拡張子が`xyz`のすべてのファイルをコピーすることを意味します。

`**.xyz`マッピングは、すべてのサブディレクトリにある、拡張子が`xyz`のすべてのファイルをコピーすることを意味します。

`**\foo\**\*.xyz`マッピングは、`foo`サブディレクトリに含まれている、拡張子が`xyz`のすべてのファイルをコピーすることを意味します。

始める前に:

次のことを実行します。

- プラグインの開発者からプラグインの統合手順を入手します。

- プラグイン自体(ソース・コード、JavaScriptファイル、追加のライブラリ、リソースまたはアセット)を取得します。

- 表4-12に、アプリケーション・コントローラ・プロジェクトとビュー・コントローラ・プロジェクトに手動で作成するディレクトリを示します。作成したら、プラグイン・アーティファクトをディレクトリにコピーします。プラグインのプライマリ・コンポーネント、JavaScriptファイルおよびプラグイン・バイナリ・ライブラリは、モバイル・アプリケーション内の異なるプロジェクト(ビュー・コントローラ・プロジェクトおよびアプリケーション・コントローラ・プロジェクト)に配置されます。

  表4-12 プラグイン・アーティファクトを作成するディレクトリの場所

  アーティファクト | ファイルの場所 | 説明
  --- | --- | ---
  アセット | `application workspace directory``\ApplicationController\src\``plugins``\Plugin Name\Platform``\assets` | このフォルダにはプラグイン・アセットが含まれます。このAndroid専用のアーティファクトはオプションです。
  JavaScriptファイル | `application workspace directory``\ViewController\public_html\plugins\``Plugin Name\Platform``\js` | このディレクトリにはプラグインJavaScriptファイルが含まれています。このフォルダは必須で、JavaScriptファイルを含む必要があります。
  プラグイン・ライブラリ | `application workspace directory``\ApplicationController\src\``plugins\Plugin Name\Platform``\bin` | プラグイン・バイナリが含まれています。これは必須のフォルダで、このコンテンツを含む必要があります。
  依存ライブラリ | `application workspace directory``\ApplicationController\src\``plugins\Plugin Name\Platform``\libs` | 追加の依存ライブラリをこの場所にコピーします。これはオプション・フォルダです。
  ネイティブ・ライブラリ | `application workspace directory``\ApplicationController\src\``plugins\Plugin Name\Platform``\native-libs` | Androidのみ。Androidネイティブ・ライブラリをこの場所にコピーします。
  リソース | `application workspace directory``\ApplicationController\src\``plugins\Plugin Name\Platform``\res` | 追加のプラグイン・リソース・フォルダをコピーします。これはオプション・フォルダです。

  これらの項目は、ビューに.*リソースが含まれる場合にのみOracle Enterprise Pack for Eclipseで表示できます。詳細は、第3.2.2項「MAFアプリケーションを作成する場合の処理」を参照してください。

- MAF AMXで作成されたアプリケーション機能の場合、タスク・フローのマネージドBeanには、次のような`invokeContainerJavaScriptFunction`を使用するハンドラ・メソッドを含める必要があります。

      AdfmfContainerUtilities.
      invokeContainerJavaScriptFunction(featureid, methodname, new Object[]
                                                               { params... })

  このメソッドはJavaScriptを呼び出します。実装の例については、APIDemoサンプル・アプリケーションの`ManagedBean.java`ファイルを参照してください。このサンプル・アプリケーションは、「ファイル」→「新」→「MAFサンプル」にあります。

  `invokeContainerJavaScriptFunction`の詳細は、第B.2.14項「invokeContainerJavaScriptFunction」およびOracle Mobile Application Framework Java APIリファレンスを参照してください。

- プラグイン関連のアーティファクトおよびJavaScriptファイルをFARから取得する場合は(第4.15.4項「FARを使用したプラグイン統合に関する必知事項」を参照)、プラグインにJavaScriptファイルが付随していることを確認する必要があります。モバイル・アプリケーションによって利用されるFARにJavaScriptファイルが含まれていない場合は、それを取得するか、FAR開発者の手順に従って作成する必要があります。第4.14.1項「アプリケーション・ライブラリとしてのFARのインポート」の説明に従ってFARをアプリケーションに追加することも必要です。

Androidプラグインを追加するには:

1. プロジェクト・エクスプローラで、最上位のアセンブリ・プロジェクトのフォルダを展開し、MAFフォルダを展開します。

2. アウトラインで、「プラグイン」を右クリックし、「新」→「Cordovaプラグイン」を選択します。

3. 図4-40に示すように、プラグインの挿入ダイアログに入力します。

   図4-40 Androidプラグインの追加

   - 名前: プラグインの名前。これは、プラグイン・アーティファクトと、エラー検出時にデプロイメントにログ記録される値が含まれるフォルダの名前です。

   - 「プラットフォーム」: Androidを選択します。

   - 「修飾名」: プラグインの完全修飾名です。この名前はマニフェスト・ファイルまたはreadmeファイルによって指定され、`config.xml`ファイル内のプラグイン要素の`name`属性にマップされます。

   - 「実装クラス」: プラグインを実装するクラスの名前です。この名前はマニフェスト・ファイルまたはreadmeファイルによって指定されますが、通常はJavaパッケージでありクラス名が後に続きます。`config.xml`ファイル内のプラグイン要素の`value`属性にマップされます。

4. プラグインが独自のAndroidリソースを必要としている場合は、「リソース・パッケージ」に、これらのリソースを表示するJavaパッケージを入力します。そうでない場合は、このフィールドを空白のままにしておきます。これはオプションの値です。

iOSプラグインを追加するには:

1. プロジェクト・エクスプローラで、最上位のアセンブリ・プロジェクトのフォルダを展開し、MAFフォルダを展開します。

2. アウトラインで、「プラグイン」を右クリックし、「新」→「Cordovaプラグイン」を選択します。

   - 名前: プラグインの名前。これは、プラグイン・アーティファクトと、エラー検出時にデプロイメントにログ記録される値が含まれるフォルダの名前です。

   - 「プラットフォーム」: iOSを選択します。

   - 「完全修飾名」: プラグインの完全修飾名です。この名前は、マニフェスト・ファイルまたはreadmeファイルによって指定され、`cordova.plist`の`<key>`要素にマップされます。

   - 「実装クラス」: プラグインを実装するクラスの名前です。この名前はマニフェスト・ファイルまたはreadmeファイルによって指定され、通常はObjective-Cクラスの名前です。`cordova.plist`ファイル内の`<string>`要素にマップされます。

3. 図4-41に示すように、プラグインの挿入ダイアログに入力します。

   図4-41 iOSプラグインの追加

   - 名前: プラグインの名前。これは、プラグイン・アーティファクトと、エラー検出時にデプロイメントにログ記録される値が含まれるフォルダの名前です。

   - 「プラットフォーム」: iOSを選択します。

   - URI: プラグインのユニフォーム・リソース・インジケータ。「参照」をクリックして探すか、開いているフォルダからMAFアプリケーション・エディタのURIスポットに直接ドラッグします。

   - 「完全修飾名」: プラグインの完全修飾名です。この名前は、マニフェスト・ファイルまたはreadmeファイルによって指定され、`cordova.plist`の`<key>`要素にマップされます。

   - 「実装クラス」: プラグインを実装するクラスの名前です。この名前はマニフェスト・ファイルまたはreadmeファイルによって指定され、通常はObjective-Cクラスの名前です。`cordova.plist`ファイル内の`<string>`要素にマップされます。

   - 「リンカー・フラグ」: プラグインで必要とされる追加のリンカー・フラグを入力します。プラグイン・ライブラリにリンクするオプションを追加する必要があります(`-l BarcodeScanner`など)。次に例を示します。

         -l BarcodeScanner -lc++ -liconv -framework CoreVideo -framework AssetsLibrary
         -framework AVFoundation

     追加のライブラリが必要かどうかを判断するには、`readme`ファイルを調べてください。

ローカルHTMLコンテンツにプラグインのJavaScriptファイルの参照を許可するには:

1. プロジェクト・エクスプローラからMAF機能エディタを開き、プラグインを使用するアプリケーション機能を選択します。

2. 「コンテンツ」をクリックし、「ローカルHTML」を選択します。

3. HTMLドキュメント内で`<script>`タグを使用してJavaScriptファイルを参照します(例4-29に示す`<script type="text/javascript" src="../../../../www/js/barcodescanner.js"></script>`など)。

   例4-29 <script>タグを使用したプラグインJavaScriptファイルの参照

       <!DOCTYPE html>
       <html>
         <head>
           <meta name="viewport" content="user-scalable=no,height=device-height,width=device-width" />
           <meta name="apple-mobile-web-app-capable" content="yes" />
           <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta>
           <script type="text/javascript">if (!window.adf) window.adf = {};
                                             adf.wwwPath = "../../../../www/";</script>
           <script type="text/javascript" src="../../../../www/js/base.js"></script>
           <script type="text/javascript" src="../../../../www/js/barcodescanner.js"></script>
           <script type="text/javascript" charset="utf-8">
               function scanBarcode()
               {
                 window.plugins.barcodeScanner.scan(
                                                    function(result) {
                                                     if (result.cancelled)
                                                       updateContentNode("the user cancelled the scan");
                                                     else
                                                     updateContentNode("We got a barcode: " +
                                                       result.text);
                                                    },
                                                    function(error) {
                                                       updateContentNode("scanning failed: " + error);
                                                    }
                                                   )
               }

               function updateContentNode(newContent)
               {
                 $("#content").html(newContent);
               }
             </script>
         </head>
         <body onload="onBodyLoad()">

           <!-- MAIN PAGE -->
           <div data-role="page" id="main" data-url="main.jspx" data-position="fixed">
             <div data-role="header" data-position="fixed">
               <h1>
                 Barcode Scanner Test
               </h1>
             </div>
             <div data-role="content" id="content">
               No barcode scanned yet
             </div>
             <div data-role="footer" data-position="fixed">
               <div data-role="navbar">
                 <ul>
                   <li>
                       <a href="javascript:try{scanBarcode();}catch(e){alert(e.description);}"
                       data-rel="dialog" data-transition="pop">Scan barcode</a>
                   </li>
                 </ul>
               </div>
             </div>
           </div>
         </body>
       </html>

### 4.15.2 プラグイン構成時の処理

MAFアプリケーション・エディタを使用すると、`maf-application.xml`ファイルに`<adfmf:cordovaPlugins>`要素が移入されます。この要素とその子要素の詳細は、Oracle Mobile Application Frameworkタグ・リファレンスを参照してください。

例4-30 <adfmf:cordovaPlugins>要素

    <adfmf:cordovaPlugins>
        <adfmf:plugin name="BarcodeScanner" platform="iOS"
                     implementationClass="CDVBarcodeScanner"
                     fullyQualifiedName="ios.apache.cordova.barcodeScanner">
          <adfmf:iosPluginInfo>
            <adfmf:linkerFlags>-l BarcodeScanner
                               -lc++
                               -liconv
                               -framework CoreVideo
                               -framework AssetsLibrary
                               -framework AVFoundation</adfmf:linkerFlags>
          </adfmf:iosPluginInfo>
        </adfmf:plugin>
        <adfmf:plugin platform="Android" name="BarcodeScanner"
                      implementationClass="com.phonegap.pluigns.barcodescanner.BarcodeScanner"
                      fullyQualifiedName="BarcodeScanner">
          <adfmf:androidPluginInfo>
            <adfmf:resourcePackageName>com.google.zxing.client.android</adfmf:resourcePackageName>
            <adfmf:androidManifestActivities>&lt;activity android:name=".CaptureActivity"
                  android:screenOrientation="landscape"
                  android:clearTaskOnLaunch="true"
                  android:stateNotNeeded="true"
                  android:configChanges="orientation|keyboardHidden"
                  android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                  android:windowSoftInputMode="stateAlwaysHidden"&gt;
                  ...
             </adfmf:androidManifestActivities>
          </adfmf:androidPluginInfo>
        </adfmf:plugin>
      </adfmf:cordovaPlugins>
    </adfmf:application>

### 4.15.3 プラグイン・プリファレンスの追加方法

アプリケーション・レベルとアプリケーション機能レベルの両方のユーザー・プリファレンス・ページでは、Cordovaプラグイン・プリファレンスは、ユーザー・プリファレンス・ページの下部でプリファレンス要素によって定義されたプリファレンスの下に表示されるか(第13章「ユーザー・プリファレンスの有効化」を参照)、またはプリファレンス・グループあるいは単一アイテム・プリファレンス・リストの選択から開かれる子プリファレンス・ページとして表示されます。

始める前に:

設定バンドル(`Settings.bundle`)およびそのコンテンツ(`Root.plist`ファイルや`.strings`ファイルなど)の詳細は、iOS Developer Library (`http://developer.apple.com/library/ios/navigation/`)から入手可能なプリファレンスおよび設定のプログラミング・ガイドを参照してください。

iOSアプリケーションのプリファレンス・ページの下部にCordovaプラグイン・プリファレンスをマージするには:

1. 次のように、プラグイン用にアプリケーション・コントローラ・プロジェクト内にリソース(`res`)ファイルを作成します。

       application workspace directory\ApplicationController\src\plugins\plugin name\iOS\res

2. 設定バンドル(`Settings.bundle`)ファイルをプラグインの`res`フォルダにコピーします。

Cordovaプラグイン・プリファレンスを子ページとしてiOSアプリケーションにマージするには:

1. 次のように、プラグイン用にアプリケーション・コントローラ・プロジェクト内にリソース(`res`)フォルダを作成します。

       application workspace directory\ApplicationController\src\plugins\plugin name\iOS\res

2. 設定バンドル(`Settings.bundle`)ファイルをプラグインの`res`フォルダにコピーします。

3. `Root.plist`ファイルの名前を`PluginName``.Root.plist`に変更します。ここで、`PluginName`はプラグインの名前です。たとえば、このファイルの名前を`BarcodeScanner.Root.plist`に変更します。

4. プラグインの`.strings`ファイル内に子ページのタイトルの文字列IDとローカライズ可能な値を定義します。このIDは`PluginName``.page.title`でなければならず、`PluginName`はプラグインの名前です。次に例を示します。

   `"``PluginName``.page.title" = "``Some Localized Page Title``";`

Androidアプリケーションのプリファレンス・ページの下部にCordovaプラグイン・プリファレンスをマージするには:

1. 次のように、プラグインのリソース(`res`)フォルダをアプリケーション・コントローラ・プロジェクト内に作成します。

       application workspace directory\ApplicationController\src\plugins\plugin name\Android\res

2. `preferences.xml`ファイルを含むリソースをプラグインの`res`フォルダにコピーします。`preferences.xml`ファイルの詳細、および従属画面の定義の詳細は、Android開発者のWebサイト(`http://developer.android.com/guide/topics/ui/settings.html`)から入手可能な設定ガイドの「XMLでのプリファレンスの定義」またはAndroid SDKドキュメントを参照してください。MAFデプロイメント・フレームワークでプリファレンスを変換する方法は、第C.2項「Android用のプリファレンスの変換」を参照してください。

Cordovaプラグイン・プリファレンスを子ページとしてAndroidアプリケーションにマージするには:

1. `preferences.xml`ファイルを含むリソースをプラグインの`res`フォルダにコピーします。

2. 例4-32に示すように、プリファレンス・セット(例4-31)を別の`PreferenceScreen`要素内にネストします。

   例4-31 プリファレンス

       <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
             <PreferenceCategory android:title="@string/preferences_scanning_title">
                   <CheckBoxPreference android:key="preferences_decode_1D"
                                       android:defaultValue="true"
                                       android:title="@string/preferences_decode_1D_title"/>
                   ...
              </PreferenceCategory>
               ...

       </PreferenceScreen>

   例4-32に、`PreferenceScreen`要素をラップする`android:key`属性の定義方法を示します。

   例4-32 PreferenceScreen要素内でラップされたプリファレンス・セット

       <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
         <PreferenceScreen android:key="wrapperScreen" android:title="Barcode Scanner">
             <PreferenceCategory android:title="@string/preferences_scanning_title">
                   <CheckBoxPreference android:key="preferences_decode_1D"
                                       android:defaultValue="true"
                                       android:title="@string/preferences_decode_1D_title"/>
                   ...
              </PreferenceCategory>
               ...
         </PreferenceScreen>
       </PreferenceScreen>

3. プリファレンス・ページでローカライズが必要な場合は、ローカライズ対象の`strings.xml`ファイル内に文字列値を定義します。`strings.xml`ファイルの詳細は、Android開発者のWebサイト(`http://developer.android.com/guide/topics/resources/index.html`)から入手可能なアプリ・リソース・ガイドの「文字列リソース」またはAndroid SDKドキュメントを参照してください。MAFデプロイメント・フレームワークで`strings.xml`ファイルを処理する方法は、第C.2.3項「Strings.xml」を参照してください。

### 4.15.4 FARを使用したプラグイン統合に関する必知事項

モバイル・アプリケーションのコンポーネントは単一の開発者によって作成されるものの、アプリケーションは、通常、様々な開発者によって提供されるリソースから構成されます。サードパーティ・プラグインの追加は後者の事例であり、FAR開発者はビュー・コントローラ・プロジェクトを機能アーカイブ・ファイル(FAR)としてデプロイする前に、まずプラグインを使用するアプリケーションを作成およびテストします。FAR開発者はこのFARをアプリケーション・アセンブラ開発者に公開し、プラグインおよびJavaScriptファイルを統合するための一連の手順(readmeファイルなど)を提供します。FAR開発者はまた、アプリケーション・アセンブラ開発者にプラグイン・バイナリ・ライブラリのZIPファイルを提供する場合があります。次にアプリケーション・アセンブラはFARをモバイル・アプリケーションに追加し、手順に従ってJavaScriptファイルとプラグイン・バイナリ・ライブラリをモバイル・アプリケーションのプロジェクトに統合します。モバイル・アプリケーションはその後テストされ、プラットフォーム固有のパッケージとしてデプロイされ、公開されます。FAR開発者とアプリケーション・アセンブラとの間の共同作業の具体的な内容は、次のとおりです。

1. FAR開発者はXcodeまたはAndroid SDKを使用してCordovaプラグイン・ライブラリを作成します(その結果、iOSの場合は`.a`ファイルが生成され、Androidの場合はJARファイルが生成されます)。MAFアプリケーションがこのライブラリを使用できるようにするために、開発者は次の手順を実行します。

   1. モバイル・アプリケーションを作成します。開発者はプラグイン・バイナリをアプリケーション・コントローラ・プロジェクト内の様々な場所に取り込み、JavaScriptファイルをビュー・コントローラ・プロジェクト内の`public_html`ディレクトリに追加します。MAF AMXとして実装されるユーザー・インタフェースの場合、第4.11.1項「アプリケーション・コンテンツの定義方法」に説明されているように、インクルードの挿入ダイアログを使用して`maf-feature.xml`ファイル内でJavaScriptファイルを参照します。HTMLベースのユーザー・インタフェースの場合は、JavaScriptインクルードを使用してこのファイルを参照します。

      MAF AMXによって作成されるアプリケーション機能の場合、JavaScriptを呼び出すには、`invokeContainerJavaScriptFunction`メソッドをJavaハンドラに含めます。詳細は、第B.2.14項「invokeContainerJavaScriptFunction」およびOracle Mobile Application Framework Java APIリファレンスを参照してください。

      HTMLによって作成されるアプリケーション機能の場合、JavaScriptを直接呼び出すには、JavaScriptファイルの場所を`<script>`タグ内で参照します。

   2. `maf-application.xml`の概要エディタの「Cordovaプラグイン」ページおよびそのダイアログを使用してCordovaプラグインを統合します。

   3. テストのためにアプリケーションをデバイスにデプロイします。

   4. ビュー・コントローラ・プロジェクトをFARとしてデプロイします。このFAR自体には、CordovaプラグインとJavaScriptファイルを参照する、MAF AMXページやHTMLページのようなアーティファクトが含まれる場合があります。

      注意: FARの場合は、JavaScriptファイルが常に含まれるとはかぎりません。

   5. FARに含まれていなくても、FAR開発者はアプリケーション・アセンブラ開発者に、プラグインをモバイル・アプリケーションに統合するための一連の手順を提供します。このような手順は開発組織およびプラグイン自体に固有のものであるため、伝達方法や形式(メタデータ・ファイルやreadmeファイルなど)は、FAR開発者とアプリケーション・アセンブラ開発者との間の合意に基づいて決定されます。例4-33に、iOSプラグインを統合する方法が記載された`README.md`ファイルの一部を示します。

      例4-33 README.mdファイル

          ...
          ## Adding the plugin to your project ##
          * Copy the .h, .cpp and .mm files to the Plugins directory in your project.
          * Copy the .js file to your www directory and reference it from your html file(s).
          * In the `Supporting Files` directory of your project, add a new plugin by editing
           the file `Cordova.plist` and in the `Plugins` dictionary adding the following
           key/value pair:
            * key: `org.apache.cordova.barcodeScanner`
            * value: `CDVBarcodeScanner`
           Add the following libraries to your Xcode project, if not already there:
            * AVFoundation.framework
            * AssetsLibrary.framework
            * CoreVideo.framework
            * libiconv.dylib
          ...

2. アプリケーション・アセンブラはFARモバイル・アプリケーションを追加します(第4.14.1項「アプリケーション・ライブラリとしてのFARのインポート」を参照)。

3. FAR開発者によってプラグイン・バイナリのZIPファイルが提供されない場合、アプリケーション・アセンブラはプラットフォーム固有のSDKを使用してプラグインを構築する必要があります。プラグインはプラットフォーム固有のパッケージにパッケージ化されます(iOSの場合は`.a`ファイル、Androidの場合はJARファイル)。

4. アプリケーション・アセンブラ開発者は、プラグイン・バイナリ・ライブラリをアプリケーション・コントローラ・プロジェクトに追加し、JavaScriptファイルをビュー・コントローラ・プロジェクトの`public_html`ディレクトリに追加します。

5. アプリケーション・アセンブラ開発者は、`maf-application.xml`の概要エディタの「Cordovaプラグイン」ページとそのダイアログを使用して、プラットフォーム固有のXMLファイル(つまり、iOSの場合は`cordova.plist`ファイル、Androidの場合は`config.xml`ファイル)を手順に従って更新します。MAFデプロイメントは、この構成を使用してプラグインをモバイル・アプリケーションに組み込みます。