ヘッダーをスキップ

Oracle® Mobile Application Framework Oracle Mobile Application Frameworkでのモバイル・アプリケーションの開発 2.1.1.0.0 E64867-01 |
| 目次

前 | 次 |

# 7 MAFアプリケーションのスキニング

この章では、スキンを使用してMAFアプリケーションの外観をカスタマイズする方法について説明します。

この章の内容は次のとおりです。

- 第7.1項「MAFアプリケーション・スキンの概要」

- 第7.2項「アプリケーションへのカスタム・スキンの追加」

- 第7.3項「アプリケーションが使用するスキンの指定」

- 第7.4項「カスタム・スキンの登録」

- 第7.5項「MAFスキンのバージョニング」

- 第7.6項「スキンのバージョニング時に行われる処理」

- 第7.7項「デフォルト・スキン・スタイルのオーバーライド」

- 第7.8項「スキンのアプリケーション機能への適用時に行われる処理」

- 第7.9項「スキニングに関する必知事項」

- 第7.10項「スキンへの新しいスタイル・シートの追加」

- 第7.11項「エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化」

- 第7.12項「実行時の処理: エンド・ユーザーによるアプリケーション・スキンの変更方法」

## 7.1 MAFアプリケーション・スキンの概要

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

MAF AMXページの外観を決定するセレクタを定義するためにMAFで使用されるサポート済のスキンのファミリとバージョンは、次のとおりです。

    amx
      mobileAlta-1.0
        mobileAlta-1.1
          mobileAlta-1.2
             mobileAlta-1.3
      mobileFusionFx-1.0
        mobileFusionFx-1.1

デフォルトで、新規作成したMAFアプリケーションでは最新バージョンの`mobileAlta`スキン・ファミリが使用されます。アプリケーションを以前のリリースから最新リリースに移行すると、そのアプリケーションでは移行前に使用するよう構成されていたスキンが引き続き使用されます。移行後のアプリケーションで別のスキン(たとえば最新バージョンの`mobileAlta`)を使用する場合は、第7.3項「アプリケーションが使用するスキンの指定」の説明に従って、`maf-config.xml`ファイルを編集する必要があります。

図7-1は、異なるスキンを使用して同じアプリケーション画面のレンダリングを示すことによって、`mobileAlta`スキン・ファミリと`mobileFusionFx`スキン・ファミリのルック・アンド・フィールの違いを示しています。

図7-1 mobileAltaとmobileFusionFxのルック・アンド・フィールの比較

図7-3は、これらのスキンのファミリとバージョンの継承関係を示しています。

図7-2 MAFのスキン・ファミリの継承関係

MAFアプリケーションの最初のデプロイ後に作成される`www\css`ディレクトリには、これらのCSSファイルが格納されます。このディレクトリにアクセスするには、MAFアプリケーションをシミュレータまたはデバイスにデプロイし、`deploy`ディレクトリ(例: `C:\JDeveloper\mywork\``app_name``\deploy`)に移動します。`www\css`ディレクトリは、デプロイメントによって生成された、プラットフォーム固有のアーティファクト内にあります。iOSデプロイメントの場合、このディレクトリは`temporary_xcode_project`ディレクトリ内にあります。Androidデプロイメントの場合、このディレクトリはAndroidアプリケーション・パッケージ(`.apk`)ファイルの`assets`ディレクトリ内にあります。

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

`maf-config.xml`ファイル(第7.1.1項「maf-config.xmlファイルについて」を参照)と`maf-skins.xml`ファイル(第7.1.2項「maf-skins.xmlファイルについて」を参照)を使用して、MAFアプリケーションのスキニングを制御します。`maf-config.xml`ファイルでは、アプリケーション・コンポーネントのレンダリングに使用するデフォルトのスキン・ファミリを指定し、`maf-skins.xml`ファイルでは、デフォルトのスキン・ファミリをカスタマイズしたり、新しいスキン・ファミリを定義することができます。

### 7.1.1 maf-config.xmlファイルについて

MAFアプリケーションを作成すると、JDeveloperによって、`maf-config.xml`ファイルがMAFアプリケーションのMETA-INFノードに移入されます。このファイル自体には、ベースMAFスキン・ファミリである`mobileAlta`が移入されます(例7-1を参照)。

例7-1 maf-config.xmlファイルに移入されたデフォルト・スキン(mobileAlta)

    <?xml version="1.0" encoding="UTF-8" ?>
    <adfmf-config xmlns="http://xmlns.oracle.com/adf/mf/config">
      <skin-family>mobileAlta</skin-family>
      <skin-version>v1.3</skin-version>
      ....
    </adfmf-config>

注意: EL式を使用して実行時にスキンの値を決定できます。詳細は、第7.11項「エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化」を参照してください。

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

1. `mobileAlta.``<DeviceModel>` (例: `mobileAlta.iPhone5,3`)

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

3. `mobileAlta`

図7-3は、実行時にMAFでスキンのこの階層が適用される様子をイラストレーションで示しています。`SkinningDemo`サンプル・アプリケーション(付録G「サンプルのMAFアプリケーション」を参照)でも、この実装を示しています。

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

図7-3 実行時のMAFのスキン階層の適用

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

アプリケーション・コントローラ・プロジェクトの`META-INF`ノードにあるmaf-skins.xmlファイルによって、既存のスキンを拡張して新しいスキンを定義したり、既存のスキンに新しいスタイル・シートを追加することができます。

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

表7-1 <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.3</extends>
      <style-sheet-name>styles/myskin.css</style-sheet-name>
      <version>
        <name>v1</name>
      </version>
    </skin>
`<style-sheet-name>` | MAFアプリケーションのプロジェクト内のCSSファイルの場所を指定するには、相対URLを使用します。たとえば、SkinningDemoサンプル・アプリケーションの`maf-skins.xml`ファイルには、アプリケーション・コントローラ・プロジェクトの`css`ディレクトリの`v1.css`スタイルシートへの次の参照が含まれます。 `<style-sheet-name>css/v1.css</style-sheet-name>`
`<version>` | スキンの異なるバージョンを指定します。詳細は、第7.5項「MAFスキンのバージョニング」を参照してください。

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

表7-2 <skin-addition>の子要素

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

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

例7-2 <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.3.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デバイスにレンダリングしたり、これらの要素を定義してすべてのデバイスのプラットフォームに対するスタイルを処理することもできます。表7-3に、iOSプラットフォームに属するすべてのデバイス、および特定のiOSデバイス・タイプ(タブレット、電話、シミュレータ)をターゲットにするこれらの要素の使用例を示します。

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

表7-3 プラットフォームおよびデバイス固有のスタイル

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

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

アプリケーションにカスタム・スキンを追加するには、JDeveloper内にCSSファイルを作成します。CSSはアプリケーションとともにデプロイするために、JDeveloperによりプロジェクトのソース・ファイルに配置されます。

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

1. 「アプリケーション」ウィンドウで、ApplicationControllerプロジェクトを右クリックして、「新規」→「CSSファイル」を選択します。

2. 「Cascading Style Sheetの作成」ダイアログで、CSSファイルの名前およびディレクトリを指定します。

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

これで、CSSエディタにCSSを開いて、アプリケーションのスタイルを定義できます。

## 7.3 アプリケーションが使用するスキンの指定

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

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

1. 「アプリケーション」ウィンドウで、`maf-config.xml`ファイルをダブルクリックします。デフォルトでは、これは、「アプリケーション・リソース」ペインの「ディスクリプタ」および「ADF META-INF」ノードの下にあります。

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

   例7-3は、MAFアプリケーションで`mobileAlta-v1.3`スキンを使用するのに必要な構成を示しています。

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

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

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

## 7.4 カスタム・スキンの登録

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

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

1. 「アプリケーション」ウィンドウで、「ApplicationController」→「アプリケーション・ソース」→「META-INF」を開き、「maf-skins.xml」をダブルクリックします。

2. 「構造」ウィンドウで、「adfmf-skins」ノードを右クリックし、「adfmf-skinsの中に挿入」→「skin」を選択します。

3. 「skinの挿入」ダイアログで、次のようにフィールドに入力します。

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

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

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

   - ID: `skinFamily-version`または`skinFamily-version.platform`のいずれかの名前書式を使用してスキンのIDを入力します。たとえば、`mySkinFamily-v1.1.32.android`のように指定します。

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

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

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

## 7.5 MAFスキンのバージョニング

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

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

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

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

1. 「アプリケーション」ウィンドウで、`maf-skins.xml`ファイルをダブルクリックします。デフォルトでは、これは、アプリケーション・コントローラ・プロジェクトのMETA-INFノードにあります。

2. 「構造」ウィンドウで、バージョニングするスキンのskinノードを右クリックし、「skinの中に挿入」→「version」を選択します。

3. `maf-config.xml`ファイルの`<skin-version>`要素に値が指定されていない場合に、このバージョンのスキンがアプリケーションで使用されるようにするには、「バージョンの挿入」ダイアログで、デフォルト・リストからtrueを選択します(第7.3項「アプリケーションが使用するスキンの指定」を参照)。

4. 名前フィールドに値を入力します。たとえば、これがスキンの最初のバージョンである場合は`v1`と入力します。

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

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

スキン用に構成するバージョン情報は、実行時にアプリケーションでスキンが適用されるときに、プラットフォーム値およびデバイス値より優先されます。実行時に、MAFアプリケーションでは、プラットフォーム固有のスキンが適用される前にデバイス固有のスキンが適用されます。スキンのバージョン情報が指定されている場合、アプリケーションでは最初に、指定したスキンのバージョン値と一致するスキンを検索します。スキン・バージョン値およびデバイス値と一致するスキンが見つかると、アプリケーションではこのスキンが適用されます。指定したスキン・バージョンのスキンがデバイス固有のスキン内で見つからなかった場合、アプリケーションでは指定したバージョンのスキンをプラットフォーム固有のスキン内で検索します。使用可能なプラットフォーム固有のスキン内で、指定したバージョンと一致するスキンが見つからない場合、アプリケーションではベース・スキンを検索します。

例7-4は、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>`)。この動作は、第7.3項「アプリケーションが使用するスキンの指定」で説明されているように、`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`ファイル内で定義される最後のスキンを使用します。例7-4において、定義される最後のスキンは`customFamily-v3.iPhone`です。

例7-4 バージョニングされたスキン・ファイルが含まれた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>

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

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

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

図7-4 「包含」表

始める前に

第12.2項「タスク・フローの作成」の説明に従って、MAFタスク・フローを作成します。スキンのCSSファイルを作成または追加します。ビュー・コントローラ・プロジェクトを選択し、「新規」→「CSSファイル」を選択してCSSファイルを作成できます。または、次のようにCSSファイルをJARファイルにパッケージ化することもできます。

1. メイン・メニューから「アプリケーション」→「プロジェクト・プロパティ」を選択します。

2. 「プロジェクト・プロパティ」ダイアログで、「ライブラリとクラスパス」ページを選択し、「JAR/ディレクトリの追加」をクリックします。

3. 「アーカイブまたはディレクトリの追加」ダイアログで、インポートするADFスキンが含まれているJARファイルに移動し、「選択」をクリックします。

   JARファイルが「クラスパス・エントリ」リストに表示されます。

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

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

1. 「追加」をクリックして、「包含」表に新しい行を作成します。

2. 「インクルードの挿入」ダイアログで、次のフィールドに値を入力します。

   - ファイル: 追加するCSSスタイル・シートを参照して選択します。

   - タイプ: ドロップダウン・リストから「スタイルシート」を選択します。

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

   注意: 選択したスタイル・シートの`.CSS`ファイルがビュー・コントローラ・プロジェクト内に存在する必要があります。

## 7.8 スキンのアプリケーション機能への適用時に行われる処理

CSS (またはJavaScriptファイル)を「包含」表に追加すると、MAF AMXエディタの「プレビュー」ペインにある機能コンテンツのドロップダウン・メニュー(図7-5を参照)からアプリケーション機能を選択することで、アプリケーション機能に追加されたCSSページを、MAF AMXページに適用できます。

図7-5 機能コンテンツのドロップダウン・メニュー

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

`maf-skins.xml`ファイルで定義されるCSSファイル(例7-5を参照)は、Apple iPhoneとiPadの異なる表示要件に適応するようにスキンを拡張する方法を示します。これらのスタイルは降順に適用されます。SkinningDemoサンプル・アプリケーションでは、アプリケーションを異なるデバイスにデプロイするときに、カスタマイズされたスタイルを適用できるようにする方法のデモが提供されています。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所の`PublicSamples.zip`ファイルに含まれています。

    jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples

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

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

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

## 7.10 スキンへの新しいスタイル・シートの追加

スキンを拡張するかわりに、CSSファイルを既存のスキンに追加できます。

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

1. 「コンポーネント」ウィンドウから「構造」ウィンドウに、`<skin-addition>`要素をドラッグ・アンド・ドロップします。

2. 「skin-additionの挿入」ダイアログ(図7-6を参照)に入力を行うことで、表7-2で説明した要素を`<skin-addition>`要素に移入します。

   - 新しいスタイルを追加するスキンの識別子を入力します。

   - CSSファイルの場所を取得します。

   図7-6 「skin-additionの挿入」ダイアログ

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

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

## 7.11 エンド・ユーザーによる実行時のアプリケーション・スキンの変更の有効化

エンド・ユーザーが実行時に他のスキンを選択できるように、アプリケーションを構成できます。エンド・ユーザーが必要により適したスキンを使用して、アプリケーションをレンダリングできるようにする場合に、この機能を構成します。

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

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

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

エンド・ユーザーが実行時にアプリケーションのスキンを変更できるようにするには:

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

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

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

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

       ...
       <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を記述します。例7-7は、エンド・ユーザーが選択した値をとり、それをマネージドBean内の`skinFamily`の値の設定に使用するメソッドを示しています。例7-7は、新しいスキンを使用するためにアプリケーションのすべての機能をリセットするメソッドも示しています。

   例7-7 アプリケーションのスキンを変更するためのマネージド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>`

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

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

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

アプリケーションの機能を個別にリセットして新しいスキンをロードするかわりに、次のクラスから`resetApplication`メソッドを起動することもできます(例7-7を参照)。

`oracle.adfmf.framework.api.AdfmfContainerUtilities`

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