Fusion Middleware Oracle Application Development Frameworkモバイル開発者ガイド

11g リリース2 (11.1.2.3.0)

B70750-01(原本部品番号:E24475-01)

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

第I部 ADFモバイルの理解

1 ADF Mobileの概要

- 1.1 ADF Mobileの概要

- 1.2 ADFモバイルのランタイム・アーキテクチャ

2 ADFモバイル・アプリケーション開発の概要

- 2.1 ADFモバイル・アプリケーション開発の概要

- 2.2 インフラストラクチャ要件

- 2.3 サポートされるプラットフォーム、デバイスおよびデータベース

- 2.4 ADFモバイル・アプリケーションのアーキテクチャ

- 2.5 一般的な開発段階

- 2.6 アプリケーションのライフサイクル

- 2.7 サンプル・アプリケーション

- 2.8 ADFモバイルAMXアプリケーション機能

- 2.9 ADFモバイルとサーバー・ベースのOracle ADFとの比較

第II部 はじめに

3 ADFモバイル環境の設定

- 3.1 ADFモバイル環境の概要

- 3.2 ADFモバイル・アプリケーション開発の前提条件

- 3.2.1 アプリケーションの作成に必要なもの

- 3.2.2 ADFモバイル・アプリケーションを開発環境にデプロイするために必要なもの

- 3.3 JDeveloperの設定

- 3.3.1 プラットフォームとフォーム・ファクタに応じた開発環境の構成方法

- 3.3.1.1 フォーム・ファクタに応じた環境の構成

- 3.3.1.2 ターゲット・プラットフォームに応じた環境の構成

- 3.4 iOSプラットフォーム用の開発ツールの設定

- 3.4.1 iOS開発のためのJDeveloperの構成方法

- 3.4.2 Xcodeを準備する方法

- 3.4.3 iPhoneまたはiPadの設定方法

- 3.4.4 iPhoneまたはiPadシミュレータの設定方法

- 3.5 Androidプラットフォーム用の開発ツールの設定

- 3.5.1 Android開発のためのJDeveloperの構成方法

- 3.5.2 Android SDKのインストール方法

- 3.5.3 Androidデバイスの設定方法

- 3.5.4 Androidエミュレータの設定方法

- 3.5.4.1 エミュレータの状態の保存

- 3.5.4.2 SDカードの作成、保存および再使用

- 3.5.4.3 ネットワークの構成

- 3.5.4.4 ネットワーク・プロキシの構成

4 ADFモバイル・アプリケーション開発の開始

- 4.1 ADFモバイル・アプリケーションの宣言的な開発の概要

- 4.2 アプリケーション・ワークスペースの作成

- 4.2.1 ADFモバイル・アプリケーション用のワークスペースの作成方法

- 4.2.2 ADFモバイル・アプリケーション作成時の処理

- 4.2.2.1 アプリケーション・レベルのリソースについて

- 4.2.2.2 ビュー・コントローラ・プロジェクトについて

- 4.2.3 ADFモバイル・アプリケーションとアプリケーション機能の編集について

- 4.2.4 ADFモバイルAMXアプリケーション用のアプリケーション・ワークスペースの作成

- 4.2.4.1 ADFモバイルAMXページの作成方法

- 4.2.4.2 ADFモバイル・タスク・フローの作成方法

- 4.2.4.3 ADFモバイルAMXページおよびタスク・フロー作成時の処理

第III部 ADFモバイル・アプリケーションの開発

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

- 5.1 ADFモバイル・アプリケーションの定義の概要

- 5.1.1 adfmf-applications.xmlの概要エディタの使用方法

- 5.2 モバイル・アプリケーションの構成ファイルについて

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

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

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

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

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

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

- 5.4.4 HTMLコンテンツによるカスタムSpringboardアプリケーション機能について

- 5.4.5 ADFモバイルAMXコンテンツによるカスタムSpringboardアプリケーション機能について

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

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

- 5.5.2 機能参照IDと機能IDについて

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

- 5.6.1 ADFモバイル・アプリケーションのイベント

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

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

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

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

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

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

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

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

- 5.9.2 外部リソースの選択について

- 5.10 リソース・バンドルの使用

- 5.10.1 プロジェクト・レベルのリソース・バンドルの作成方法

- 5.10.2 リソース・バンドル追加時の処理

- 5.10.2.1 ADFモバイルAMXコンポーネントのプロジェクト・レベルのリソース・バンドルを作成する場合の処理

- 5.10.3 イメージ・ファイルのローカライズについて

- 5.10.4 iOSアプリケーションのXLIFFファイルについて

- 5.10.5 iOSアプリケーションの国際化

- 5.11 ADFモバイル・アプリケーションのスキニング

- 5.11.1 adfmf-config.xmlファイルについて

- 5.11.2 adfmf-skins.xmlファイルについて

- 5.11.2.1 ADFモバイルのスキン識別子について

- 5.11.3 デフォルト・スキン・ファミリの変更方法

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

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

- 5.11.4.2 スキンを機能アプリケーションに適用する場合の処理

- 5.11.5 スキニングについて

- 5.12 機能アーカイブ・ファイルの使用

- 5.12.1 ADFモバイル・アプリケーションでのFARコンテンツの使用方法

- 5.12.2 機能アーカイブJARをクラスパスに追加する場合の処理

- 5.12.3 機能アーカイブ・リソースの再使用の有効化について

6 アプリケーション機能の表示制御

- 6.1 ADFモバイルAPIを使用したカスタムSpringboardアプリケーション機能の作成

- 6.2 ADFモバイル・コンテナ・ユーティリティAPI

- 6.2.1 JavaScriptコールバックの使用方法

- 6.2.2 コンテナ・ユーティリティAPIの使用方法

- 6.2.3 checkforNewConfiguration

- 6.2.4 getApplicationInformation

- 6.2.5 gotoDefaultFeature

- 6.2.6 getFeatures

- 6.2.7 gotoFeature

- 6.2.8 getFeatureByName

- 6.2.9 getFeatureById

- 6.2.10 resetFeature

- 6.2.11 gotoSpringboard

- 6.2.12 hideNavigationBar

- 6.2.13 showNavigationBar

- 6.2.14 invokeMethod

- 6.2.15 invokeContainerJavaScriptFunction

- 6.3 getDirectoryPathRootメソッドを使用したファイル・アクセス

第IV部 ADFモバイルAMXアプリケーション機能の作成

7 ADFモバイルAMXページの作成

- 7.1 ADFモバイルAMXアプリケーション機能の概要

- 7.2 タスク・フローの作成

- 7.2.1 タスク・フローの作成方法

- 7.2.2 サポートされるアクティビティと制御フローについて

- 7.2.3 ViewController-task-flow.xmlファイルについて

- 7.2.4 ADFモバイル・タスク・フロー・ダイアグラマについて

- 7.2.5 ADFモバイル・アクティビティの追加方法

- 7.2.6 ビュー・アクティビティの追加方法

- 7.2.7 ワイルドカード制御フロー・ルールの追加方法

- 7.2.8 制御フロー・ケースを使用してページ・ナビゲーションを有効にする方法

- 7.2.9 UIコンポーネントを使用したアクション結果の指定方法

- 7.2.10 マネージドBeanの作成および参照方法

- 7.2.11 ページ遷移スタイルの指定方法

- 7.3 ビューの作成

- 7.3.1 ADFモバイルAMXページの使用方法

- 7.3.1.1 ADFモバイルAMXページ構造の解釈

- 7.3.1.2 ADFモバイルAMXページの作成

- 7.3.1.3 ADFモバイルAMXページの作成時の処理

- 7.3.1.4 UIエディタの使用方法

- 7.3.1.5 ページ定義へのアクセス

- 7.3.2 ADFモバイルAMXページへのUIコンポーネントおよびデータ・コントロールの追加方法

- 7.3.2.1 UIコンポーネントの追加

- 7.3.2.2 「プレビュー」の使用方法

- 7.3.2.3 UIコンポーネントの構成

- 7.3.2.4 データ・コントロールのビューへの追加

- 7.3.2.5 要素識別子とその監査について

8 ADFモバイルAMXユーザー・インタフェースの作成

- 8.1 「ADFモバイルAMX」ページのUIの作成の概要

- 8.2 ページ・レイアウトの設計

- 8.2.1 表示コンポーネントの使用方法

- 8.2.2 パネル・ページ・コンポーネントの使用方法

- 8.2.3 パネル・グループ・レイアウト・コンポーネントの使用方法

- 8.2.4 パネル・フォーム・レイアウト・コンポーネントの使用方法

- 8.2.5 パネル・ラベルおよびメッセージ・コンポーネントの使用方法

- 8.2.6 ファセット・コンポーネントの使用方法

- 8.2.7 リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法

- 8.2.7.1 リスト・ビュー・ページングの構成

- 8.2.7.2 リスト・ビュー・アイテムの再配置

- 8.2.7.3 スタイルを使用したレイアウトの構成

- 8.2.7.4 静的リスト・ビューの使用方法について

- 8.2.8 ポップアップ・コンポーネントの使用方法

- 8.2.9 パネル・スプリッタ・コンポーネントの使用方法

- 8.2.10 表のレイアウト・コンポーネントの使用方法

- 8.3 UIコンポーネントの作成と使用方法

- 8.3.1 入力テキスト・コンポーネントの使用方法

- 8.3.2 入力数値スライダ・コンポーネントの使用方法

- 8.3.3 入力日コンポーネントの使用方法

- 8.3.4 出力テキスト・コンポーネントの使用方法

- 8.3.5 ボタンの使用方法

- 8.3.5.1 デフォルト・スタイル・ボタンの表示

- 8.3.5.2 戻るスタイル・ボタンの表示

- 8.3.5.3 強調表示スタイル・ボタンの表示

- 8.3.5.4 アラート・スタイル・ボタンの表示

- 8.3.5.5 アプリケーション内でのボタンの使用方法

- 8.3.5.6 戻るボタン・ナビゲーションの有効化

- 8.3.5.7 操作と属性の処理順序について

- 8.3.6 リンクの使用方法

- 8.3.7 イメージの表示方法

- 8.3.8 チェックボックス・コンポーネントの使用方法

- 8.3.8.1 iOSプラットフォームでのチェックボックス・コンポーネントのサポート

- 8.3.8.2 Androidプラットフォームでのチェックボックス・コンポーネントのサポート

- 8.3.9 チェックボックスを複数選択コンポーネントの使用方法

- 8.3.9.1 チェックボックスを複数選択コンポーネントとユーザーとの対話について

- 8.3.10 選択肢コンポーネントの使用方法

- 8.3.10.1 iOSプラットフォームでの選択肢コンポーネントとユーザーとの対話について

- 8.3.10.2 Androidプラットフォームでの選択肢コンポーネントとユーザーとの対話について

- 8.3.10.3 アイテムの選択コンポーネントの違いについて

- 8.3.11 選択肢を複数選択コンポーネントの使用方法

- 8.3.12 ブール・スイッチ・コンポーネントの使用方法

- 8.3.12.1 iOSプラットフォームでのブール・スイッチ・コンポーネントのサポート

- 8.3.12.2 Androidプラットフォームでのブール・スイッチ・コンポーネントのサポート

- 8.3.13 選択ボタン・コンポーネントの使用方法

- 8.3.14 ラジオ・ボタン・コンポーネントの使用方法

- 8.3.15 カルーセル・コンポーネントの使用方法

- 8.3.16 Verbatimコンポーネントの使用方法

- 8.3.17 反復の有効化方法

- 8.3.18 リソース・バンドルのロード方法

- 8.3.19 アクション・リスナーの使用方法

- 8.3.20 プロパティ・リスナーの設定の使用方法

- 8.3.21 日時の変換方法

- 8.3.21.1 日時パターンについて

- 8.3.22 数値の変換方法

- 8.4 ジェスチャーの有効化

- 8.5 データ視覚化の指定

- 8.5.1 面グラフの作成方法

- 8.5.2 棒グラフの作成方法

- 8.5.3 横棒グラフの作成方法

- 8.5.4 バブル・チャートの作成方法

- 8.5.5 組合せグラフの作成方法

- 8.5.6 折れ線グラフの作成方法

- 8.5.7 円グラフの作成方法

- 8.5.8 散布図の作成方法

- 8.5.9 スパーク・チャートの作成方法

- 8.5.10 LEDゲージの作成方法

- 8.5.11 ステータス・メーター・ゲージの作成方法

- 8.5.12 ダイアル・ゲージの作成方法

- 8.5.13 チャートおよびゲージ・コンポーネントの子要素の定義方法

- 8.5.13.1 チャートのデータ・アイテムの定義

- 8.5.13.2 凡例の定義

- 8.5.13.3 X軸、Y軸およびY2軸の定義

- 8.5.13.4 円グラフのデータ・アイテムの定義

- 8.5.13.5 スパーク・チャートのデータ・アイテムの定義

- 8.5.13.6 参照オブジェクトの定義

- 8.5.13.7 しきい値の定義

- 8.5.14 地理マップ・コンポーネントの作成方法

- 8.5.14.1 地理プロバイダ情報を指定した地理マップ・コンポーネントの構成

- 8.5.15 テーマ・マップ・コンポーネントの作成方法

- 8.5.15.1 カスタム・マーカーの定義方法

- 8.5.15.2 分離領域の定義方法

- 8.5.15.3 初期ズームの有効化

- 8.5.15.4 カスタム・ベース・マップの定義方法

- 8.5.15.5 テーマ・マップ・コンポーネントへのカスタム・スタイリングの適用方法

- 8.5.16 データバインドされたデータ視覚化コンポーネントの作成方法

- 8.6 UIコンポーネントのスタイル設定

- 8.6.1 コンポーネント属性を使用したスタイルの定義方法

- 8.6.2 スキニングについて

- 8.6.3 データ視覚化コンポーネントのスタイル設定方法

- 8.7 UIコンポーネントのローカライズ

- 8.8 ADFモバイルのアクセシビリティのサポートについて

- 8.8.1 アクセシビリティのためのUIコンポーネントの構成方法

- 8.8.2 基本的なWAI-ARIA用語について

- 8.8.3 Oracle Global HTML Accessibility Guidelinesについて

- 8.9 入力の検証

- 8.10 イベント・リスナーの使用方法

- 8.10.1 イベント・リスナーの制約付きタイプ属性について

9 バインディングの使用とデータ・コントロールの作成

- 9.1 バインディング・レイヤー・コンポーネントとデータ・コントロールの概要

- 9.2 ELサポートの理解

- 9.2.1 ADFモバイルAMX ELの実装

- 9.2.1.1 即時および遅延評価

- 9.2.1.2 列挙型

- 9.2.2 バインディング・コンテナを参照する方法

- 9.2.3 ELイベント

- 9.2.3.1 構成プロパティ

- 9.2.4 EL式ビルダー

- 9.2.4.1 ADFバインディング

- 9.2.4.2 ADFマネージドBean

- 9.2.4.3 ADFモバイル・オブジェクト

- 9.2.4.4 メソッド式ビルダー

- 9.2.4.5 非ELプロパティ

- 9.3 バインディング・レイヤー・コンポーネントの理解

- 9.3.1 順序付け

- 9.3.2 ADFモバイルAMXページのELバインディングの検証

- 9.4 Beanデータ・コントロールの作成と使用

- 9.4.1 Beanクラス変数のシリアライズについて

- 9.5 DeviceFeaturesデータ・コントロールの使用方法

- 9.5.1 getPictureメソッドの使用方法

- 9.5.2 SendSMSメソッドの使用方法

- 9.5.3 sendEmailメソッドの使用方法

- 9.5.4 createContactメソッドの使用方法

- 9.5.5 findContactsメソッドの使用方法

- 9.5.6 updateContactメソッドの使用方法

- 9.5.7 removeContactメソッドの使用方法

- 9.5.8 startLocationMonitorメソッドの使用方法

- 9.5.9 デバイス・プロパティ

- 9.6 検証の実行

- 9.6.1 検証ルールの追加方法

- 9.6.2 バリデータのメタデータについて

- 9.7 データ変更イベント

10 Webサービスの使用方法

- 10.1 Webサービスの使用方法の概要

- 10.2 Webサービス・データ・コントロールの作成

- 10.2.1 SOAPを使用したWebサービス・データ・コントロールの作成方法

- 10.2.2 RESTを使用したWebサービス・データ・コントロールの作成方法

- 10.3 新しいWebサービス接続の作成

- 10.4 Webサービス・データ・コントロールのエンドポイントの調整

- 10.5 セキュアなWebサービスへのアクセス

- 10.5.1 SOAPベースのWebサービスへのアクセスを有効にする方法

- 10.5.2 RESTベースのWebサービスへのアクセスを有効にする方法

- 10.5.3 資格証明の挿入について

- 10.5.4 セキュアなWSDLファイルの使用制限

- 10.6 JavaからのWebサービスの起動

- 10.6.1 REST Webサービス・アダプタの使用方法

- 10.6.1.1 非テキスト・レスポンスのサポート

- 10.6.2 データ・コントロール操作の起動について

- 10.7 Webサービスの管理

- 10.7.1 URLの構築について

11 ローカル・データベースの使用方法

- 11.1 ローカルSQLiteデータベースの使用方法の概要

- 11.1.1 SQLiteと他のリレーショナル・データベースとの相違点

- 11.1.1.1 同時実行性

- 11.1.1.2 SQLのサポートおよび解釈

- 11.1.1.3 データ型

- 11.1.1.4 データベース・トランザクション

- 11.1.1.5 認証

- 11.2 ローカルSQLiteデータベースの使用方法

- 11.2.1 データベースへの接続方法

- 11.2.2 SQLスクリプトを使用してデータベースを初期化する方法

- 11.2.3 デスクトップ上でデータベースを初期化する方法

- 11.2.4 コミット処理について

- 11.2.5 ADFモバイルでのSQLite JDBCドライバの制限

- 11.2.6 データベースを暗号化および復号化する方法

第V部 高度なトピック

12 リモートURLとしてのアプリケーション機能の実装

- 12.1 リモートURLアプリケーションの概要

- 12.2 リモートURL実装によるPhoneGapへのアクセスの有効化の概要

- 12.3 ホワイトリストを使用したリモート・アプリケーションによるデバイス・サービスへのアクセスの有効化

- 12.3.1 デバイス機能へのアクセスの制御方法

- 12.3.2 ホワイトリストの作成方法

- 12.3.3 ホワイトリストにドメインを追加する場合の処理

- 12.3.4 リモートURLについて

- 12.4 アプリケーション・コンポーネントのホワイトリストの作成

- 12.5 リモートURLページでのブラウザ・ナビゲーション・バーの有効化

- 12.5.1 リモートURLアプリケーション機能へのナビゲーション・バーの追加方法

- 12.5.2 リモートURLアプリケーション機能のブラウザ・ナビゲーション・ボタンを有効にする場合の処理

13 ユーザー・プリファレンスの有効化

- 13.1 ADFモバイル・アプリケーションのユーザー・プリファレンス・ページの作成

- 13.1.1 モバイル・アプリケーションレベルのプリファレンス・ページの作成方法

- 13.1.1.1 新しいユーザー・プリファレンス・ページの作成方法

- 13.1.1.2 プリファレンス・ページを追加する場合の処理

- 13.1.1.3 ユーザー・プリファレンス・リストの作成方法

- 13.1.1.4 プリファレンス・リストを作成する場合の処理

- 13.1.1.5 ブール型のプリファレンス・リストの作成方法

- 13.1.1.6 ブール型のプリファレンスを追加する場合の処理

- 13.1.1.7 テキストのプリファレンスの追加方法

- 13.1.1.8 テキストのプリファレンスを定義する場合の処理

- 13.1.2 アプリケーションレベルのプリファレンス・ページを作成する場合の処理

- 13.2 アプリケーション機能のユーザー・プリファレンス・ページの作成

- 13.3 ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法

- 13.3.1 preferenceScopeについて

- 13.3.2 iOSネイティブ・ビューでのプリファレンス値の読取り

- 13.4 プラットフォームによる表示の差異

14 制約の設定

- 14.1 制約の概要

- 14.2 アプリケーション機能の制約の定義

- 14.2.1 アプリケーション機能に制約を定義する方法

- 14.2.2 制約を定義する場合の処理

- 14.2.3 property属性について

- 14.2.3.1 ユーザー制約

15 Oracle Cloud上のデータへのアクセス

- 15.1 Oracle CloudでホストされるデータへのADFモバイル・アプリケーションによるアクセスの有効化

- 15.1.1 Oracle Cloudの認証方法

- 15.1.2 Oracle Java CloudにアクセスするためのWebサービス・データ・コントロールの作成方法

- 15.1.2.1 SOAPベースのWebサービスにおけるポリシーの構成

- 15.1.3 Oracle Java Cloud ServiceにアクセスするADFモバイル・アプリケーションをデプロイする場合の処理

第VI部 アプリケーションの完成

16 ADFモバイル・アプリケーションのデプロイ

- 16.1 モバイル・アプリケーションのデプロイメントの概要

- 16.1.1 ADFモバイルによるアプリケーションのデプロイ方法

- 16.1.1.1 プロジェクト・ライブラリのデプロイメント

- 16.1.1.2 JVM 1.4ライブラリのデプロイメント

- 16.2 デプロイメント・プロファイルでの作業

- 16.2.1 デプロイメント・プロファイルの作成方法

- 16.2.2 デプロイメント・プロファイルの作成時の処理

- 16.2.3 Androidデプロイメント・プロファイルの作成方法

- 16.2.3.1 アプリケーションの詳細オプションの設定

- 16.2.3.2 デプロイメント・オプションの設定

- 16.2.3.3 Android署名オプションの定義

- 16.2.3.4 Androidアプリケーションへのカスタム・イメージの追加方法

- 16.2.3.5 JDeveloperによってAndroidアプリケーション用のイメージがデプロイされる場合の処理

- 16.2.3.6 AndroidエミュレータまたはAndroidデバイスにアプリケーションをデプロイする場合のJDeveloperでの処理

- 16.2.4 iOSデプロイメント・プロファイルの作成方法

- 16.2.4.1 iOSビルド・オプションの定義

- 16.2.4.2 デバイス署名オプションの設定

- 16.2.4.3 iOSアプリケーションへのカスタム・イメージの追加

- 16.2.4.4 iTunesArtworkについて

- 16.2.4.5 表示をデバイスの特定の向きに制限する方法

- 16.2.4.6 デバイスの向きを選択解除する場合の処理

- 16.3 Androidアプリケーションのデプロイ

- 16.3.1 AndroidエミュレータへのAndroidアプリケーションのデプロイ方法

- 16.3.2 Androidデバイスへのアプリケーションのデプロイ方法

- 16.3.3 Androidアプリケーションの公開方法

- 16.3.4 .apkファイル作成時のJDeveloperでの処理

- 16.3.5 最近使用されたデプロイメント・プロファイルの選択

- 16.3.6 Androidデバッグ・ブリッジの使用方法について

- 16.4 iOSアプリケーションのデプロイ

- 16.4.1 iOSシミュレータへのiOSアプリケーションのデプロイ方法

- 16.4.2 iOSデバイスへのアプリケーションのデプロイ方法

- 16.4.3 iOSデバイスにアプリケーションをデプロイする場合の処理

- 16.4.4 iOSデバイスへのアプリケーションのデプロイについて

- 16.4.4.1 iOS開発用証明書の作成

- 16.4.4.2 テストおよびデバッグ用のAppleデバイスの登録

- 16.4.4.3 アプリケーションIDの登録

- 16.4.5 iTunesへのiOSアプリケーションの配布方法

- 16.4.5.1 iOSシミュレータまたはiOSデバイスにアプリケーションをデプロイする場合のJDeveloperでの処理

- 16.5 機能アーカイブ・ファイル(FAR)のデプロイ

- 16.5.1 機能アーカイブのデプロイメント・プロファイルの作成方法

- 16.5.2 機能アーカイブのデプロイメント・プロファイルのデプロイ方法

- 16.5.3 機能アーカイブ・ファイルのデプロイメント・プロファイルをデプロイする場合の処理

- 16.6 コマンドラインからのADFモバイル・アプリケーションのデプロイ

- 16.6.1 OJDeployを使用したADFモバイル・アプリケーションのデプロイ

17 ADFモバイル・アプリケーションのセキュリティ

- 17.1 ADFモバイル・アプリケーションのセキュリティの概要

- 17.2 ユーザー・ログイン・プロセスの概要

- 17.3 認証の概要

- 17.4 ADFモバイル・アプリケーションのセキュリティの構成

- 17.4.1 認証を要求するようにアプリケーション機能を設定する方法

- 17.4.2 ログイン・ページの指定方法

- 17.4.3 ADFモバイル接続作成時の処理

- 17.4.4 失敗したログイン試行に対応するようにADFモバイルを構成することについて

- 17.4.5 セキュリティ構成時のJDeveloperでの処理

- 17.4.6 アクセス制御サービスについて

- 17.4.7 REST Webサービス・コールへのCookieの挿入を可能にする場合の処理

- 17.4.8 CookieをREST Webサービス・コールに挿入することについて

- 17.4.9 Webサービス・セキュリティについて

- 17.4.10 カスタム・ログイン・ページの指定時の処理

- 17.4.11 ログイン・ページについて

- 17.4.11.1 デフォルト・ログイン・ページ

- 17.4.11.2 カスタム・ログイン・ページ

- 17.4.11.3 iOSデバイス用のカスタム・ログインHTMLページの作成

- 17.5 プライベート証明書の追加

18 ADFモバイル・アプリケーションのテストとデバッグ

- 18.1 ADFモバイル・アプリケーションのテストとデバッグの概要

- 18.2 ADFモバイル・アプリケーションのテスト

- 18.2.1 iOSデバイス上でアクセシビリティのテストを実行する方法

- 18.3 ADFモバイル・アプリケーションのデバッグ

- 18.3.1 iOSプラットフォームでのデバッグ方法

- 18.3.2 Androidプラットフォームでのデバッグ方法

- 18.3.3 ADFモバイルAMXコンテンツのデバッグ方法

- 18.3.4 JavaコードおよびJavaScriptのデバッグを有効にする方法

- 18.4 デバッグ・モードの使用方法

- 18.5 ロギングの使用方法と構成

- 18.5.1 プロパティ・ファイルを使用したロギングの構成方法

- 18.5.2 JavaScriptのロギングの使用方法

- 18.5.3 埋込みロギングの使用方法

第VII部 付録

A トラブルシューティング

- A.1 iOSシミュレータでの入力コンポーネントの問題

B デプロイメントでのプリファレンスの変換

- B.1 プリファレンスのネーミング・パターン

- B.2 Android用のプリファレンスの変換

- B.2.1 Preferences.xml

- B.2.1.1 プリファレンス要素のマッピング

- B.2.1.2 プリファレンス属性のマッピング

- B.2.1.3 属性のデフォルト値

- B.2.1.4 プリファレンス画面ルート要素

- B.2.2 arrays.xml

- B.2.3 Strings.xml

- B.3 iOS用のプリファレンスの変換

C ADFモバイル・アプリケーションの使用方法

- C.1 ADFモバイル・アプリケーションの使用方法の概要

- C.2 モバイル・デバイスへのADFモバイル・アプリケーションのインストール

- C.2.1 エンド・ユーザーがiOSデバイスにADFモバイル・アプリケーションをインストールする方法

- C.2.2 エンド・ユーザーがAndroidデバイスにADFモバイル・アプリケーションをインストールする方法

- C.2.3 エンド・ユーザーがADFモバイル・アプリケーションをアンインストールする方法

- C.3 エンド・ユーザーによるアプリケーション機能間のナビゲーション

- C.3.1 エンド・ユーザーがiOSデバイスでアプリケーション機能間を移動する方法

- C.3.1.1 Springboardを使用したナビゲーションについて

- C.3.1.2 単一機能アプリケーションについて

- C.3.2 Androidデバイス上での移動方法

- C.4 プリファレンスの設定

- C.4.1 iOSデバイスでのプリファレンスの設定方法

- C.4.2 Androidデバイスでのプリファレンスの設定方法

- C.5 アプリケーションの使用方法の制限

- C.5.1 リスト・ビュー・コンポーネントの制限

- C.5.2 データ視覚化コンポーネントの制限

- C.5.3 Androidプラットフォームでのデバイスの「戻る」ボタンの制限

D XMLの解析

- D.1 kXMLライブラリを使用したXMLの解析

E サンプルのADFモバイル・アプリケーション

- E.1 サンプルのADFモバイル・アプリケーションの概要

Oracle® Fusion Middleware

Oracle Application Development Frameworkモバイル開発者ガイド

11g リリース2 (11.1.2.3.0)

B70750-01(原本部品番号:E24475-01)

2012年10月

Oracle JDeveloperを使用して、デバイス上でネイティブに実行するモバイル・アプリケーションを作成する方法について説明する、Oracle Application Development Framework (Oracle ADF)の開発者のためのドキュメント。

Oracle Fusion Middleware Oracle Application Development Frameworkモバイル開発者ガイド 11g リリース2 (11.1.2.3.0)

B70750-01

Copyright © 2012, Oracle and/or its affiliates.All rights reserved.

原本主著者: Liza Rekadze、John Bassett

原本主協力者: Cindy Hall

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントが、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供される場合は、次のNoticeが適用されます。

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007).Oracle USA, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、このソフトウェアまたはハードウェアを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

このソフトウェアおよびドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

はじめに

『Oracle Application Development Frameworkモバイル開発者ガイド』へようこそ

対象読者

このドキュメントは、デバイス上で実行され、ほとんどモバイル環境のみで作業を行うユーザー向けのアプリケーションの開発を担当するOracle ADF開発者を対象とします。

ドキュメントのアクセシビリティについて

オラクル社のアクセシビリティへの取組みの詳細は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoまたはhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs (聴覚障害者向け)を参照してください。

関連ドキュメント

詳細は、次のドキュメントを参照してください。

- 『Oracle Fusion Middleware Oracle Application Development FrameworkのためのFusion開発者ガイド』

- 『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』

- 『Oracle Fusion Middleware Oracle Application Development Framework管理者ガイド』

- Oracle Fusion Middleware Oracle Application Development Frameworkモバイル・ブラウザ開発者ガイド

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

第I部

ADFモバイルの理解

ADFモバイルの概念、テクノロジおよび開発方法について説明します。

第I部は、次の章で構成されています。

- 第1章「ADFモバイルの概要」

- 第2章「ADFモバイル・アプリケーション開発の概要」

1 ADF Mobileの概要

この章ではADFモバイルの概要を説明します。ADFモバイルはOracle JDeveloper内のアプリケーション開発フレームワークで、これにより、iOSデバイスおよびAndroidデバイス用に複数機能のアプリケーションを作成できるようになります。これらのアプリケーションは、モバイル・デバイス上でネイティブに実行されます。

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

- 1.1項「ADF Mobileの概要」

- 第1.2項「ADFモバイルのランタイム・アーキテクチャ」

1.1 ADF Mobileの概要

ADFモバイルでは、iOSおよびAndroidプラットフォームで機能するモバイル・デバイス上で実行される様々なタイプのコンテンツを保持できるアプリケーションを作成できます。このアプリケーションのフレームワーク内では、格納されている機能領域はアプリケーション機能と呼ばれ、アプリケーションの機能の1つ以上の特定部分を表しています。

ADFモバイルのアプリケーション機能はそれぞれ独自のユーザー定義のプリファレンス・セットを持つ場合もありますが、ADFモバイルでは、ADFモバイル・アプリケーションに埋め込まれたそれぞれのアプリケーション機能に、ユーザー・プリファレンスの統一スタイルを適用できます。さらに、これらのモバイル・アプリケーション機能を機能別にグループ化することで、エンドユーザーの操作性を向上させることができます。たとえば、顧客のコンタクト先を提供するモバイル・アプリケーション機能を製品在庫のモバイル・アプリケーション機能と合わせてグループ化し、1つのADFモバイル・アプリケーションにすることができます。また、ユーザー・ロールやデバイス・バージョンなどの基準によって、アプリケーション機能の表示を制御することもできます。

エンドユーザーの視点から見た場合、ADFモバイルを使用して作成したアプリケーションを起動するには、モバイル・デバイス上のそのアプリケーションのアイコンをクリックします(図1-1を参照)。

図1-1 ADFモバイル・アプリケーションの起動

ADFモバイル・アプリケーションが開いたら、エンドユーザーはアプリケーション機能のアイコンをクリックします。アプリケーション機能は、ナビゲーション・バーにアイコンとして表示するか(図1-2の下部を参照)、通常Springboardと呼ばれる(図1-3を参照)ホームスクリーン・ページに大きなアイコンを含むページ形式で表示できます。

図1-2 ナビゲーション・バーに表示されたアプリケーション機能

図1-3 Springboardに表示されたアプリケーション機能

ADFモバイルではこれらのアプリケーション機能とモバイル・デバイス・サービスの統合をサポートしているので、エンドユーザーは、モバイル・フィールド・サービス・レポート・フォームのアプリケーション機能のコンタクト先にリストされた名前をクリックすることでモバイル・デバイスから電話をかけたり、領収書をスキャンしてモバイル経費レポートを更新できます。ADFモバイルのユーザーの操作性の詳細は、付録C「ADFモバイル・アプリケーションの使用方法」を参照してください。

次に示すタイプのアプリケーション機能は、同じADFモバイル・アプリケーション内に共存させることができます。

- ADFモバイルAMX: ADFモバイル・アプリケーション内に存在するアプリケーション機能を開発する必要は必ずしもありませんが、この実装方法では、XMLファイルで表されたメタデータを使用して、埋込みコンポーネントによってデバイスの機能の多くを使用するアプリケーション機能を定義できます。このアプリケーション機能の実装は、モバイル・デバイス上のHTMLまたはJavaScriptに生成され、ADFデータ・バインディングを使用するものですが、一連のADFモバイル固有のコンポーネントを使用してJDeveloperで宣言的に開発されます。
ADFモバイルAMXページのワークフローは、プラットフォーム間で移植可能です。

詳細は、次の項を参照してください。

- ADFモバイルAMXビュー

- 第IV部「ADFモバイルAMXアプリケーション機能の作成」

- ローカルHTML: この実装方法では、JavaScriptやJavaなどの既存のテクノロジが埋め込まれているHTMLファイルを使用できます。JDeveloperを使用して、ADFモバイル・アプリケーション機能をローカルHTMLとして実装できます。詳細は、第5.9.1項「アプリケーション・コンテンツの定義方法」を参照してください。

- リモートURL(サーバーHTMLとも呼ばれる): この実装方法では、URLエンドポイントを指定することでWeb上のリソースを指すことができます。JDeveloperを使用して、ADFモバイル・アプリケーション機能をリモートURLとして実装できます。
URLエンドポイントは、プラットフォーム間で移植可能です。

詳細は、次の項を参照してください。

- サーバーHTML

- 第12章「リモートURLとしてのアプリケーション機能の実装」

ADFモバイル・アプリケーションでは、埋込みアプリケーション機能を電話、カメラ、GPSなどのネイティブ・デバイス・サービスと統合できます。これらのサービスには、ローカルHTML、ADFモバイルAMX、JavaおよびリモートWebアプリケーションからアクセスできます。

1.2 ADFモバイルのランタイム・アーキテクチャ

PhoneGapフレームワーク(http://www.phonegap.com/homeを参照)の拡張機能であるADFモバイル・アーキテクチャでは、HTML5の他、ADF定義ページとタスク・フローを同一のダウンロード可能なアプリケーション内でレンダリングできます。

ADFモバイルは、次の部分で構成されます。

- Oracle ADFによって提供されるモデル。

注意:

モデル・レイヤーは、ローカル・データベースに接続するためのファシリティを提供します。

- HTMLまたはXMLで表されたビュー。

- XMLで定義されたコントローラ。

- 各アプリケーションとバンドルされた埋込みのJava VMによって機能するJavaランタイム。

注意:

ADFモバイルのModel-View-Controllerスタックはモバイル・デバイス上に存在し、ADFのModel-View-Controllerレイヤーの再実装を表しています。UIメタデータはデバイス上のネイティブ・コンポーネントにレンダリングされ、ADFモデルによってモデルにバインドされます。

図1-4は、ADFモバイルのランタイム・アーキテクチャの全体像を示しています。

図1-4 ADFモバイルのランタイム・アーキテクチャ

図1-4に示すように、ADFモバイルのランタイム・アーキテクチャは次の要素によって構成されています。

- デバイス・ネイティブ・コンテナは、デバイス・ネイティブのアプリケーション・バイナリとしてコンパイルされるアプリケーション・コンテナ(テンプレート)を表します。このコンテナは、ADFモバイル・アプリケーションがモバイル・デバイスのオペレーティング・システム(iOSなど)内で、デバイス上のネイティブ・アプリケーションとして実行されるようにするためのランタイム環境を提供します。また、ADFモバイル・アプリケーションのクライアント側コンポーネントのホスティングに加え、Springboardやナビゲーション・バーなど、特定のアプリケーション機能にアクセスできるようにするナビゲーション・ユーティリティも提供します。

- Webビューは、デバイス・ネイティブ・コンテナの一部で、モバイル・デバイスのWebエンジンを使用してWebベースのコンテンツを表示して処理します。ADFモバイル・アプリケーションにおいて、Webビューは、アプリケーション・ユーザー・インタフェースをレンダリングおよび配信するためのプライマリ・メカニズムです。

- サーバーHTMLは、サーバー上で生成されるWebベースのユーザー・インタフェースのことで、ADFモバイル・アプリケーションにWebページとして配信されます。アプリケーションのHTMLコード、ビジネス・ロジックおよびページ・フロー・ロジックはリモート・サーバー上で生成されます。サーバーHTMLは、ADFモバイル・アプリケーション内で実行されているかぎり、PhoneGapによってサポートされているJavaScript APIを介して、デバイス・ネイティブのサービス(カメラなど)にアクセスできます。サーバーHTMLベースのページの共通オプションは、ADFモバイル・ブラウザとOracle ADF Facesリッチ・クライアント・ベースのページです。詳細は、第12章「リモートURLとしてのアプリケーション機能の実装」を参照してください。

- ローカルHTMLは、ADFモバイル・アプリケーション内に直接埋め込まれているJDeveloperまたはサード・パーティ・ツールを使用して開発されたWebページを表します。これらのページは、ADFモバイル・アプリケーションの一部として配信されます。ローカルHTMLファイルは、PhoneGapによってサポートされているJavaScript APIを介して、デバイス・ネイティブ機能にアクセスできます。

- ADFモバイルAMXビューは、ADFモバイルAMXテクノロジに基づいており、HTML5ベースのユーザー・インタフェースを使用できるJSFのような開発操作性が提供されています。ADFモバイルAMXビューは、JDeveloperの提供するUIとコード・エディタを使用して定義します。これらのビューは、ADFモバイル・アプリケーションに埋め込まれ、モバイル・デバイスにデプロイされます。実行時に、WebビューのJavaScriptエンジンが、ADFモバイルAMXビュー定義をHTML5コンポーネント内にレンダリングします。ADFモバイルの提供する実装方法の中でも、ADFモバイルAMXコンポーネントを使用して開発したアプリケーション機能は、アニメーションやジェスチャーの拡張サポートにより、最も信頼できるデバイス・ネイティブのユーザーの操作性を提供します。詳細は、第IV部「ADFモバイルAMXアプリケーション機能の作成」を参照してください。

- ADFコントローラは、Oracle ADFコントローラのモバイル・バージョンで、サーバー・ベースのOracle ADFアプリケーション向けに使用できるOracle ADFタスク・フロー・コンポーネントのサブセットをサポートしています。Oracle ADFバインド・タスク・フローとバインドなしタスク・フローの両方がサポートされ、サーバー・ベースのADFによってサポートされるイベントおよびスコープのサブセットもサポートされます。詳細は、第7.2項「タスク・フローの作成」を参照してください。

- Javaは、ADFモバイル・アプリケーションのJavaランタイム環境を提供します。このJava仮想マシン(JVM)は、デバイス・ネイティブなコードで実装され、ADFモバイル・アプリケーションの各インスタンスに、ネイティブ・アプリケーション・バイナリとして埋め込まれます(コンパイルされます)。JVMは、JavaME Connected Device Configuration (CDC)仕様に基づいています。

- マネージドBeanは、サーバーから戻されたデータを処理するための追加のビジネス・ロジックを提供するなど、ADFモバイルの機能拡張のために作成できるJavaクラスです。マネージドBeanは、埋込みのJavaサポートによって実行されるので、JavaME CDC仕様に準拠する必要があります。詳細は、第9章「バインディングの使用とデータ・コントロールの作成」を参照してください。

- ADFモバイル・アプリケーションのADFモデルは、サーバー・ベースのOracle ADFアプリケーションで使用できるビジネス・ロジック・コンポーネントのサブセットをサポートしています。ADFモデルには、ビジネス・ロジック・コンポーネントとユーザー・インタフェース間のインタフェースを提供するバインディング・レイヤーと、RESTまたはSOAPベースのWebサービスを起動する実行ロジックが格納されています。詳細は、第9章「バインディングの使用とデータ・コントロールの作成」を参照してください。

- アプリケーション構成とは、主要なアプリケーション構成をダウンロードおよびリフレッシュできるサービスのことです。たとえば、WebサービスのURLエンドポイントや、リモートURL接続などです。アプリケーション構成サービスは、WebDavベースのサーバー側サービスから構成情報をダウンロードします。詳細は、第10.7項「Webサービスの管理」を参照してください。

- 資格証明管理とアクセス制御は、ADFモバイル・アプリケーションにセキュリティ関連のサービスを提供するクライアント側サービスのことです。たとえば、オフライン認証をサポートするためにユーザーの資格証明をセキュアにキャッシュするローカルの資格証明ストアや、ユーザーのアクセス権限に基づいてアプリケーション機能を表示または非表示にするアクセス制御サービスがあります。詳細は、第17章「ADFモバイル・アプリケーションのセキュリティ」を参照してください。

- PhoneGapは、オープン・ソース・コード・ライブラリで、カメラなどの様々なモバイル・デバイス・サービスにアクセスするための共通のJavaScript APIを提供します。PhoneGapは、ADFモバイル・アプリケーション用のデバイス・サービス統合の大部分を提供しています。PhoneGap JavaScript APIは、ADFモバイルAMXベースのビューのJDeveloper設計時には、デバイス・データ・コントロールとしてさらに抽象化されるので、データ・コントロールをADFモバイルAMXビューに単純にドラッグ・アンド・ドロップするだけで、デバイス・サービスの統合が可能になります。

- ローカル・データとは、デバイス上に存在するデータ・ストアのことです。ADFモバイルでは、これらは暗号化されたSQLiteデータベースとして実装されています。このローカル・データ・ストアには、JDBCベースのAPIを使用し、Javaレイヤーを介してCRUD(作成、取得、更新、削除)操作がサポートされています。詳細は、第11章「ローカル・データベースの使用方法」を参照してください。

- サーバー側で、構成サーバーとは、アプリケーション構成サービスによって使用される構成ファイルをホストするWebDavベースのサーバーを指しています。構成サーバーは、リファレンス実装として提供されます。共通のJ2EEサーバー上でホストされている共通のWebDavサービスはどれでも、この目的で使用できます。詳細は、第10.7項「Webサービスの管理」を参照してください。

- サーバー側で、ADFモバイル・ブラウザとは、リモートURLのADFモバイル・アプリケーション機能の実装に使用できるサーバー側アプリケーションの開発のためのフレームワークを指しています。詳細は、第12章「リモートURLとしてのアプリケーション機能の実装」を参照してください。

2 ADFモバイル・アプリケーション開発の概要

この章ではADFモバイル・アプリケーションの開発を行う方法を説明します。

この章では、次の項目について説明します。

- 第2.1項「ADFモバイル・アプリケーション開発の概要」

- 第2.2項「インフラストラクチャ要件」

- 第2.3項「サポートされるプラットフォーム、デバイスおよびデータベース」

- 第2.4項「ADFモバイル・アプリケーションのアーキテクチャ」

- 第2.5項「一般的な開発段階」

- 第2.6項「アプリケーションのライフサイクル」

- 第2.7項「サンプル・アプリケーション」

- 第2.8項「ADFモバイルAMXアプリケーション機能」

- 第2.9項「ADFモバイルとサーバー・ベースのOracle ADFとの比較」

2.1 ADFモバイル・アプリケーション開発の概要

ADFモバイル・アプリケーションの設計を最適化するために、反復型の段階的な開発プロセスに従うことをお薦めします。

ADFモバイル・アプリケーション自体に加えてアプリケーション機能を開発することが可能ですが、このワークフローは必ずしも標準的ではありません。アプリケーション開発には、ADFモバイル・アプリケーションの作成と、別の開発者が作成可能なアプリケーション機能の埋込みが含まれます。つまり、ADFモバイル・アプリケーションは、開発者が自分で作成したコンテンツと、別の開発者が別途開発してADFモバイル・アプリケーションに統合したコンテンツを結合することで作成します。ADFモバイル・アプリケーション自体と、アプリケーション機能の特定のコンテンツのどちらを作成する場合でも、XcodeまたはAndroidのアプリケーション開発に関する知識は特に必要ありません。

詳細は、第4章「ADFモバイル・アプリケーション開発の開始」を参照してください。

2.2 インフラストラクチャ要件

ターゲットのプラットフォームによって開発ニーズは様々ですが、ADFモバイル・アプリケーションを作成、構築およびテストするための最小要件は次のとおりです。

- Oracle JDeveloper

- ADFモバイル用のOracle JDeveloper拡張機能

- プラットフォーム固有のツール(Xcode、Android SDKなど)

- モバイル・デバイスまたはそのシミュレータ

前提条件の詳細は、第3.2項「ADFモバイル・アプリケーション開発の前提条件」を参照してください。

2.3 サポートされるプラットフォーム、デバイスおよびデータベース

ADFモバイルは、次のプラットフォームをサポートしています。

- iOS 5以上

- Android 2.2以上

次のモバイル・デバイスがサポートされています。

- Apple iPhone

- Apple iPad

- Androidデバイス

サポートされるデータベースはSQLiteです(第11章「ローカル・データベースの使用方法」を参照)。

2.4 ADFモバイル・アプリケーションのアーキテクチャ

ADFモバイル・アプリケーションに対して考えられるアーキテクチャは次のとおりです。

- 基本的な接続アプリケーション: このタイプのアプリケーションには、Webサービス・データ・コントロールによって直接支えられているユーザー・インタフェースが含まれています。このWebサービス・データ・コントロールは、サーバーでホストされているWebサービスを起動します。ただし、データ・コントロールによって排他的にアクセスできるのは、REST-XMLおよびSOAPベースのデータ・サービスのみです。

- 中程度または複雑なデータ・サービスを使用する接続アプリケーション: このタイプのアプリケーションには、Java Beanデータ・コントロールによって支えられているユーザー・インタフェースが含まれます。さらに、Javaクラス(POJO)を使用して次の処理を実行します。

- さらに複雑なデータ・ソースからデータを取得して保持する。

- ユーザー・インタフェースにデータが渡される前にサーバーから取得したデータを操作する。データ・ソースがREST-XMLまたはSOAPフォーマットに基づいている場合、アプリケーションはJava Beanデータ・コントロールによって支えられ、さらにこのデータ・コントロールは、データの保持およびWebサービス・データ・コントロールからのデータの取得を行うPOJOによって支えられています。一般的な実装例には、ユーザー・インタフェースを支えるJavaクラスや、データ取得ロジックをホストする別のクラスなどが含まれます。

アプリケーションがJavaScript Object Notation (JSON)データを使用する場合は、Webサービス・データ・コントロールも、SOAPおよびREST-XMLのWebサービスも必要ありません。そのかわり、JSONサービスを直接呼び出して、アプリケーション・コード内でJSONデータを解析する必要があります。

- 切断されたアプリケーション: このタイプのアプリケーションには、データの移入されたローカル・データベースが必要です。通常は、次のような2つのコード・モジュールが必要です。

- 最初のコード・モジュールでは、ユーザー・インタフェースによってローカル・データベースからデータを取得できます。このモジュールは、Java BeanとJava Beanデータ・コントロールを作成し、ユーザー・インタフェースにデータを提供する役割を果たします。ローカル・データベース上のCRUD操作は、JDBCコードを使用して実行されます。

- 2つ目のコード・モジュールには、JDBCコードによってサーバーからデータを取得してローカル・データベースに移入するJavaクラスの実装が含まれます。バックグラウンド・データの同期化の実装を選択した場合、このモジュールによってバックグラウンド・スレッドを実行することもできます。これらのJavaクラスは、データ・コントロールを介したデータの取得(REST-XMLまたはSOAPデータを使用する場合)か、JSONデータ・ソースからの直接的なデータの取得のいずれかを担当します。

詳細は、次の項を参照してください。

- 第10章「Webサービスの使用方法」

- 第11章「ローカル・データベースの使用方法」

2.5 一般的な開発段階

一般的に、ADFモバイル・アプリケーションを構築するときには、次のアクティビティを実行します。

- 要件の収集

- 設計

- 開発

- デプロイ

- テスト

- デバッグ

- 保護

- サーバー側データへのアクセスの有効化(オプション)

- 再デプロイ

- 再テストとデバッグ

- 公開

ADFモバイル・アプリケーションの一般的な構築手順は次のようになります。

1. 設計段階では、モバイル・ユーザーの実行するタスクを検討します。この際、ハンドヘルド・コンピュータの使用方法はラップトップまたはデスクトップ・コンピュータとは異なることに注意します。ADFモバイル・アプリケーションによってユーザーのジョブ実行を支援する方法や、ユーザーがデバイスと対話する方法について検討します。アプリケーションがすっきりと合理化されるほど、ユーザーの使用が増加します。
次の手順では、アプリケーションを接続モードと切断モードのどちらで動作させる必要があるのかを決定し、デバイス・サービスの統合要件を理解し、サーバー側のデータ・ソースとプロトコルを決定します。

サーバー側サービスを設計するときには、モバイル・アクセスの最適化を実現することが非常に重要です。サーバー側のWebサービスが非常に複雑な場合、モバイル・アプリケーションでこれらを使用するのは困難になります。これは、渡されるデータ量のみの問題ではなく、結果を処理するために記述する必要があるクライアント側ロジックの分量の問題でもあります。特にモバイル用に提供されている一連のサーバー側インタフェースを公開することをお薦めします。また、すべてのJavaモジュールや、作成する必要があるデータ・コントロールなど、開発する必要があるクライアント・ビジネス・サービスを理解することも必要です。さらに、アプリケーションのビューやタスク・フローのワイヤフレームを作成することも必要です。これにより、アプリケーション機能を視覚化し、開発プロセスを支援できます。

設計の最終手順として、全体のアプリケーション機能を、機能グループおよび関連するビューを表す個別のアプリケーション機能にパーティション化する方法を検討する必要があります。これで、ワイヤフレームを作成することで、クライアント・ユーザー・インタフェースとタスク・フローの設計を開始できます。

2. 作業環境を設定するときには、ADFモバイルの拡張機能をダウンロードおよびインストールして、必要なコンポーネントをインストールし、開発およびデプロイに必要な設定を行います。詳細は、第3章「ADFモバイル環境の設定」を参照してください。

3. JDeveloperを使用してADFモバイル・アプリケーションを作成する場合は、ADFモバイル・アプリケーションの作成ウィザードを使用します。アプリケーション作成の結果として作成されるアーティファクトには、ADFモバイル・アプリケーションおよびアプリケーション機能の識別子ファイル、サポートされるすべてのプラットフォームに対応するアイコンおよびタブのデフォルト・イメージ、およびモバイル・デバイスのサービス(カメラ、GPS、電子メールなど)にアクセスするために使用する一連のデータ・コントロールが含まれます。
詳細は、次の項を参照してください。

- 第4章「ADFモバイル・アプリケーション開発の開始」

- 第5章「ADFモバイル・アプリケーションの定義」

4. アプリケーション機能を実装するときには、ビジネス・ニーズの徹底的な評価を行って、ADFモバイル・アプリケーション内に含める必要があるアプリケーション機能を決定します。ADFモバイルが提供する概要エディタを使用する場合、アプリケーション機能を実装するためのタスクには、アプリケーション機能のタイプ(HTML、リモートURL、ADFモバイルAMX、ネイティブUI)、表示プロパティ(表示名、ナビゲーション・バー、Springboardアイコン)、およびモバイル・デバイスの機能とユーザー・ロールの両方によって指定される表示動作の特定などが含まれます。
詳細は、次の項を参照してください。

- 第5章「ADFモバイル・アプリケーションの定義」

- 第IV部「ADFモバイルAMXアプリケーション機能の作成」

- 第12章「リモートURLとしてのアプリケーション機能の実装」

5. アプリケーション・デプロイメント段階では、最初に、それぞれのプラットフォームに対応するデバイスとシミュレータをサポートするデプロイメント・プロファイルを作成します。デプロイメント・プロファイルの作成には、ADFモバイル・アプリケーション自体で様々な向き(縦や横など)で使用する表示アイコンの選択や、アプリケーションの署名オプション(デバッグやリリースなど)の設定などが含まれます。
次に、モバイル・デバイスまたはシミュレータへのアプリケーションのデプロイへと進みます。

注意:

ADFモバイル・アプリケーションでは、デバイスまたはシミュレータは、テストとデバッグを行う前にデプロイする必要があります(第18章「ADFモバイル・アプリケーションのテストとデバッグ」を参照)。アプリケーションはデプロイするまで実行できません。

詳細は、第16章「ADFモバイル・アプリケーションのデプロイ」を参照してください。

6. テストおよびデバッグ段階では、アプリケーションのテスト、デバッグおよび最適化を行います。詳細は、第18章「ADFモバイル・アプリケーションのテストとデバッグ」を参照してください。

7. アプリケーションのセキュリティを有効化して構成する場合、通常はOracle Identity Connectサーバーなどのログイン・サーバーの構成が必要です。これは、基本的なHTTP認証メカニズムによって保護されているWebページにすることもできます。さらに、アクセス制御サーバーを設定する必要がある場合もあります。
詳細は、第17章「ADFモバイル・アプリケーションのセキュリティ」を参照してください。

8. 基本レベルで想定どおりにアプリケーションが機能することを確認したら、サーバー側データにアクセスするためのJavaコードを実装できます。

- 接続アプリケーションの場合、これらのJavaクラスによってWebサービスを直接呼び出す必要があります。アプリケーションがSOAPまたはREST XMLベースのデータ・ソースを使用している場合、データ・コントロールを介してWebサービスを呼び出します。この場合は、コードから呼び出すことのできる一連のヘルパー・クラスにより、データ・コントロールを呼び出し、データを戻します。アプリケーションがJSONベースのデータ・ソースを使用している場合、コードによってJSONサービスを直接呼び出してデータを戻し、その後、サーバーでJSONデータを解析して、対応するデータ・コレクションを保持しているオブジェクトに移入する必要があります。

- 切断されたアプリケーションの場合は、コードによってローカルのSQLiteデータベースにデータを移入する必要があります。次に、Webサービスを直接呼び出すかわりに、ユーザー・インタフェースを支えるコードがSQLiteデータベースからデータを取得できます。

詳細は、次の項を参照してください。

- 第2.4項「ADFモバイル・アプリケーションのアーキテクチャ」

- 第10章「Webサービスの使用方法」

- 第11章「ローカル・データベースの使用方法」

9. 第2回目のデプロイメントでは、アプリケーションにセキュリティを追加し、サーバー側データへのアクセスを有効にした後、アプリケーション・デプロイメントが想定どおりに実行され、アプリケーションで最後のテストおよびデバッグを行う準備ができていることを確認します。

10. 最終回のテストとデバッグでは、セキュリティとサーバー側データのアクセス機能に重点を置き、これらの機能をアプリケーションと統合したときに、エラーや予期しない動作が発生しないことを確認します。

11. アプリケーションを本番環境にデプロイする場合、通常は、エンタープライズ・サーバー、Apple App Storeまたはアプリケーション・マーケットプレイス(Google Playなど)への公開が行われます。ADFモバイル・アプリケーションを公開すると、エンド・ユーザーは自分のモバイル・デバイスにダウンロードしたり、指定されたアイコンをクリックしてアクセスできるようになります(付録C「ADFモバイル・アプリケーションの使用方法」を参照)。アプリケーション機能は指定された表示アイコンで表され、エンド・ユーザーやユーザーのデバイスに適した表示が行われます。

2.6 アプリケーションのライフサイクル

ADFモバイル・アプリケーションのライフサイクルは、モバイル・デバイスのオペレーティング・システム、JVMおよびADFモバイルのレベルで発生するイベントによって駆動されます。これらのイベントに対するアプリケーションのリアクションは、LifeCycleListenerのメソッドを使用することで有効化されます。詳細は、第5.6項「ライフサイクル・イベント・リスナーについて」を参照してください。

2.7 サンプル・アプリケーション

デプロイメント環境の設定(第3章「ADFモバイル環境の設定」を参照)が完了したら、使用するデプロイメント・コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルにあるADFモバイルのサンプル・アプリケーションを実行できます。

サンプル・アプリケーションは次の方法を示しています。

- 基本的なHelloWorld ADFモバイル・アプリケーションの作成方法。

- アプリケーションがライフサイクル・イベントに反応できるようにする方法。

- スキニングの使用方法。

- ADFモバイルAMXアプリケーション機能の開発方法(ユーザー・インタフェース、ページ間のナビゲーション、マネージドBean、データ変更イベントなど)。

詳細は、付録E「サンプルのADFモバイル・アプリケーション」を参照してください。

2.8 ADFモバイルAMXアプリケーション機能

ADFモバイルAMXは、基本的にADFモバイル内のサブフレームワークで、iOSとAndroidの両方のユーザー操作で適切に動作するアプリケーション機能が作成可能になる一連のレイアウト、フィールド、データ・コンポーネントを提供しています。ADFモバイルAMXは、次のレイヤーに属するいくつかのOracle ADFコンポーネント、データ・コントロール、バインディング、式言語をサポートしています。

- モデル・レイヤー。第9章「バインディングの使用とデータ・コントロールの作成」を参照してください。

- ユーザー・インタフェース(UI)レイヤー。次の章を参照してください。

- 第7章「ADFモバイルAMXページの作成」

- 第8章「ADFモバイルAMXユーザー・インタフェースの作成」

- 式言語。第9.2項「ELのサポートの理解」を参照してください。

モバイル・アプリケーションとWebアプリケーションとは本質的に異なるため、すべてのレイヤーに違いがあります。詳細は、第2.9項「ADFモバイルとサーバー・ベースのOracle ADFとの比較」を参照してください。

2.9 ADFモバイルとサーバー・ベースのOracle ADFとの比較

表2-1では、ADFモバイルによってサポートされる機能、コンポーネント、テクノロジをまとめ、サーバー・ベースのOracle ADFアプリケーションによってサポートされる内容と比較しています。

表2-1 ADFモバイルとサーバー・ベースのOracle ADFアプリケーションとの違い

レイヤー

ADFモバイルによってサポートされる内容

サーバー・ベースのOracle ADFによってサポートされる内容

ADFモデル

- SOAP、REST XMLおよびREST JSONベースのデータ・ソースとデータ・コントロール

- モデル・レイヤーのJavaのサブセット (たとえば、Java Webサービス・プロキシに対するサポートはありません)

- JDBC

データ・ソースとデータ・コントロールの全範囲

ビュー

- ローカルでレンダリングされたADFモバイルAMXまたはカスタムのHTML5ページ

- サーバーでレンダリングされたHTMLページ

- サーバーでレンダリングされたもののみ

- ADF Facesリッチ・クライアントおよびTrinidad JSFコンポーネント

コントローラ

ADFモバイルAMXアプリケーション機能の場合(第2.8項「ADFモバイルAMXアプリケーション機能」を参照):

- Oracle ADFタスク・フロー・コンポーネントのサブセット

- モバイル・デバイスに存在するロジック

完全なADFタスク・フロー

Javaサポート

JavaME CDCおよびJava 1.4

最新のJavaによるJava EE

表2-1に示すように、ADFモバイルでは、ビュー・レイヤーで、ユーザー・インタフェースの表示のためにローカルでレンダリングされたビューを使用するのか、サーバーでレンダリングされたビューを使用するのかを選択できます。ADFモバイルAMXでは、最もシームレスなユーザー・インタフェースを使用できます。サーバー・ベースのOracle ADFの場合、ユーザー・インタフェースはサーバー上でレンダリングされ、主にADF Facesリッチ・クライアント・コンポーネントまたはTrinidadコンポーネントを使用して提供されます。これらは両方ともJSFテクノロジに基づいています。

コントローラ・レイヤーでは、モバイル・アプリケーションでADFモバイルAMXコンテンツが使用されると、コンポーネントのサブセットをサポートするADFタスク・フローの短縮版が提供されます。ADFモバイルのタスク・フローでは、ビュー、制御フロー・ケース、ワイルド・カード、ワイルドカード制御フロー・ケース、メソッド・コールおよびルーターがサポートされますが、リージョンはサポートされません。ADFモバイルでは、ページ・フロー・ロジック全体がモバイル・デバイスに存在しているため、サーバーにラウンドトリップすることなくページのナビゲーションを行うことができます。

ADFモバイルは、ADFモデル・レイヤーで、SOAP、REST XMLおよびREST JSONをサーバー側のデータ・ソースとしてサポートします。また、ADFモバイルは、ローカル・データベースへのJDBC接続とAPIをサポートしますが、ADFビジネス・コンポーネントはサポートしません。さらに、ADFモバイルは、サーバー・ベースのADFによってサポートされるJavaメソッドをすべて実装するわけではありません。たとえば、プログラムによるアクセス・バインディング・コンテキストは使用できません。そのかわり、式言語(EL)の式を呼び出すことで、バインディング・データにアクセスできます。また、ADFモバイルは、WebサービスにプログラムによってアクセスするためにWebサービスのJavaプロキシをサポートしていないので、データ・コントロールをWebサービス起動ヘルパー・クラスと組み合せて使用する必要があります。

Javaのサポートのために、ADFモバイルの埋込みJava仮想マシンはJavaME CDC仕様に従っています。この仕様はJava 1.4に基づいているため、Java 1.5以上の機能はJavaコード内で使用できません。

第II部

はじめに

ADFモバイル・アプリケーションの開発のための開発環境の設定方法について説明し、ADFモバイル・アプリケーションの作成手順を示します。

第II部は、次の章で構成されています。

- 第3章「ADFモバイル環境の設定」

- 第4章「ADFモバイル・アプリケーション開発の開始」

3 ADFモバイル環境の設定

この章では、アプリケーションの開発とデプロイのためのADFモバイル環境の設定方法について説明します。

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

- 第3.1項「ADFモバイル環境の概要」

- 第3.2項「ADFモバイル・アプリケーション開発の前提条件」

- 第3.3項「JDeveloperの設定」

- 第3.4項「iOSプラットフォーム用の開発ツールの設定」

- 第3.5項「Androidプラットフォーム用の開発ツールの設定」

3.1 ADFモバイル環境の概要

ADFモバイル・アプリケーションを開発する前に、様々なソフトウェア・コンポーネントをダウンロード、インストールおよび構成することで、開発環境を設定する必要があります。

3.2 ADFモバイル・アプリケーション開発の前提条件

ADFモバイル・アプリケーション開発の前提条件は、実行を計画している作業のタイプや、ターゲットのプラットフォームによって異なります。

- アプリケーションの作成に必要なもの

- ADFモバイル・アプリケーションを開発環境にデプロイするために必要なもの

3.2.1 アプリケーションの作成に必要なもの

iOS用のADFモバイル・アプリケーションの作成を開始する(第4章「ADFモバイル・アプリケーション開発の開始」を参照)前に、次のコンポーネントが使用可能であることを確認します。

- Mac OS 10.6.7以降を実行するコンピュータ

- Xcode 4.2以上(http://developer.apple.com/xcode/および第3.4.2項「Xcodeを準備する方法」を参照)

- iOS SDKバージョン5以上(http://developer.apple.com/devcenter/ios/を参照)

- Apple Developer ID

- Oracle JDeveloper (第3.3項「JDeveloperの設定」および第3.4.1項「iOS開発のためのJDeveloperの構成方法」を参照)

- ADFモバイル用のOracle JDeveloper拡張機能(第3.3項「JDeveloperの設定」を参照)

詳細は、第3.4項「iOSプラットフォーム用の開発ツールの設定」を参照してください。

ターゲット・プラットフォームがAndroidの場合は、次が必要です。

- Platform 2.3以上のAndroid SDKとそのツール(http://developer.android.com/sdk/を参照)

- Oracle JDeveloper (第3.3項「JDeveloperの設定」および第3.5.1項「Android開発のためのJDeveloperの構成方法」を参照)

- ADFモバイル用のOracle JDeveloper拡張機能(第3.3項「JDeveloperの設定」を参照)

詳細は、第3.5項「Androidプラットフォーム用の開発ツールの設定」を参照してください。

特定タイプのADFモバイル・アプリケーション・コンテンツ(HTML、リモートURLまたはADFモバイルAMX)を作成するために、追加のツールをインストールする必要はありません。詳細は、第5.9項「アプリケーション機能のコンテンツ・タイプの定義」を参照してください。

3.2.2 ADFモバイル・アプリケーションを開発環境にデプロイするために必要なもの

ADFモバイル・アプリケーションをデプロイする(第4章「ADFモバイル・アプリケーション開発の開始」を参照)前に、次のコンポーネントが使用可能であることを確認します。

- 第3.2.1項「アプリケーションの作成に必要なもの」にリストされているすべてのコンポーネント

- ADFモバイル・アプリケーション

- 各種ログイン資格証明詳細は、第16章「ADFモバイル・アプリケーションのデプロイ」を参照してください。

3.3 JDeveloperの設定

開発環境を設定するには、最初にOracle JDeveloperとそのADFモバイル拡張機能をインストールします。

始める前に:

Oracle JDeveloperをダウンロードしてインストールします。要求されたら、「Studio開発者(すべての機能)」ロールを選択します。

詳細は、Oracle Fusion Middleware Oracle JDeveloperインストレーション・ガイドを参照してください。ターゲット・プラットフォームがiOSの場合は、『Oracle Fusion Middleware Oracle JDeveloperインストレーション・ガイド』のMac OS Xプラットフォーム上のOracle JDeveloperの使用方法に関する項を参照してください。

ADFモバイル拡張機能をダウンロードしてインストールするには:

1. JDeveloperで、「ヘルプ」、「更新のチェック」の順に選択して、「次へ」をクリックします。

注意:

プロキシ設定を構成する必要がある場合は、メイン・メニューから「ツール」→「プリファレンス」を選択し、「プリファレンス」ダイアログの左側のツリーから「Webブラウザとプロキシ」を選択します。

2. 図3-1に示す「ソース」ページで、公式のOracle拡張機能と更新を選択して、「次へ」をクリックします。

図3-1 JDeveloperでの更新のチェック

3. 「更新」ダイアログで、「ADFモバイル」の更新を選択します。

4. 図3-2に示す「ライセンス契約」ページで、Oracleモバイルに関するOracleテクノロジ・ネットワーク・ライセンス条項を確認します。

注意:

Oracle ADFモバイル・プログラムに関するすべてのライセンス条項と使用条件に同意する必要があります。Oracle ADFモバイル・プログラムには、http://www.oracle.com/technetwork/indexes/downloads/index.htmlでアクセスできます。

5. 「同意する」をクリックします。

図3-2 Oracle ADFモバイル・プログラムのライセンス契約

6. 「次へ」を選択して「終了」をクリックします。

7. JDeveloperを再起動します。

8. JDeveloperにADFモバイルが正しく追加されていることを確認します。

- メイン・メニューから「ファイル」→「新規」を選択して、「新規ギャラリ」を開きます。

- 「すべての機能」タブを選択します。

- 「カテゴリ」ペインで、「クライアント層」ノードを開き、「ADFモバイル」が含まれていることを確認します(図3-3参照)。

図3-3 ADFモバイルのインストールの確認

さらに、正しいバージョンのADFモバイルがインストールされていることを確認します。このためには、メイン・メニューから「ヘルプ」→「バージョン情報」を選択して、「Oracle JDeveloperのバージョン情報」ダイアログで「拡張」タブを選択し、「ADFモバイル」までスクロールして拡張機能リストのエントリを調べます(図3-4参照)。

図3-4 ADFモバイル・バージョンの確認

プラットフォーム固有の情報は、次の項を参照してください。

- 第3.4.1項「iOS開発のためのJDeveloperの構成方法」

- 第3.5.1項「Android開発のためのJDeveloperの構成方法」

3.3.1 プラットフォームとフォーム・ファクタに応じた開発環境の構成方法

ADFモバイル・アプリケーションの開発を開始する前に、該当するプラットフォーム(第3.3.1.2項「ターゲット・プラットフォームに応じた環境の構成」を参照)とフォーム・ファクタ(see 第3.3.1.1項「フォーム・ファクタに応じた環境の構成」を参照)に対応するJDeveloperプリファレンスを構成する必要があります。

3.3.1.1 フォーム・ファクタに応じた環境の構成

フォーム・ファクタとは特定のデバイス構成のことです。各フォーム・ファクタは指定した名前で識別され、ここには、ピクセル単位の幅と高さで表された指定解像度に関する情報が含まれています。

プリファレンスで定義されたフォーム・ファクタは、「ADFモバイルAMX」ページの「プレビュー」タブで使用されます(第7.3.2.2項「「プレビュー」の使用方法」を参照)。様々なフォーム・ファクタを選択したり切り替えたりすると、各フォーム・ファクタで「ADFモバイルAMX」ページをレンダリングする方法を確認できます。分割画面ビューを使用すると、同じページに適用された複数のフォーム・ファクタを確認することもできます。

始める前に:

第3.3項「JDeveloperの設定」の説明に従って、JDeveloperとADFモバイル拡張機能をダウンロードしてインストールします。

フォーム・ファクタを構成するには:

1. JDeveloperのメイン・メニューから「ツール」→「プリファレンス」を選択して、「プリファレンス」を開きます。

2. 「プリファレンス」ダイアログ(図3-5を参照)で、左側のツリーから「ADFモバイル」を選択します。

図3-5 フォーム・ファクタの定義

「ADFモバイル」ページにはデフォルト設定が移入されています。

このプリファレンス・ページでは、画面解像度サイズとプラットフォームを結合する一連の名前付きフォーム・ファクタを作成して管理できます。

3. 新しいフォーム・ファクタを作成するには、「新規」をクリックして、次の項目を設定します。

- 名前: フォーム・ファクタの識別に使用する意味のある文字列。

- プラットフォーム: モバイル・デバイスのプラットフォーム。

- モデル: モバイル・デバイスのタイプ。

- デフォルトの向き: 「ADFモバイルAMX」ページの「プレビュー」タブで使用されるデバイスのデフォルトの向き。「縦」または「横」です。この設定は値のドロップダウン・リストから選択します。デフォルト値は「縦」で、新しいフォーム・ファクタの作成時にはこの値が移入されます。

- 解像度の幅: ピクセル単位で表された幅。値は正の整数である必要があり、入力は検証されます。

- 解像度の高さ: ピクセル単位で表された高さ。値は正の整数である必要があり、入力は検証されます。

- スケール係数: 表示のスケール係数。この値は、1.0、2.0、3.0のいずれかにする必要があります。

注意:

フォームに名前と解像度が設定されていない場合、ADFモバイルからエラー・メッセージが表示されます。

4. デフォルト設定に戻す必要がある場合は、「その他のアクション」→「デフォルトに戻す」をクリックします。

5. 「OK」をクリックして、設定を終了します。

3.3.1.2 ターゲット・プラットフォームに応じた環境の構成

ADFモバイルによってサポートされるいずれかのプラットフォームに対する開発を開始するには、プラットフォームの名前や、プラットフォーム固有のツールやデータを格納するための開発用コンピュータ上のディレクトリなどの情報を、JDeveloperに提供する必要があります。

始める前に:

第3.3項「JDeveloperの設定」の説明に従って、JDeveloperとADFモバイル拡張機能をダウンロードしてインストールします。

ターゲット・プラットフォームに応じた開発環境を構成するには:

1. JDeveloperのメイン・メニューから「ツール」→「プリファレンス」を選択して、「プリファレンス」を開きます。

2. 「プリファレンス」ダイアログ(図3-5を参照)で、ツリーから「ADFモバイル」を選択します。開いた「ADFモバイル」ページには、デフォルトのフォーム・ファクタ設定が移入されています。

3. ツリーから「プラットフォーム」を選択して「ADFモバイル: プラットフォーム」ページを開きます。このページには、サポートされるプラットフォームのパスと構成パラメータが含まれています(図3-6および図3-7を参照)。
各プラットフォーム固有のページには、プラットフォームSDK (AndroidまたはiOS)のプリファレンスが表示されます。ここには、ADFモバイルがAndroidまたはiOSプロジェクトのコンパイルおよびデプロイのために必要とするパスなどの必要情報が集められています。

- サポートされるプラットフォームのリストから「Android」を選択した場合は、コンピュータ上のAndroid SDKの場所とターゲットのAndroidプラットフォームのローカル・ディレクトリを指定し、署名資格証明に関する情報を入力します(図3-6を参照)。

図3-6 Androidプラットフォームのプリファレンスの構成

- サポートされるプラットフォームのリストから「iOS」を選択した場合(図3-7を参照)は、次の項目を指定します。

- Mac OSコンピュータ上のiOSシミュレータSDKの場所

- Xcodebuildユーティリティの場所(第16.4.1項「iOSシミュレータへのiOSアプリケーションのデプロイ方法」を参照)

- iTunesメディア・ファイルの場所(iOSデバイスに同期化されるモバイル・アプリケーションを含む)

- iOSデバイスの署名情報(第16.2.4.2項「デバイス署名オプションの設定」を参照)

図3-7 iOSプラットフォームのプリファレンスの構成

3.4 iOSプラットフォーム用の開発ツールの設定

iOSプラットフォーム用のADFモバイル・アプリケーションの開発に向けて準備を行う場合には、第3.2.1項「アプリケーションの作成に必要なもの」に示した一般目的のツールに加えて、iPhoneまたはiPadの設定を行う場合もあります(第3.4.3項「iPhoneまたはiPadの設定方法」を参照)。

iOS SDKインストール内にはiPhoneおよびiPadのシミュレータが含まれているので、これらを別途インストールする必要はありません。詳細は、第3.4.4項「iPhoneまたはiPadシミュレータの設定方法」を参照してください。

3.4.1 iOS開発のためのJDeveloperの構成方法

第3.2.1項「アプリケーションの作成に必要なもの」にリストされているコンポーネントをインストールしたら、JDeveloperでこれらを使用できるように構成する必要があります。

iOS開発のためにJDeveloperを構成するには:

1. JDeveloperで、メイン・メニューから「ツール」→「プリファレンス」→「ADFモバイル」を選択します。

2. 「プリファレンス」ページで、「プラットフォーム」を指定します。詳細は、図3-7「iOSプラットフォームのプリファレンスの構成」および第3.3.1.2項「ターゲット・プラットフォームに応じた環境の構成」を参照してください。

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

3.4.2 Xcodeを準備する方法

Xcodeをインストールしたら、少なくとも1回はこれを実行して、Appleのライセンスおよび設定ダイアログに入力を行う必要があります。これらの手順を実行していない場合、JDeveloperからXcodeまたはデバイス・シミュレータへの構築およびデプロイ・サイクルが、「リターン・コード: 69」エラーによって失敗します。

3.4.3 iPhoneまたはiPadの設定方法

ADFモバイル・アプリケーションの開発およびデプロイメントでは、iPhone、iPadまたはこれらのシミュレータのいずれかを使用できます(第3.4.4項「iPhoneまたはiPadシミュレータの設定方法」を参照)。テストには実際のiPhoneまたはiPadを使用することをお薦めしますが(第18.2項「ADFモバイル・アプリケーションのテスト」を参照)、この場合は、iPhoneまたはiPadをコンピュータと接続して、2つのデバイス間のリンクを確立する必要があります。

iOSデバイスにデプロイするには、有効なライセンス、資格証明および配布プロファイルを備えたiOSデバイスを用意する必要があります。詳細は、第16章「ADFモバイル・アプリケーションのデプロイ」を参照してください。

3.4.4 iPhoneまたはiPadシミュレータの設定方法

ADFモバイル・アプリケーションの開発およびデプロイメントでは、iOSデバイス自体を使用するか(第3.4.3項「iPhoneまたはiPadの設定方法」を参照)、そのシミュレータを使用できます。通常、シミュレータへのデプロイはデバイスへのデプロイよりはるかに高速で、最初にアプリケーションに署名する必要もありません。

シミュレータは自動的に起動できます。追加の設定は必要ありません。

注意:

JDeveloperからデバイス・シミュレータにアプリケーションをデプロイする前に、まずシミュレータを実行する必要があります。

アプリケーションでWebサービスを使用する予定で、企業のファイアウォールで保護されている環境の場合は、外部ネットワーク・アクセスを構成する必要がある可能性があります。このためには、開発用コンピュータのシステム・プリファレンスでネットワーク設定を変更します。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のブラウザ・プロキシ情報の設定に関する項を参照してください。

3.5 Androidプラットフォーム用の開発ツールの設定

Androidプラットフォーム用のADFモバイル・アプリケーションの開発に向けて準備を行う場合には、第3.2.1項「アプリケーションの作成に必要なもの」に示した一般目的のツールに加えて、Androidデバイスの設定を行う場合もあります(第3.5.3項「Androidデバイスの設定方法」を参照)。

エミュレータはAndroid SDKインストールに含まれているので、これらを別途インストールする必要はありません。ただし、構成を作成するまでエミュレータは使用できません。詳細は、第3.5.4項「Androidエミュレータの設定方法」を参照してください。

Androidプラットフォーム用の開発を行う場合、JDeveloperとAndroidの両方でサポートされるオペレーティング・システムはどれでも使用できます。

詳細は、Android開発者のWebサイト(http://developer.android.com/tools/index.html)を参照してください。

3.5.1 Android開発のためのJDeveloperの構成方法

第3.2.1項「アプリケーションの作成に必要なもの」にリストされているコンポーネントをインストールして構成したら、JDeveloperでこれらを使用できるように構成する必要があります。

Android開発のためにJDeveloperを構成するには:

1. 第3.3項「JDeveloperの設定」および第3.3.1項「プラットフォームとフォーム・ファクタに応じた開発環境の構成方法」に示されているAndroidに関連する手順を実行します。

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

3.5.2 Android SDKのインストール方法

Android SDKには、Androidデバイス用のアプリケーションを構築するために必要な開発ツールが含まれています。Android SDKはモジュラなので、ターゲットのAndroidプラットフォームとアプリケーションの要件に応じてコンポーネントを個別にダウンロードできます。

プラットフォームを選択するときには、ADFモバイルがAndroid 2.3以上をサポートしていることに注意します。

始める前に:

使用している環境が、http://developer.android.com/sdk/index.htmlにリストされているオペレーティング・システム、JDKバージョンおよびハードウェア要件と適合していることを確認します。

注意:

Ant、EclipseおよびLinuxの要件は、ADFモバイルの開発環境には適用できません。

Android SDKをインストールするには:

1. http://developer.android.com/sdk/index.htmlから、Android SDKスターター・パッケージをダウンロードします。

2. http://developer.android.com/sdk/installing.htmlに示されている手順に従って、インストールを実行します。ADFモバイル・アプリケーションの開発ではEclipseの構成は必要ないので、Android SDKのインストール手順の手順3はスキップします。

3.5.3 Androidデバイスの設定方法

ADFモバイル・アプリケーションの開発およびデプロイメントでは、Androidデバイス自体を使用(テストにはこちらをお薦めします。第18.2項「ADFモバイル・アプリケーションのテスト」を参照)するか、エミュレータを使用(第3.5.4項「Androidエミュレータの設定方法」を参照)できます。

Androidデバイスの設定方法の詳細は、Android開発者のWebサイト(http://developer.android.com/tools/device.html)の「Using Hardware Devices」にある手順を参照してください。

注意:

デバイス・ベースのデバッグのためにUSB接続を使用している場合、問題が発生する可能性があります。詳細は、第18章「ADFモバイル・アプリケーションのテストとデバッグ」を参照してください。

ターゲットのAndroidデバイスがUSBデバイス・ドライバの.infファイル内にリストされていない場合、Androidデバッグ・ブリッジ(ADB)のインストールに失敗してしまいます。この問題の回避方法は次のとおりです。

1. 使用しているデバイスの正しい値を見つけます。

2. android_winusb.infファイルの[Google.NXx86]および[Google.NTamd64]セクションを更新します。

詳細は、http://developer.android.com/sdk/win-usb.htmlを参照してください。

3.5.4 Androidエミュレータの設定方法

ADFモバイル・アプリケーションの開発およびデプロイメントでは、Androidデバイス自体を使用するか(第3.5.3項「Androidデバイスの設定方法」を参照)、そのエミュレータを使用できます。通常、エミュレータへのデプロイはデバイスへのデプロイよりはるかに高速で、最初にアプリケーションに署名する必要もありません。

Android Virtual Device (AVD)と呼ばれるエミュレータ構成の作成方法の詳細は、Android開発者のWebサイト(http://developer.android.com/tools/devices/index.html)の「Managing Virtual Devices」にある手順を参照してください。

アプリケーションをテストする予定のAndroidプラットフォームごとに、AVDを作成する必要があります。

エミュレータの使用方法の詳細は、Android開発者のWebサイト(http://developer.android.com/tools/devices/emulator.html)の「Using the Android Emulator」を参照してください。

3.5.4.1 エミュレータの状態の保存

エミュレータの状態を保存して保存した状態を再利用できると、便利な場合もあります。このためには、(Windowsコンピュータ上の)C:\Users\username\.android\avdディレクトリにあるavdファイルまたはフォルダを操作します。各avdフォルダには、userdata.img、userdata.qemu.img、cache.imgなどの複数のファイルが格納されています。cache.imgファイルを別のエミュレータのavdフォルダにコピーして、その状態を別のエミュレータで使用できます。あるいは、コマンドラインから表3-1に示したコマンドを実行することもできます。

表3-1 Androidエミュレータ状態の保存のためのコマンド

コマンド

説明

-snapstorage <file>

すべてのエミュレータ状態のスナップショットが格納されているファイル。

デフォルト値: datadir/snapshots.img

-no-snapstorage

スナップショットのストレージ・ファイルがマウントされないようにすることで、すべてのエミュレータ状態のスナップショット機能を無効化します。

-snapshot <name>

ストレージ・ファイル内のエミュレータ状態のスナップショットの名前(自動起動および自動保存用)。

デフォルト値: default-boot

-no-snapshot

自動保存を実行せずにフル・ブートを実行します。vmloadおよびvmsaveはsnapstorageで機能します。

-no-snapshot-save

終了時にスナップショットへの自動保存を行いません。変更された状態は破棄されます。

-snapshot-list

使用可能なスナップショットのリストを表示します。

-no-snapshot-update-time

リストア時にスナップショット・タイムの修正を行いません。

-wipe-data

使用データ・イメージをinitdataからコピーすることでリセットします。

たとえば、testsnapスナップショットに保存されている状態を使用して、終了時に自動保存によって保存しなおす場合には、C:\Android\android sdk directory\tools>から次のコマンドを実行します。

emulator -avd Android_2.2_1 -snapshot testsnap

注意:

このユーティリティを使用する場合、ロード・プロセスを実行すると、システムのすべてのコンテンツ(ユーザー・データやSDカードのイメージを含む)が、スナップショット作成時に保存されたコンテンツによって上書きされるので注意してください。別のスナップショットに保存していないと、変更内容はすべて失われてしまいます。

3.5.4.2 SDカードの作成、保存および再使用

SDカードを作成、保存および再使用するには、次のコマンドを実行します。

- SDカードを作成するコマンドは次のとおりです。

C:\android sdk directory\tools>mksdcard -l SD500M 500M C:\Android\sd500m.img

- 既存のAVDをリストするコマンドは次のとおりです。

C:\android sdk directory\tools>android list avd

これによって、次のようなリストが生成されます。

Name: Android_2.2_1
Path: C:\Users\username\.android\avd\Android_2.2_1.avd
Target: Android 2.2 (API level 8)
Skin: WVGA800
Sdcard: 200M
------------
Name: Android_2.3.1
Path: C:\Users\username\.android\avd\Android_2.3.1.avd
Target: Android 2.3.1 (API level 9)
Skin: WVGA800
------------
Name: Android_2.3.3
Path: C:\Users\username\.android\avd\Android_2.3.3.avd
Target: Android 2.3.3 (API level 10)
Skin: WVGA800
------------
Name: Android_3.0
Path: C:\Users\username\.android\avd\Android_3.0.avd
Target: Android 3.0 (API level 11)
Skin: WXGA

- 作成したSDカードによってAndroid_2.2_1を起動するコマンドは次のとおりです。

C:\Android\android sdk directory\tools>emulator -avd Android_2.2_1 -sdcard C:\Android\sd500m.img

- 実行中のAndroidエミュレータ・インスタンスをリストするコマンドは次のとおりです。

C:\Android\android sdk directory\platform-tools>adb devices

- テスト・イメージをSDカードにコピーするコマンドは次のとおりです(この場合、エミュレータを再起動する必要があります)。

C:\Android\sdk\platform-tools>adb push test.png sdcard/Pictures
85 KB/s (1494 bytes in 0.017s)

3.5.4.3 ネットワークの構成

Androidエミュレータからは、10.0.2.2 IPを経由して、ホスト・コンピュータにアクセスできます。ホスト・コンピュータからエミュレータに接続するには、開発用コンピュータのコマンドラインまたはスクリプトからadbコマンドを実行して、ポート・フォワーディングを設定する必要があります。

ソケット接続を転送するには、次のコマンドを実行します。

adb forward local remote

この際、次の転送仕様を使用します。

- tcp:port

- localabstract:unix domain socket name

- localreserved:unix domain socket name

- localfilesystem:unix domain socket name

- dev:character device name

- jdwp:process pid (リモートのみ)

たとえば、任意のクライアントが次のように、ポート55000のエミュレータで実行されているサーバーへの接続をリクエストできます。

adb -e forward tcp:8555 tcp:55000

この例では、ホスト・コンピュータから、クライアントはlocalhost:8555に接続し、そのソケットを介して通信を行います。

詳細は、Android開発者のWebサイト(http://developer.android.com/tools/help/adb.html)の「Android Debug Bridge」を参照してください。

3.5.4.4 ネットワーク・プロキシの構成

開発用コンピュータが企業のファイアウォールで保護されている場合は、次のコマンドを実行してエミュレータを起動し、ブラウザとの接続を開始する必要がある可能性があります。

emulator -avd myavd -http-proxy myproxy

4 ADFモバイル・アプリケーション開発の開始

この章では、Oracle JDeveloperのウィザードおよびツールを使用して基本的なADFモバイル・アプリケーションを作成する方法を説明します。さらに、アプリケーションの作成時に自動的に生成されるアーティファクトについても説明します。

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

- 第4.1項「ADFモバイル・アプリケーションの宣言的な開発の概要」

- 4.2項「アプリケーション・ワークスペースの作成」

4.1 ADFモバイル・アプリケーションの宣言的な開発の概要

JDeveloperの設計操作性が拡張され、ADFモバイル・アプリケーション開発をサポートするようになったため、コード行を記述せずにADFモバイル・アプリケーションを作成、デプロイおよびテストできるようになりました。

4.2 アプリケーション・ワークスペースの作成

ADFモバイル拡張機能により、JDeveloperには、基本ファイルによって完全なプロジェクトをシードするアプリケーション・テンプレートが提供されています。ADFモバイル・アプリケーションを構築する最初の手順は、名前の割当てと、ソース・ファイルを保存するディレクトリの指定です。JDeveloperに用意されているアプリケーション・テンプレートを使用してアプリケーションを作成すると、ワークスペースが必要な構成ファイルとともに自動的に編成され、プロジェクトに含められます。

4.2.1 ADFモバイル・アプリケーション用のワークスペースの作成方法

アプリケーションの作成ウィザードを使用して、アプリケーションを作成します。

始める前に:

ADFモバイル・アプリケーション拡張機能をダウンロードする必要があります。詳細は、第3.3項「JDeveloperの設定」して参照してください。すべてのターゲット・プラットフォームに対して、ADFモバイル・アプリケーション拡張機能をダウンロードおよび構成する必要がある場合もあります。ネイティブ機能(オペレーティング・システムのネイティブ・コントロールとの統合機能)を含む複雑なアプリケーションでは、追加でSHLIB_PATHおよびCLASSPATH変数が必要になる場合があります。

ADF Mobileアプリケーションを作成するには、次を実行します。

1. 「ファイル」→「新規」→「モバイル・アプリケーション(ADF)」を選択します(図4-1を参照)。

図4-1 ADFモバイル・アプリケーション・テンプレートの選択

2. 図4-2に示すMobileApplicationのように、「アプリケーション名」フィールドにアプリケーションの名前を入力します。必要に応じて、「ディレクトリ」フィールドにプロジェクトの新しい場所を入力します。「アプリケーション・パッケージの接頭辞」フィールドに接頭辞を入力することで、アプリケーション・パッケージが一意となるようにします。「次へ」をクリックします。
アプリケーションは、ADFモバイル・アプリケーションの最上位構造になります。アプリケーションは、このウィザードの後続ページで定義する様々なプロジェクト層をまとめます。

図4-2 ADFモバイル・アプリケーションの名前付け

3. プロジェクト1の名前ページで、必要に応じて、アプリケーション・コントローラ・プロジェクトの名前と場所を変更します(図4-3を参照)。変更しない場合は、プロジェクトのデフォルト名、ApplicationControllerをそのまま使用します。このページの「プロジェクトの機能」ウィンドウには、アプリケーション・コントローラ・プロジェクトで使用できるテクノロジがリストされます。
このプロジェクトにはアプリケーション全体のリソースがすべて格納されます。詳細は、表4-1を参照してください。

図4-3 アプリケーション・コントローラ・プロジェクトとそのプロジェクト機能

4. 「次へ」をクリックして、アプリケーション・コントローラ・プロジェクトのJava設定ページ(図4-4に示すプロジェクト1のJava設定)を表示します。アプリケーション・コントローラ・プロジェクトのデフォルトのパッケージ名(application)と、Java SOURCEPATHディレクトリ(src)およびJava出力ディレクトリ(classes)の場所を、そのまま使用するか変更します。

図4-4 アプリケーション・コントローラ・プロジェクトのJava設定の構成

5. 「次へ」をクリックして、プロジェクト2の名前ページに移動します。ここでは、必要に応じて、ビュー・コントローラ・プロジェクトの名前を変更できます。このページの「プロジェクトの機能」ウィンドウ(図4-5を参照)には、ADFモバイルのビュー・コントローラ・プロジェクトで使用できるテクノロジがリストされます。ビュー・コントローラ・プロジェクト内で作成されるアーティファクトの詳細は、表4-2を参照してください。

図4-5 ADFモバイルのビュー・コントローラ・プロジェクト

6. 「次へ」をクリックします。ビュー・コントローラ・プロジェクトのJava設定ページ(図4-6を参照)で、アプリケーション・コントローラ・プロジェクトのデフォルトのパッケージ名(mobile)と、プロジェクトのJava SOURCEPATHディレクトリ(src)およびJava出力ディレクトリ(classes)の場所を、そのまま使用(または変更)します。

図4-6 ビュー・コントローラ・プロジェクトのJava設定

7. 「終了」をクリックして、ADFモバイル・アプリケーションとそのプロジェクトの作成を完了します。

ヒント:

前述の手順に従ったADFモバイル・アプリケーションの作成に加え、(使用している開発用コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルにある)HelloWorldサンプル・アプリケーションを開き、アプリケーション作成ウィザードの完了後にJDeveloperによって生成されたアーティファクトを表示できます。

4.2.2 ADFモバイル・アプリケーション作成時の処理

ADFモバイル・アプリケーション・プロジェクトが完成すると、JDeveloperによってアプリケーション・レベルおよびプロジェクト・レベルのアーティファクトが追加されます。これらには、「アプリケーション・ナビゲータ」(図4-7を参照)からアクセスできます。さらに、JDeveloperは、DeviceFeaturesデータ・コントロールを作成します。このデータ・コントロールによってPhoneGap Java APIが抽象化され、ADFモバイルAMXとして実装されているアプリケーション機能は、デバイスに埋め込まれている様々なサービスにアクセスできるようになります。さらにJDeveloperは、ApplicationFeaturesデータ・コントロールも作成します。これによってSpringboardページの構築が可能になります。DeviceFeaturesデータ・コントロールによって提供される操作を「ADFモバイルAMX」ページにドラッグ・アンド・ドロップすることで(第9.5項「DeviceFeaturesデータ・コントロールの使用方法」を参照)、デバイスに格納されたユーザーのコンタクト先を管理したり、電子メールとSMSテキスト・メッセージを作成して送信したり、デバイスの場所を突きとめたり、デバイスのカメラを使用したり、デバイスのファイル・システムに格納されたイメージを取得したりする機能を追加します。

図4-7 JDeveloperによって生成されるADFモバイル・アプリケーションのアーティファクト

4.2.2.1 アプリケーション・レベルのリソースについて

JDeveloperは、アプリケーション・コントローラ・プロジェクト内にADFモバイル・アプリケーション用のファイルを生成します。これらのファイル(表4-1を参照)には、ADFモバイル・アプリケーションのメタデータを記述するための構成ファイルが含まれています。これらのファイルには、「アプリケーション・ナビゲータ」の「アプリケーション・リソース」ペインからアクセスします(図4-8を参照)。

図4-8 「アプリケーション・リソース」ペインからアクセスされるモバイル・アプリケーション・アーティファクト

アプリケーション・コントローラ・プロジェクトにはアプリケーション全体のリソースが格納されており、ADFモバイル・アプリケーションのプレゼンテーション・レイヤーを提供しています。ここには、モバイル・デバイスでのアプリケーションの表示方法を構成するためのメタデータ・ファイルが含まれています。このプロジェクトはADFモバイル・アプリケーションのセキュリティを指定しており、アプリケーションのログイン・ページ、アプリケーション全体のリソースを含むことができます。アプリケーション・コントローラ・プロジェクトは、本質的には、アプリケーション機能とそのコンテンツを定義するビュー・コントローラ・プロジェクトのコンシューマです。詳細は、第4.2.2.2項「ビュー・コントローラ・プロジェクトについて」を参照してください。

表4-1 アプリケーション・リソースを介してアクセスされるモバイル・アプリケーション・レベルのアーティファクト

アーティファクト

ファイルの場所

説明

adfmf-application.xml

application workspace_directory\.adf\Meta-INF

たとえば、次のようになります。

JDevloper\mywork\Mobile Application\.adf\META-INF

ADFモバイル・アプリケーションを定義できるようにする、スタブXMLアプリケーションの識別子ファイル。ADF Fusion Webアプリケーションのアプリケーション識別子と同様に、このファイルによって、アプリケーションのコンテンツ、ナビゲーション動作およびユーザー認証要件を定義できます。詳細は、第5.2項「モバイル・アプリケーションの構成ファイルについて」を参照してください。

adfmf-config.xml

application workspace_directory\.adf\Meta-INF

たとえば、次のようになります。

JDeveloper\mywork\Mobile Application\.adf\META-INF

ADFモバイル・アプリケーションに使用されるデフォルト・スキンの構成に使用されます。詳細は、第5.11項「ADFモバイル・アプリケーションのスキニング」を参照してください。

アプリケーション・イメージ

application workspace_directory\Application Resources\resources\ios

たとえば、次のようになります。

JDeveloper\mywork\Mobile Application\resources\ios

iOSおよびAndroidアプリケーションのデプロイメントに必要とされる一連のイメージ。ここには、アプリケーション・アイコンやスプラッシュ画面のPNGイメージも含まれます。iPhoneなどのiOSデバイスへのデプロイメントでは、様々なサイズのイメージ・セットが必要です。

プロジェクトで提供されるデフォルトのiOSイメージは次のとおりです。

- デバイスが縦方向と横方向の両方の場合に使用されるイメージ。

- Retinaディスプレイに使用されるイメージ(つまり、icon.pngおよびicon@2x.png)

- iPadイメージ(icon-72.png)

これらのイメージをオーバーライドするには、第16.2.4.3項「iOSアプリケーションへのカスタム・イメージの追加」を参照してください。

cacerts

application workspace_directory\Application Resources\resources\Security\cacerts

たとえば、次のようになります。

JDeveloper\mywork\Mobile Application\resources\Security\cacerts

システム全体のキーストアであるcacerts証明書ファイル。JVM 1.4に対するCA証明書を識別します。このファイルは、Java keytoolユーティリティを使用して更新できます。第17.5項「プライベート証明書の追加」で説明するように、keytoolを使用してカスタム証明書ファイルを作成できます。証明書ファイルはすべてSecurityディレクトリ内に配置する必要があります。

logging.properties

application workspace_directory\src\.META-INF\logging.properties

たとえば、次のようになります。

JDeveloper\mywork\Mobile Application\src\META-INF\logging.properties

ロギング・レベルやロギング・コンソールなど、アプリケーション・エラーのロギングを設定できます。詳細は、第18.5項「ロギングの使用方法と構成」を参照してください。

cvm.properties

application workspace_directory\src\.META-INF\cvm.properties

たとえば、次のようになります。

JDeveloper\mywork\Mobile Application\src\META-INF\cvm.properties

Java仮想マシン、JVM 1.4の構成ファイル。このファイルを使用して、アプリケーションの起動やヒープ領域の割当て、JavaおよびJavaScriptのデバッグ・オプションを構成します。詳細は、第18.3.4項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

adf-config.xml

application workspace_directory\Mobile Application\.adf\META-INF

たとえば、次のようになります。

JDeveloper\mywork\Mobile Application\.adf\META-INF

構成サービス・パラメータなど、アプリケーション・レベルの設定の構成に使用します。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のadf-config.xmlに関する項を参照してください。第10.7項「Webサービスの管理」も参照してください。

connections.xml

application workspace_directory\Mobile Application\.adf\META-INF

たとえば、次のようになります。

JDeveloper\mywork\Application34\.adf\META-INF

ADFモバイル・アプリケーションで定義されているすべての接続のリポジトリ。『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のconnections.xmlに関する項も参照してください。

アプリケーション・コントローラ・プロジェクト自体(図4-9を参照)において、JDeveloperは、次の表4-2に示すアーティファクトを作成します。

図4-9 アプリケーション・コントローラ・プロジェクト

表4-2 アプリケーション・コントローラのアーティファクト

アーティファクト

ファイルの場所

説明

adfmf-skins.xml

application_workspace\ApplicationController\src\META-INF

たとえば、次のようになります。

JDeveloper\mywork\Mobile Application\ApplicationController\src\META-INF

使用可能なスキンを定義するもので、新しいスキンを定義することもできます。

詳細は、第5.11項「ADFモバイル・アプリケーションのスキニング」を参照してください。

adfm.xml

application_workspace\ApplicationController\adfmsrc\META-INF

たとえば、次のようになります。

JDeveloper\mywork\Mobile Application\ApplicationController\adfmsrc\META-INF

.cpx、.dcx、.jpxおよび.xcfgファイル(メタデータのレジストリ)のパス(および相対パス)を維持します。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のadfm.xmlに関する項を参照してください。

DataControls.dcx

application_workspace\ApplicationController\adfmsrc\

たとえば、次のようになります。

JDeveloper\mywork\Mobile Application\ApplicationController\adfmsrc\

データ・コントロールのレジストリ。デバイスのサービスを活用するDeviceFeatureデータ・コントロールの使用方法の詳細は、第9章「バインディングの使用とデータ・コントロールの作成」を参照してください。埋込みアプリケーション機能をコールするSpringboardページを作成できるようにするApplicationFeaturesデータ・コントロールの詳細は、第5.4.5項「ADFモバイルAMXコンテンツによるカスタムSpringboardアプリケーション機能について」を参照してください。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のOracle ADデータ・バインディング・ファイルに関する項を参照してください。

4.2.2.2 ビュー・コントローラ・プロジェクトについて

ビュー・コントローラ・プロジェクト(ViewControllerというデフォルト名で生成されます(図4-10参照))には、アプリケーション機能のリソースが格納されます。第4.2.2.1項「アプリケーション・レベルのリソースについて」で説明したアプリケーション・コントローラ・プロジェクトとは異なり、ビュー・コントローラ・プロジェクトのメタデータ・ファイルでは、アプリケーション機能レベルのリソース、特に、実行時にモバイル・デバイスでADFモバイル・アプリケーション自体のSpringboard内またはそのナビゲーション・バーに表示できるように1つのADFモバイル・アプリケーションに集約可能な様々なアプリケーション機能を記述します。さらに、アプリケーション機能のメタデータ・ファイルでは、アプリケーション機能をHTMLページとADFモバイルAMXページのどちらで構成するのかが記述されます。また、ビュー・コントローラ・プロジェクトには、これらのアプリケーション・ページと、アプリケーション機能レベルのリソース(ADFモバイル・アプリケーション用に定義された、Springboardおよびナビゲーション・バー上のアプリケーション機能を表すアイコン・イメージなど)を含むことができます。

ビュー・コントローラ・プロジェクトはアプリケーション・コントローラ・プロジェクトと分離して、別のモバイル・アプリケーションで再使用できるように、アーカイブ・ファイルとしてデプロイできます(第5.12項「機能アーカイブ・ファイルの使用」を参照)。また、稀なケースとして、アプリケーション・コントローラ・プロジェクトが複数のビュー・コントローラ・プロジェクトを使用することもできます。

図4-10 ビュー・コントローラ・プロジェクト

表4-3に示すように、これらのリソースには、adfmf-feature.xmlと呼ばれるアプリケーション機能の構成ファイルが含まれます。

表4-3 ビュー・コントローラのアーティファクト

アーティファクト

ファイルの場所

説明

adfmf-feature.xml

application_workspace\src\META_INF\adfmf-feature.xml

たとえば、次のようになります。

JDeveloper\mywork\Mobile Application\ViewController\src\META-INF

アプリケーション機能を定義できるようにする、スタブXMLの識別子ファイル。詳細は、第5.7項「モバイル機能アプリケーションの構成ファイルについて」を参照してください。第3.3.1項「プラットフォームとフォーム・ファクタに応じた開発環境の構成方法」の説明に従ってモバイル・プリファレンスを構成したら、デフォルトのデプロイメント・プロファイル設定を使用して、このアプリケーションをデプロイできます。詳細は、第16章「ADFモバイル・アプリケーションのデプロイ」を参照してください。

アプリケーション固有のコンテンツ

application_workspace\ViewController\public_html

たとえば、次のようになります。

JDeveloper\mywork\Mobile Application\ViewController\public_html

adfmf-feature.xmlで定義されたアプリケーション機能は、public_htmlディレクトリに表示されます。モバイル・コンテンツには、ADFモバイルAMXページ、CSSファイルおよびタスク・フローを含めることができます。アプリケーション機能に追加するカスタム・イメージは、このディレクトリ内に配置する必要があります。詳細は、第5.9.2項「外部リソースの選択について」を参照してください。

4.2.3 ADFモバイル・アプリケーションとアプリケーション機能の編集について

アプリケーションを作成するとadfmf-application.xmlファイルが生成されます。これによりモバイル・アプリケーションおよびadfmf-features.xmlファイルも構成できるようになります。このファイルを使用して、モバイル・アプリケーション内に埋め込まれるアプリケーション機能を追加、削除または編集します。ADFモバイル拡張機能によってこれら両方のファイルには概要エディタが提供されているので、これらのファイルは宣言的に変更できます。図4-11は、adfmf-application.xmlファイルの概要エディタの例を示しています。

図4-11 モバイル・アプリケーションの概要エディタ

図4-11に示すように、adfmf-application.xmlファイルは、「アプリケーション・ナビゲータ」の「アプリケーション・リソース」パネルで、「ディスクリプタ」および「ADF META-INF」ノードの下に表示されます。このファイルは、この場所からダブルクリックで開くことができます。このファイルにアクセスすると、JDeveloperによって、関連付けられた概要エディタが開かれるだけでなく、コンポーネント・パレットに該当するページ・コンポーネントが表示されます。これは、エディタの「ソース」ページか「構造」ウィンドウにドラッグ・アンド・ドロップできます(図4-12を参照)。adfmf-application.xmlページのコンポーネントについては、第5.2項「モバイル・アプリケーションの構成ファイルについて」を参照してください。

図4-12 ADFモバイル・アプリケーションの「ソース」エディタ、「構造」ウィンドウ、プロパティ・エディタの使用

図4-13に示すように、adfmf-feature.xml構成ファイルは、「アプリケーション・ナビゲータ」の「プロジェクト」パネルで、「ViewController」および「META-INF」ノードの下にあります。このファイルを使用して、ADFモバイル・アプリケーションのコンテンツを構成します。

図4-13 アプリケーション機能の概要エディタ

adfmf-application.xmlファイルの概要エディタと同じように、JDeveloperによって、adfmf-features.xml構成ファイルの要素を構築するために使用するADFモバイル・コンポーネントが提示されます(第5.7項「モバイル機能アプリケーションの構成ファイルについて」を参照)。「概要」ページを使用するか、「コンポーネント・パレット」から「構造」ウィンドウまたはソース・エディタ自体へコンポーネントをドラッグ・アンド・ドロップできます。adfmf-feature.xmlファイルを選択すると、JDeveloperによって「コンポーネント・パレット」にADFモバイル機能コンポーネントが移入されます。

図4-14 アプリケーション機能の「ソース」エディタ、「構造」ウィンドウ、「コンポーネント・パレット」の使用

4.2.4 ADFモバイルAMXアプリケーション用のアプリケーション・ワークスペースの作成

第7章「ADFモバイルAMXページの作成」に示すように、ADFモバイルAMXコンポーネントを使用すると、プラットフォーム固有の言語で作成されたページとまったく同じように実行されるページを構築できます。これらのページは、(ADFモバイル・アプリケーションを作成し、その中にアプリケーション機能を埋め込む)アプリケーション・アセンブラによって作成される場合もあります。または、別の開発者によって開発され、アプリケーション機能またはADFモバイル・アプリケーションに対するリソースとして、ADFモバイル・アプリケーションに組み込まれる場合もあります。

ADFモバイルAMXページを作成するプロジェクトによって、このページが単一のアプリケーション機能のコンテンツ配信に使用されるのか、またはADFモバイル・アプリケーション全体に対するリソースとして使用されるのかが決まります。たとえば、図4-17に示すような、アプリケーション・コントローラ・プロジェクト内で作成されたページは、アプリケーション全体のリソースとして使用されます。一方、ビュー・コントローラ・プロジェクト内で作成されるADFモバイルAMXページは、アプリケーション機能にコンテンツを配信する目的のみに使用されます。

同じように、ADFモバイルのタスク・フローを使用して、アプリケーション機能にコンテンツを配信することもできます。図4-15に示すように、ADFモバイルでは、ADFモバイルAMXページ、タスク・フローおよびアプリケーション機能を追加するためのウィザードが提供されます。

これらのウィザードにアクセスするには、まず「アプリケーション・ナビゲータ」でプロジェクトを選択してから、「ファイル」→「新規」を選択します。「クライアント層」内で「ADFモバイル」を選択してから、いずれかのウィザードを選択します。

図4-15 アプリケーション機能のリソースを作成するウィザード

4.2.4.1 ADFモバイルAMXページの作成方法

「ADFモバイルAMXページ」ウィザードを使用して、アプリケーション機能コンテンツとして使用されるAMXページと、単独でADFモバイル・アプリケーションへのリソースとして使用されるAMXページを作成できます。アプリケーション機能コンテンツの詳細は、第5.9.1項「アプリケーション・コンテンツの定義方法」を参照してください。

アプリケーション機能のコンテンツとしてADFモバイルAMXページを作成するには:

1. 「アプリケーション・ナビゲータ」で、ビュー・コントローラ・プロジェクトを右クリックします。

2. 「ファイル」を選択し、「新規」を選択します。

3. 「新規ギャラリ」の「クライアント層」ノードで、「ADFモバイルAMXページ」を選択して、「OK」をクリックします。

4. 「ファイル名」フィールドに名前を入力して、「ADFモバイルAMXページの作成」ダイアログの入力を完了します(図4-16を参照)。「ディレクトリ」フィールドに、ファイルの場所を入力します。この場所は、ビュー・コントローラ・プロジェクトのpublic_htmlフォルダ内である必要があります。

図4-16 ビュー・コントローラ・プロジェクト内でのADFモバイルAMXページの作成

5. 「パネル・ページ」内で、ヘッダーおよびフッターの作成に使用する「ファセット」を選択(または選択解除)します。「OK」をクリックします。
詳細は、第8.2.2項「パネル・ページ・コンポーネントの使用方法」を参照してください。

6. ADFモバイルAMXページを構築します。ADFモバイルAMXコンポーネントの使用方法の詳細は、第7.3.1.2項「ADFモバイルAMXページの作成」を参照してください。第5.9.1項「アプリケーション・コンテンツの定義方法」も参照してください。

ADFモバイル・アプリケーションに対するリソースとしてADFモバイルAMXページを作成するには:

1. 「アプリケーション・ナビゲータ」で、アプリケーション・コントローラ・プロジェクトを選択します。

2. 「ファイル」を選択し、「新規」を選択します。

3. 「新規ギャラリ」の「クライアント層」ノードで、「ADFモバイルAMXページ」を選択して、「OK」をクリックします。

4. 「ファイル名」フィールドに名前を入力して、「ADFモバイルAMXページの作成」ダイアログの入力を完了します(図4-17を参照)。「ディレクトリ」フィールドに、ファイルの場所を入力します。この場所は、アプリケーション・コントローラ・プロジェクトのpublic_htmlフォルダ内である必要があります。「OK」をクリックします。

図4-17 アプリケーション・コントローラ・プロジェクト内でのADFモバイルAMXページの作成

5. ADFモバイルAMXページを構築します。詳細は、第7.3.1.2項「ADFモバイルAMXページの作成」を参照してください。

4.2.4.2 ADFモバイル・タスク・フローの作成方法

アプリケーション機能のコンテンツをADFモバイル・タスク・フローとして配信できます。

アプリケーション機能のコンテンツとしてADFモバイル・タスク・フローを作成するには:

1. 「アプリケーション・ナビゲータ」で、ビュー・コントローラ・プロジェクトを選択します。

2. 「ファイル」を選択し、「新規」を選択します。

3. 「新規ギャラリ」の「クライアント層」ノードで、「ADFモバイル・タスク・フロー」を選択して、「OK」をクリックします。

4. 「ファイル名」フィールドに名前を入力して、「ADFモバイルAMXページの作成」ダイアログの入力を完了します(図4-18を参照)。「ディレクトリ」フィールドに、ファイルの場所を入力します。この場所は、ビュー・コントローラ・プロジェクトのpublic_htmlフォルダ内である必要があります。「OK」をクリックします。

図4-18 ビュー・コントローラ・プロジェクト内でのADFモバイル・タスク・フローの作成

5. タスク・フローを構築します。第7.2項「タスク・フローの作成」も参照してください。

4.2.4.3 ADFモバイルAMXページおよびタスク・フロー作成時の処理

JDeveloperは、ADFモバイルAMXページとタスク・フローを、ビュー・プロジェクトの「Webコンテンツ」ノードに配置します。これは、図4-19で、custom_springboard.amxおよびViewController-task-flow.xml(このプロジェクト内で作成されるタスク・フローのデフォルト名)によって示されています。第5.5項「モバイル・アプリケーション内のアプリケーション機能の構成」で説明するように、これらのアーティファクトはadfmf-feature.xmlファイル内で参照されます。図4-19は、カスタマイズされたアプリケーションのスプラッシュ画面(または起動)イメージやナビゲーション・バーのイメージなど、その他のリソースもWeb Contentノードに格納されていることも示しています。詳細は、表4-3を参照してください。

図4-19 アプリケーション・コントローラ・プロジェクトおよびビュー・コントローラ・プロジェクト内のADFモバイルAMXページとタスク・フロー

JDeveloperは、ADFモバイルAMXページとタスク・フローを、ADFモバイル・アプリケーションへのアプリケーション・リソースとして、アプリケーション・コントローラ・プロジェクトの「Webコンテンツ」ノードに配置します。図4-19に示すように、ADFモバイルAMXページ用のファイルはapplication_resource.amxという名前で、タスク・フローのファイルはApplicationController-task-flow.xmlという名前です(デフォルト名)。

第III部

ADFモバイル・アプリケーションの開発

概要エディタを使用してADFモバイル・アプリケーションを宣言的に開発する方法と、ADFモバイル内でホストされるPhoneGap APIをWebページによって呼び出す方法について説明します。

第III部は、次の章で構成されています。

- 第5章「ADFモバイル・アプリケーションの定義」

- 第6章「アプリケーション機能の表示制御」

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

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

この章では、次の項目について説明します。

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

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

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

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

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

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

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

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

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

- 第5.10項「リソース・バンドルの使用」

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

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

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

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

5.1.1 adfmf-applications.xmlの概要エディタの使用方法

概要エディタでは、adfmf-application.xmlファイルを構成して、モバイル・アプリケーションとそのリソースを記述できます。エディタの各ページで、構成ファイルの要素を追加または更新できます。

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

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

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

要素

説明

<adfmf:application>

adfmf-application.xmlのルート要素。

<adfmf:description>

アプリケーションの説明。

<adfmf:featureReference>

機能参照は、FAR (機能アーカイブ・ファイル)にパッケージされているか、adfmf-feature.xmlファイルで定義されているアプリケーション機能のうち、モバイル・アプリケーションのコンテンツに関連するものを指定します。機能参照を選択することで、ADFモバイル・アプリケーションの特性とコンテンツを定義します。FARの詳細は、第5.12項「機能アーカイブ・ファイルの使用」を参照してください。

<adfmf:preferences>

ユーザー・プリファレンスのオプションおよび動作をアプリケーション・レベルで設定できます。adfmf-feature.xmlファイル内のアプリケーション機能に対するユーザー・プリファレンスの表示および動作方法も設定できます。詳細は、第13章「ユーザー・プリファレンスの有効化」を参照してください。

<adfmf:login>

アプリケーション機能のログイン・ページを設定できます。詳細は、第17章「ADFモバイル・アプリケーションのセキュリティ」を参照してください。

<adfmf:navigation>

ナビゲーション・バーとSpringboardの動作を定義できます。Springboardはホーム・ページで、ここには、埋め込まれたアプリケーション機能のすべてのアプリケーション・アイコンとラベルがリスト・ビューに整理されて表示されます。Springboardには、ユーザーが使用可能なすべてのアプリケーションの最上位のビューが表示されます。ユーザーは内容に目を通してアプリケーションを選択できます。詳細は、第5.4項「Springboardとナビゲーション・バーの動作の構成」を参照してください。

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

例5-1 adfmf-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"
allowDeviceAccess="true"
showOnSpringboard="true"
showOnNavigationBar="true"/>
<adfmf:featureReference id="HCM"
allowDeviceAccess="true"
showOnSpringboard="true"
showOnNavigationBar="true"/>
<adfmf:featureReference id="PROD"
allowDeviceAccess="true"
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>

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

これらの要素は、概要エディタを使用して宣言的に変更するか(図5-2を参照)、「ソース」エディタを使用して手動で変更できます。この2通りのアプローチは、どちらも同じように使用できます。

図5-2 adfmf-application.xmlファイルの概要エディタ

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

「アプリケーション」ページでは、名前、アプリケーションID、モバイル・アプリケーションの表示方法を設定できます。

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

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

始める前に:

adfmf-application.xmlファイルの概要エディタを開くには、「アプリケーション・リソース」パネルのADF META-INFノード(l図5-3を参照)にあるadfmf-application.xmlファイルをダブルクリックします。

図5-3 「アプリケーション・ナビゲータ」でのadfmf-application.xmlファイルの選択

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

1. 「アプリケーション」ページを選択し、必要に応じて「概要」タブを選択します。

注意:

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

図5-4は、「アプリケーション」ページの基本情報を定義する部分を示しています。

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

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

注意:

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

3. 「ID」フィールドに、一意のIDを入力します。
名前の競合を避けるため、AndroidとiOSでは、リバースパッケージ名が使用されます(例: com.company.application)。JDeveloperによって、アプリケーション名の前には、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)で入手できる、Androidマニフェスト・ファイルに関する情報を参照してください。第16.2.3項「Androidデプロイメント・プロファイルの作成方法」および第16.2.4項「iOSデプロイメント・プロファイルの作成方法」で説明するように、このIDはデプロイメント・プロファイル内で上書きできます。

注意:

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

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

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

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

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

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

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

例5-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 an ADF Mobile application</adfmf:description>
<adfmf:featureReference id="feature1"/>
</adfmf:application>

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

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

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

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

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

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

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

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

始める前に:

adfmf-application.xmlの概要エディタの「アプリケーション」ページを選択する必要があります。

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

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

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

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

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

図5-8 ナビゲーション・バーを非表示(iPhone)

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

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

1. Springboardのタイプを選択します(存在する場合)。

- なし: アプリケーションにSpringboardを表示しない場合は、このオプションを選択します。

- デフォルト: ADFモバイルによって提供されるデフォルトのSpringboardを表示します。これは図5-1に示すスタイルを使用しています。デフォルトのSpringboardは、ADFモバイルAMXページとして実装されます。詳細は、第5.4.5項「ADFモバイルAMXコンテンツによるカスタムSpringboardアプリケーション機能について」を参照してください。

- カスタム: カスタマイズされたSpringboardを使用します。これはHTMLページまたはADFモバイルAMXページのいずれかとして実装できます。このアプリケーションはadfmf-feature.xmlファイルでアプリケーション機能として宣言されます。このファイルはビュー・コントローラ・プロジェクト内にあります。詳細は、第5.8.1項「アプリケーション機能の基本情報の定義方法」を参照してください。HTMLで記述されたカスタムSpringboard内をナビゲーションできるようにする方法は、第6章「アプリケーション機能の表示制御」を参照してください。

- 機能: Springboardとして使用するアプリケーション機能を選択します(図5-10を参照)。

注意:

カスタムSpringboardアプリケーション機能は、ADFモバイル・アプリケーションのナビゲーション・バー内に表示することも、Springboardに表示されるアプリケーション機能の1つとして表示することもできません。詳細は、第5.5.1項「モバイル・アプリケーションのコンテンツの指定方法」を参照してください。

図5-9 カスタムSpringboardとしてのアプリケーション機能の選択

2. 「アプリケーションの起動時にSpringboardを表示」を選択して、モバイル・アプリケーションの起動後にエンド・ユーザーに対してSpringboardを表示できるようにします。(このオプションは、「デフォルト」または「カスタム」オプションでのみ使用できます。)

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

図5-10 Springboardトグル・ボタン(iPhoneで使用)

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

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

注意:

スライドアウト・オプションは、Springboardの「カスタム」または「デフォルト」オプションを選択した場合のみ適用できます。

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

注意:

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

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

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

例5-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>

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

注意:

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

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

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

「カスタム」を選択して、Springboardとして使用するアプリケーション機能を選択すると、エディタでは<adfmf:navigation>要素(例5-5を参照)が移入されます。id属性は、adfmf-feature.xmlファイルで定義された、カスタムSpringboardとして使用するアプリケーション機能を指しています。

例5-5 カスタムSpringboardの構成

<adfmf:navigation>
<adfmf:springboard enabled="true">
<adfmf:springboardFeatureReference id="springboard"/>
</adfmf:springboard>
</adfmf:navigation>

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

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

例5-6 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"/>

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

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

- navigationBarのdisplayHideShowNavigationBarControl属性の使用。

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

5.4.4 HTMLコンテンツによるカスタムSpringboardアプリケーション機能について

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

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

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

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

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

5.4.5 ADFモバイルAMXコンテンツによるカスタムSpringboardアプリケーション機能について

HTMLで記述されたもののように、ADFモバイルAMXを使用して記述されたSpringboardは、ADFモバイル・アプリケーションによって参照されるアプリケーション機能です(第5.5.1項「モバイル・アプリケーションのコンテンツの指定方法」を参照)。

注意:

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

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

デフォルトのSpringboard (例5-7に示すspringboard.amx)は、ADFモバイルAMXアプリケーション機能として実装されます。

例5-7 デフォルトの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>

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

図5-11 デフォルトのSpringboard

ADFモバイルでは、ApplicationFeaturesデータ・コントロール内にカスタムSpringboardを作成(またはデフォルトのSpringboardを拡張)するための基本ツールが提供されています。このデータ・コントロール(図5-12を参照)により、ADFモバイル・アプリケーションとそのアプリケーション機能の両方を記述する属性のデータ・コレクションを使用して、Springboardを宣言的に構築できます。

図5-12 ApplicationFeaturesデータ・コントロール

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

表5-2 ApplicationFeatureメソッド

メソッド

説明

gotoDefaultFeature

デフォルトのアプリケーション機能に移動します。

gotoFeature

このメソッドに渡されたパラメータによって指定される特定のアプリケーションに移動します。

gotoSpringboard

Springboardに移動します。

hideNavigationbar

ナビゲーション・バーを非表示にします。

showNavigationbar

ナビゲーション・バーを表示します(非表示になっている場合)。

resetFeature

このメソッドに渡されたパラメータによって指定されるアプリケーション機能をリセットします。

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

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

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

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

例5-8 adfmf-application.xmlファイルでの機能参照の指定

<adfmf:featureReference id="Customers"
allowDeviceAccess="true"
showOnSpringboard="true"
showOnNavigationBar="true"/>
<adfmf:featureReference id="HCM"
allowDeviceAccess="true"
showOnSpringboard="true"
showOnNavigationBar="true"/>
<adfmf:featureReference id="PROD"
allowDeviceAccess="true"
showOnSpringboard="true"
showOnNavigationBar="true"/>

例5-8では、いくつかの定義済の機能参照とそれらに関連する属性を示しています。概要エディタでは、これらの機能参照は「機能参照」表に表示されます。図5-13は、カスタマおよび製品のアプリケーション機能をそれぞれ表すHCMおよびPRODに対して定義された機能参照を示しています。このページを使用して、アプリケーション機能に対する参照を入力し、モバイル・アプリケーションのSpringboard内での表示を設定します(図5-1を参照)。

さらに、このページでは、ナビゲーション・バーおよびSpringboard上でのアプリケーション機能の表示順序を設定できます。

注意:

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

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

始める前に:

第5.8項「アプリケーション機能の基本構成の設定」に示すように、アプリケーション機能がadfmf-feature.xmlファイル内で構成されている必要があります。さらに、adfmf-application.xmlの概要エディタを開く必要があります。

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

1. adfmf-application.xmlの概要エディタの「機能参照」ページをクリックします。

2. 「追加」をクリックします。

3. 機能参照の挿入ダイアログで、ドロップダウンリストからアプリケーション機能のIDを選択します(図5-14を参照)。
このダイアログには、adfmf-feature.xmlファイルの<adfmf:feature>要素に記述されているすべてのアプリケーション機能がリストされます。このダイアログを使用することで、<adfmf:featureReference>要素と<adfmf:feature>要素の両方のid属性が確実に一致するようになります。第5.5.2項「機能参照IDと機能IDについて」も参照してください。

図5-14 モバイル・アプリケーションのコンテンツの選択

4. 必要に応じて、上矢印と下矢印(図5-14参照)を使用して機能参照の表示順序を調整するか、「ID」列の行にあるドロップダウン・リスト(図5-15を参照)を使用して機能参照の順序を変更します。

注意:

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

図5-15 機能参照の順序変更

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

図5-16 ナビゲーション・オプションの変更

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

注意:

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

6. connections.xmlファイル内で構成したドメインが、ADFモバイルPhoneGap APIによって有効化されたデバイス・サービスにアクセスできるようにするには、「デバイス・アクセスの許可」列で「true」を選択します。デフォルトでは、すべてのアプリケーション機能でこのようなアクセスを許可しています。ドメインがデバイス・サービスにアクセスできないようにするには、「false」を選択します。詳細は、第12章「リモートURLとしてのアプリケーション機能の実装」を参照してください。

5.5.2 機能参照IDと機能IDについて

ADFモバイル・アプリケーションには多数のプロジェクトを格納できるので、多数のadfmf-feature.xmlファイルも含むことができます。アプリケーション構成ファイルでは、機能参照はadfmf-feature.xmlファイルによって記述される機能と関連しています。<adfmf:featureReferenceのIDは、対応するアプリケーション機能が定義される場所を識別します。言い換えれば、adfmf-application.xmlファイル内の<adfmf:featureReference要素のid属性は、adfmf-feature.xml内の<adfmf:feature要素に対して定義されたid属性と同じである必要があります。たとえば、adfmf-application.xmlの<adfmf:featureReference id="customers"は、adfmf-feature.xmlの<adfmf:feature id="customers"によって定義されます。JDeveloperは、同じモバイル・アプリケーション内のアプリケーションと機能識別子ファイルの間の参照を監査し、矛盾を発見したら警告を行います。図5-17に示すように、JDeveloperは、機能参照と機能アプリケーション識別子ファイルで宣言された機能との間の不一致をコード内で波状の下線で強調表示し、「参照が見つかりません」という警告を表示します。この場合は、機能参照IDが正しいPRODではなくPRiDと定義されています。JDeveloperの構文監査の詳細は、『Oracle Fusion Middleware Oracle JDeveloperユーザーズ・ガイド』の「アプリケーションの監査とプロファイリング」の章を参照してください。

注意:

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

図5-17 id属性の監査

<adfmf:featureReference>のIDがadfmf-feature.xmlファイルで定義されている場合、ポップアップ・メニューの「宣言に移動」(図5-18を参照)を使用して、adfmf-application.xmlファイル内の<adfmf:featureReference>のidから、これに対応するadfmf-feature.xmlファイル内の<adfmf:feature>のidへ移動できます。

図5-18 adfmf-feature.xmlファイル内のアプリケーション機能宣言の検索

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

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

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

例5-9 adfmf-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>

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

例5-10 adfmf-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>

...

LifeCycle Eventsサンプル・アプリケーションでは、adfmf-application.xmlファイルとadfmf-feature.xmlファイルにおけるイベント・リスナー・クラスの宣言例が提供されています。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samples

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

ADFモバイル・アプリケーションのライフサイクル・リスナー・クラスは、LifeCycleListenerインタフェースのstart、stop、activate、deactiveメソッドを実装する必要があります(例5-11を参照)。

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

package oracle.adfmf.application;

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

例5-12に示すAppListenerクラスでは、イベントを開始または停止するためにLifeCycleListenerメソッド・コールを使用します。また、アプリケーションを休止させる(deactivate)場合や、休止から戻す(activate)場合にも、これらのメソッド・コールを使用します。

例5-12 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...
}
}

ヒント:

アプリケーション・レベルでのLifeCycleListenerImpl.javaインタフェースの実装例は、LifeCycleEventsサンプル・アプリケーションのAppHandler.javaファイルを参照してください。このファイルは、アプリケーション・コントローラ・プロジェクトのApplication Sourcesフォルダ内のapplicationノードにあります。

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

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

表5-3 ADFモバイル・ライフサイクル・イベント

ADFモバイル・アプリケーション・イベント

タイミング

iOSアプリケーション委任メソッドとの関係

start

ADFモバイル・アプリケーションがアプリケーション機能を完全にロードした後、ユーザーに最初のアプリケーション機能またはSpringboardを表示する直前にコールされます。

このイベントは特定のアプリケーション委任メソッドには対応していません。adfmf-application.xmlファイルとadfmf-feature.xmlファイルのロード後、スプラッシュ画面が非表示になる直前にコールされます。

stop

ADFモバイル・アプリケーションがシャットダウンを開始するときにコールされます。

アプリケーション委任のapplicationWillTerminate:メソッド内でコールされます。

activate

ADFモバイル・アプリケーションを背景にある状態からアクティブ化するときにコールされます。

アプリケーション委任のapplicationDidBecomeActive:メソッド内でコールされます。

deactivate

ADFモバイル・アプリケーションを非アクティブ化し、背景に移動するときにコールされます。

アプリケーション委任のapplicationWillResignActive:メソッド内でコールされます。

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

ADFモバイル・アプリケーション機能ライフサイクル・リスナー・クラス(例5-14に示したFeatureListenerPhoneListなど)では、アプリケーション機能を休止時に非表示にしたり、休止から戻るときに表示したりするために、LifeCycleListenerインタフェースのactivateおよびdeactivateメソッドを実装する必要があります(例5-13を参照)。

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

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

例5-14は、FeatureListenerPhoneListと呼ばれるクラスを示しています。このクラスでは、LifeCycleListenerを実装することで、activateおよびdeactive関数を使用してアプリケーション機能を表示/非表示にします(表5-4を参照)。

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

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フォルダ内にあります。

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

表5-4は、アプリケーション機能に対してactivateイベントおよびdeactivateイベントを実行するタイミングを示しています。

表5-4 activateイベントとdeactivateイベント

イベント

タイミング

activate

アプリケーション機能をエンド・ユーザーに表示する直前にコールします。

deactivate

アプリケーション機能がエンド・ユーザーに表示されなくなった後でコールします。

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

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

例5-15 adfmf-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>ADF 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"
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>

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

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

要素の子要素" width="100%">

要素

説明

<adfmf:content>

アプリケーション機能のコンテンツの実装方法を記述します。アプリケーション機能のコンテンツは、ADFモバイルAMXページ、ローカルに格納されたHTMLページまたはリモートに提供されるWebアプリケーションとして配信できます。コンテンツをWebアプリケーションとして指定する方法は、第12章「リモートURLとしてのアプリケーション機能の実装」を参照してください。

<adfmf:constraint>

指定したアプリケーション機能をアプリケーション・ランタイムに表示できるようにするかどうかを決定します。制約を使用すると、ユーザー・ロールやデバイスのプロパティなどの基準に基づいてアプリケーション機能の使用を許可または回避できます。詳細は、第14章「制約の設定」を参照してください。

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

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

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

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

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

始める前に:

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

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

さらに、adfmf-feature.xmlファイルを開いて、「一般」タブを選択します。

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

1. 「一般」タブを選択します。

2. 「機能」表で、「追加」をクリックします。

3. 「ADFモバイル機能の作成」ダイアログ(図5-17を参照)の入力を完了して、「OK」をクリックします。このダイアログは次のように入力します。

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

- 「機能ID」フィールドに、アプリケーション機能の一意の識別子を入力します。

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

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

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

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

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

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

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

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

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

<adfmf:content>要素に子要素を追加すると(例5-16を参照)、アプリケーション機能をローカルHTML、リモートURL、モバイルADF AMXファイルのどれとして実装するのかを定義できます。各アプリケーション機能は、いずれかまたはすべてのコンテンツ・タイプとして実装できます。

例5-16 <adfmf:content>要素

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

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

概要エディタの「コンテンツ」タブ(図5-21を参照)には、例5-16に示したターゲット・コンテンツ関連の要素と属性を定義するためのドロップダウン・リストとフィールドが表示されます。このタブのフィールドを使用すると、アプリケーション機能用に配信されるコンテンツのタイプと、そのコンテンツ・タイプで使用するナビゲーションとSpringboardアイコンのイメージを制御できる制約を設定できます。

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

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

始める前に:

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

- ADFモバイルAMX: ADFモバイルAMXとして実装されるアプリケーション機能には、既存のビュー(単一のADFモバイルAMXページ)か、バインド・タスク・フローまたはバインドなしタスク・フローが必要です。JavaScriptファイルを追加すると、ADFモバイルAMXコンポーネントに対するレンダリング・ロジックが提供されるか、既存のレンダリング・ロジックがオーバーライドされます。カスタムのルック・アンド・フィールを指定するセレクタを含むスタイル・シート(CSS)を含めます。このルック・アンド・フィールは、ADFモバイル・アプリケーション・レベルで埋込みアプリケーション機能に対して提供されるスキニング・ファイルのルック・アンド・フィールをオーバーライドします。CSSを含むことで、アプリケーション機能全体で確実に独自のルック・アンド・フィールを持つようになります。
ADFモバイルAMXページとこれらを格納するモバイル・アプリケーションは、両方とも「新規ギャラリ」のウィザードを使用して作成できます。これらのウィザードにアクセスするには、まず「アプリケーション・ナビゲータ」でビュー・コントローラ・プロジェクトを強調表示してから、次に「新規」を選択します。または、「アプリケーション・ナビゲータ」でビュー・コントローラ・プロジェクトを右クリックしてから「新規」を選択すると表示されるポップアップ・メニュー(図5-22を参照)を使用して、ADFモバイルAMXページを作成することもできます。ADFモバイルAMXページの構築の詳細は、第7章「ADFモバイルAMXページの作成」を参照してください。

図5-22 ADFモバイル・ページを作成するためのポップアップ・メニュー

- リモートURL: リモートURL実装には、有効なWebアドレスとホストされたモバイル・アプリケーションが必要です。詳細は、第12章「リモートURLとしてのアプリケーション機能の実装」を参照してください。

- ローカルHTML: ローカルHTMLとして実装されるアプリケーション機能には、既存のHTMLファイルのバンドルとサポートするリソースが必要です。

アプリケーション・コンテンツをリモートURLまたはローカルHTMLとして定義するには:

1. adfmf-feature.xmlファイルの「機能」表にリストされているアプリケーション機能を選択します。

2. 「コンテンツ」をクリックします。

3. 「追加」をクリックして、「コンテンツ」表に新しい行を作成します(例として、図5-21のproducts.1を参照)。

4. 次のいずれかのコンテンツ・タイプで、生成されたIDに対応するものを選択します。

- リモートURL

- ローカルHTML

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

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

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

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

注意:

この接続は、アプリケーション・リソースとしてのみ作成できます。

図5-24 URL接続の作成

- ローカルHTMLコンテンツの場合は、ローカル・バンドルの場所を入力します。または、「URL」フィールドで「追加」をクリックし、図5-25に示すダイアログに入力して、JDeveloperのHTMLエディタを使用してページを構築することで、HTMLページを作成します。これはアプリケーション機能なので、このページはビュー・コントローラ・プロジェクトのWeb Contentフォルダに格納されます。

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

6. 必要に応じて、次の手順を実行します。

- このコンテンツをユーザーが使用できるようになるための条件を示す制約を入力します。詳細は、第14章「制約の設定」を参照してください。

- ナビゲーション・バーとSpringboardのイメージを選択します。

アプリケーション機能のコンテンツをADFモバイルAMXとして指定するには:

1. アプリケーション機能を選択します。

2. 「コンテンツ」をクリックします。

3. 必要に応じて、「追加」をクリックして「コンテンツ」表に行を作成し、「タイプ」列のドロップダウン・リストから「ADFモバイルAMX」を選択します(図5-26を参照)。

図5-26 ADFモバイルAMXをコンテンツ・タイプとして選択

4. 「ファイル」フィールドで「参照」をクリックし、「ADFモバイルAMXページ」または「タスク・フロー」を選択して(図5-27を参照)、ADFモバイルAMXページまたはバインド・タスク・フローの場所に移動し、これを取得します。または、「アプリケーション・ナビゲータ」からファイルの場所のフィールドに、ADFモバイルAMXページをドラッグ・アンド・ドロップすることもできます。

図5-27 ファイル・フィールドでのファイルの場所の参照

5. または、ページまたはタスク・フローを作成します。手順は次のとおりです。

1. 「ファイル」フィールドで「追加」をクリックして、「ADFモバイルAMX」または「タスク・フロー」を選択します(図5-28を参照)。

図5-28 「ファイル」フィールドからの「ADFモバイルAMXページ」または「タスク・フロー」の追加

2. 「ADFモバイルAMXページの作成」ダイアログ(図5-29参照)など、作成ダイアログの入力を完了させます。

図5-29 「ADFモバイルAMXページの作成」ダイアログ

3. エディタを使用して、ADFモバイルAMXページまたはタスク・フローを構築します。

6. 必要に応じて、次の手順を実行します。

- 「包含」表で「追加」をクリックしてJavaScriptファイルを入力し、「JavaScript」を選択し、ファイルの場所を参照します。詳細は、第5.11.4項「デフォルト・スキン・スタイルのオーバーライド」を参照してください。

- 最初に「追加」をクリックして、次に「スタイルシート」を選択することで、adfmf-config.xmlと指定されているデフォルトのスタイルシートをオーバーライドします。ファイルの場所を参照します。詳細は、第5.11項「ADFモバイル・アプリケーションのスキニング」を参照してください。

- 制約を入力します(第14章「制約の設定」を参照)。

- ナビゲーション・バーとSpringboardのイメージを選択します。

注意:

イメージ、スタイルシートおよびJavaScriptファイルは、デプロイ可能にするために、public_htmlフォルダ内に配置する必要があります。第5.9.2項「外部リソースの選択について」を参照してください。

5.9.2 外部リソースの選択について

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

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

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

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

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

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

ADFモバイルは、別の場所から参照されるリソースをサポートしていません。つまり、たとえば、../を接頭辞として使用して、public_htmlディレクトリ外部に値を入力することはできません。public_html外部のリソースを参照しないようにする安全策として、ADFモバイルには、「ファイルがpublic_htmlディレクトリにありません」と呼ばれる監査ルールが含まれています。ADFモバイルの監査プロファイル(図5-30を参照)には、「ツール」→「プリファレンス」→「監査」→「プロファイル」と選択することで、「プリファレンス」の「監査」の下の「プロファイル」ノードからアクセスできます。

図5-30 ADFモバイルの監査プロファイル

このプロファイルを選択した場合、リソースの場所を変更すると、JDeveloperによって警告が発行されます。図5-31に示すように、デフォルト値がオーバーライドされると、JDeveloperはこうした警告を表示します。監査の詳細は、『Oracle Fusion Middleware Oracle JDeveloperユーザーズ・ガイド』の「アプリケーションの監査とプロファイリング」の章を参照してください。

図5-31 外部リソースの警告

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

ADFモバイルでは、ADFの標準のローカライゼーション構造を使用して、英語の言語テキスト・リソースを指定します(ただし他の言語では、任意のツールを使用して、リソース・バンドル・ファイルを生成できます)。ADFモバイル・アプリケーションは、変換可能なUI文字列をアプリケーション・レベルとプロジェクト・レベルの両方で格納するように構成できます(『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のリソース・バンドルの使用に関する項を参照)。ADFモバイルは、ローカライゼーションにXLIFF (XML Localization Interchange File Format)ファイルのみを使用します。つまり、JDeveloperは、文字列を格納するために.xlfファイルを作成します。(また、図5-32に示すように、プロジェクトのリソース・バンドル設定ページで使用できるリソース・バンドル・タイプは、「Xliffリソース・バンドル」のみです。このページの詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。)

図5-32 「プロジェクト・プロパティ」の「リソース・バンドル」ページ

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

表5-6 ADFモバイル・アプリケーションのローカライズ可能な属性

要素

属性

<adfmf:Application>

name

<adfmf:PreferenceGroup>

label

<adfmf:PreferencePage>

label

<adfmf:PreferenceBoolean>

label

<adfmf:PreferenceText>

label

<adfmf:PreferenceNumber>

label

<adfmf:PreferenceList>

label

<adfmf:PreferenceValue>

name

プロジェクト(ビュー・コントローラ)レベルでは、表5-7に示すような、アプリケーション機能関連の属性ををローカライズできます。

表5-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

<amx:commandButton>のtext属性のようなADFモバイルAMXコンポーネントの属性には、リソース・バンドルを作成できます。表5-8に、これらのADFモバイルAMX (amx)コンポーネントを示します。詳細は、第8.7項「UIコンポーネントのローカライズ」を参照してください。

表5-8 ADFモバイル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

5.10.1 プロジェクト・レベルのリソース・バンドルの作成方法

プロジェクト・レベルでは、「リソース・バンドル」ダイアログを使用してリソース・バンドル・ファイルを作成します。このダイアログには、「プロパティ・インスペクタ」で「テキスト・リソースの選択」をクリックすることでアクセスします(図5-33を参照)。このダイアログでは、表5-7に示すadfmf-feature.xml属性のベース・リソース・バンドルに、テキスト・リソースを自動的に作成できます。

図5-33 機能アプリケーション属性のローカライズ

始める前に:

『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のメッセージ・バンドル・オプションの設定方法に関する項の説明に従って、リソース・バンドル・プロパティを構成する必要がある場合もあります。

リソース・バンドルで文字列を使用するには:

1. 「プロパティ・インスペクタ」で属性を選択します(図5-34のNameなど)。

2. 「テキスト・リソースの選択」を選択します。図5-34は、「プロパティ・インスペクタ」で選択されたアプリケーション名の属性を示しています。

図5-34 テキスト・リソースを選択するダイアログ

3. 「テキスト・リソースの選択」ダイアログ(図5-35を参照)で、表示名とキーを入力して新しい文字列リソースを作成し、「保存して選択」をクリックします。

図5-35 リソースを選択するダイアログ

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

「テキスト・リソースの選択」ダイアログでリソースを追加すると、JDeveloperによって、指定した表示名の文字列とキー・ファイルをADF Meta-INFファイルに格納した、新しいアプリケーション・レベルのリソース・バンドルが作成されます(図5-36のApplication15Bundle.xlfを参照)。

図5-36 アプリケーション・リソース・バンドル

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

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

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

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

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

プロジェクト・レベルのリソース・バンドルを使用して、ADFモバイルAMXコンポーネントの属性の文字列をローカライズできます(第8.7「UIコンポーネントのローカライズ」を参照)。例5-17の<amx:commandButton>のtext属性のように、コンポーネントをローカライズすると、JDeveloperによって文字列がEL式に変換されます(たとえば、例5-17の#{viewcontrollerBundle.MYBUTTONなど)。

例5-17 ADFモバイルXMLコンポーネントのローカライズ

<?xml version="1.0" encoding="UTF-8" ?>
<amx:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amx="http://xmlns.oracle.com/jdev/amx"
xmlns:dvtm="http://xmlns.oracle.com/jdev/dvtm">
<amx:panelPage id="pp1">
<amx:commandButton id="commandButton1" text="#{viewcontrollerBundle.MYBUTTON}"
</amx:panelPage>
<amx:loadBundle basename="mobile.ViewControllerBundle" var="viewcontrollerBundle"/>
</amx:view>

さらに、図5-37のViewControllerBundle.xlfのように、JDeveloperはプロジェクトのデフォルト・パッケージの下にリソース・バンドルを作成します。生成された<amx:loadBundle>要素では、basenameでこのパッケージをmobile.ViewControllerBundleなどとして表します。

図5-37 プロジェクト・レベルのリソース・バンドル

5.10.3 イメージ・ファイルのローカライズについて

イメージがテキストを格納していたり、特定の国または地域を反映している場合(たとえば旗のピクチャなど)、ローカライゼーション・プロセスの一環として代替イメージを指定できます。イメージをハードコード化することはできません(<amx:image="image2" source="feature1/test.jpg">など)。そのかわり、イメージのパスの<trans-unit>要素を追加することで、ViewControllerBundle.xlfファイルを手動で編集する必要があります(例5-18を参照)。

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

<trans-unit id="IMAGEPATH">
<source>/feature1/test.jpg</source>
<target/>
</trans-unit>

注意:

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

ViewControllerBundle.xlfの更新後、「式ビルダー」を使用して、<amx:image>コンポーネントのsource属性のEL式を定義します(図5-38を参照)。

図5-38 ローカライズされた<amx:image>コンポーネントのEL式の作成

5.10.4 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>

注意:

ADFモバイルは、国または地域をサポートしていません。

たとえば、スペインの場合、言語トークンはesになります。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』のリソース・バンドルとロケールの手動による定義に関する項を参照してください。

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

- stringBundle_en.xlf

- stringBundle_es.xlf

- stringBundle_fr.xlf

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

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

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

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

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

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

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

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

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

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

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

例5-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>要素を定義するときに(例5-20を参照)、バンドル名と実際のバンドルとのマッピングを作成します。バンドル名は、式を評価するときに使用します。

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

<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"/>

ADFモバイルのランタイムでは、JVMの最初のアクセスまで、<adfmf:loadBundle>要素が保持されます。アプリケーション機能に対してADFChannelが作成されると、JVMにメッセージが送信され、すべてのバンドルに関するベース名からEL名へのマッピングが初期化されます。例5-21は、JVMに送信されるメッセージの構造を示しています。

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

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

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

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

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

5.11.1 adfmf-config.xmlファイルについて

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

例5-22 adfmf-config.xmlファイルに移入されたデフォルト・スキン(mobileFusionFX)

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

注意:

<skin-family>要素はEL式をサポートしていません。<skin-version>要素には、1という1つの値しか存在しません。

ADFモバイルは、mobileFusionFxスキン・ファミリのスキンを定義します。スキニング階層では、最上位のスキンがmobileFusionFxで、そこから下って次のスキンはプラットフォーム(iOS)、デバイス・タイプ・スキン(iPadおよびiPhone)は3番目のレベルです。図5-39は、ADFモバイルのプリファレンス・ページのシード・フォーム・ファクタのリストを示しています。この図では、プラットフォームとモデルによる階層が示されています。様々なレベルでのスキンの適用方法の詳細は、第5.11.5項「スキニングについて」を参照してください。

図5-39 スキニングの階層

5.11.2 adfmf-skins.xmlファイルについて

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

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

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

の子要素。" title="<skin>要素の子要素" width="100%">

要素

説明

<id>

ADFモバイルのスキニングはデフォルトのmobileFusionFxスキンをカスタマイズするので、識別子の構文はオペレーティング・システムのバージョンを反映します。これは必須要素です。mobileFusionFxに関してこの要素を定義する場合、Apple iPadおよびiPhoneのコンポーネントをレンダリングするスタイル・シートは、mobileFusionFx.iOSによって識別されます。

mobileFusionFx.iPadはiPadを、mobileFusionFx.iPhoneはiPhoneを、それぞれ排他的にレンダリングします。

<family>

スキン・ファミリを識別します。これは必須要素です。

<extends>

この要素を使用して、特定のデバイス用にデフォルト・スキン(mobileFusionFx)をカスタマイズします。

<?xml version="1.0" encoding="UTF-8" ?>
<adfmf-skins xmlns="http://xmlns.oracle.com/adf/mf/config">
<skin>
<id>mobileFusionFx.iPhone</id>
<family>mobileFusionFx</family>
<extends>mobileFusionFx.iOS</extends>
<style-sheet-name>styles/myiphone.css</style-sheet-name>
</skin>
</adfmf-skins>

<skins>要素に<extends>句がない場合は、新しく定義されたスキンです。

<style-sheet-name>

CSSファイルの場所です(相対URL)。これはオプション要素です。

<version>

不具合修正のためにCSSを変更する場合に使用できるオプションの要素です。

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

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

の要素を示しています。" title="<skin-addition>の子要素" width="100%">

要素

説明

<skin-id>

スタイル・シートに注入する既存のスキンの名前。この識別子は、<skin>の<id>サブ要素の値と一致する必要があります。

<style-sheet-name>

スキンのスタイル・シートの相対URL。

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

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

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

5.11.2.1 ADFモバイルのスキン識別子について

スキン識別子(<skin-id>)は<skin-family>要素と同一で、オペレーティング・システム(iOS、iPhoneまたはiPadなど)を追加することができます。ADFモバイルは、最初に、<skin-family>.<OS>という形式(mobileFusionFx.iPadなど)のスキン識別子を検索します。スキンが見つからない場合は、かわりに<skin-family>のスキン識別子が検索され、デフォルトのスキン・ファミリ(mobileFusionFx)に戻されることになります(この最上位のスキンは、<skin-family>と同一の<skin-id>によって参照されます)。<skin-family>は常に、adfmf-config.xmlファイル内で識別される必要があります。

5.11.3 デフォルト・スキン・ファミリの変更方法

adfmf-config.xmlファイルはADFモバイル・アプリケーションによって使用されている現在のスキンを指定し、adfmf-skins.xmlファイルはそこで使用可能なスキン・ファミリについて記述しています。これらのファイルを編集することで、スキンのカスタマイズ、追加およびテストを実行できます。

ソース・ファイルを直接編集するか、「構造」ウィンドウ(図5-40を参照)を使用して、adfmf-skins.xmlおよびadfmf-config.xmlファイルを更新できます。adfmf-skins.xmlファイルでは、すべてのスキンとスキンの追加を維持し、adfmf-config.xmlファイルでは、アプリケーション・コンポーネントをレンダリングするためのデフォルト・スキンを指定します。「Cascading Style Sheetの作成」ダイアログを使用して、アプリケーション・コントローラ・プロジェクト内に新しいCSSファイルを作成します。CSSファイルは<skin-id>に関連付けられているので、adfmf-skins.xml内の<skin-id>要素を新しいCSS参照によって更新します。adfmf-config.xmlで指定されていないスキン・ファミリをスキニングに使用することはできません。

図5-40 スキニング・ファイルの構成

デフォルト・スキンをカスタマイズするには:

1. 必要に応じて、新しいCSSファイルを作成します。

1. アプリケーション・コントローラ・プロジェクトを右クリックして「新規」を選択するか、「ファイル」→「新規」をクリックします。

2. 「新規ギャラリ」で、「HTML」(「Web層」内にある)を選択して、「CSSファイル」を選択します。「OK」をクリックします。

3. CSSファイルの名前とディレクトリの場所を入力して、「Cascading Style Sheetの作成」ダイアログの入力を完了します。

注意:

CSSファイルは、アプリケーション・コントローラ・プロジェクトのpublic_htmlフォルダ内の任意の場所に配置する必要があります(/Users/user name/jdeveloper/mywork/Mobile Application/ApplicationController/public_html/resources/cssなど)。このCSSを参照するadfmf-skins.xmlも、アプリケーション・コントローラ・プロジェクト内に配置されます(application_workspace/ApplicationController/src/META-INF)。

図5-41 「Cascading Style Sheetの作成」ダイアログ

2. adfmf-skins.xmlファイルを開きます。

3. ADFモバイル・スキンの「コンポーネント・パレット」から「構造」ウィンドウに、<skin>コンポーネントをドラッグ・アンド・ドロップします。

4. 次のように、「skinの挿入」ダイアログ(図5-42を参照)に入力を行うことで、表5-9で説明した要素を<skin>要素に移入します。

- ファミリ: ベース・スキン・ファミリを入力します。スタイルを適用するには、ベース・スキン・ファミリが、adfmf-config.xmlファイルの<skin-family>要素によって定義されたものと同じである必要があります。

- ID: スキンの識別子を入力します。

- 拡張: 親スタイルの名前を入力します。mobilefusionFXファミリでは、オペレーティング・システムを付加したベース・ファミリ(mobileFusionFx.iOS)を入力します。

- スタイルシート名: スタイルシートを取得します。

図5-42 「skinの挿入」ダイアログ

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

6. adfmf-config.xmlファイル内でCSSを定義します。このファイル内のCSS定義のコンテキストは、このスタイルシートを使用してmobilefusionfxスキン・ファミリを拡張するのか、このスタイルシートを追加するのかによって異なります。

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

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

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

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

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

図5-43 「skin-additionの挿入」ダイアログ

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

注意:

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

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

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

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

adfmf-feature.xmlファイルの概要エディタの「包含」表では、ADFモバイルAMXアプリケーション機能にCSS(Cascading Style Sheet)を追加できます。

図5-44 「包含」表

始める前に:

第7.2項「タスク・フローの作成」の説明に従って、ADFモバイルのタスク・フローを作成します。Oracle Fusion Middleware Oracle ADFスキン・エディタによるADFスキンの作成のADFライブラリJARからのADFスキンのインポートに関する項およびADFスキンの作成に関する項の説明に従って、Cascading Style Sheetを作成または追加します。

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

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

2. 「タイプ」列のドロップダウン・メニューから、「スタイルシート」を選択します(図5-45を参照)。

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

3. 「ファイル」列で、「編集」を選択します(図5-45を参照)。

4. 「プロパティの編集」ダイアログでCSSを選択して(図5-46を参照)、「OK」をクリックします。

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

5.11.4.2 スキンを機能アプリケーションに適用する場合の処理

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

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

5.11.5 スキニングについて

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

jdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samples

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

図5-48 iPhone固有のレンダリング

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

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

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

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

5.12.1 ADFモバイル・アプリケーションでのFARコンテンツの使用方法

アプリケーション機能を、それを使用するアプリケーションのクラス・パスに追加することで、ADFモバイル・アプリケーションで使用できるようにします。

始める前に:

アプリケーション機能を機能アーカイブ・ファイルとしてデプロイします(第16.5.2項「機能アーカイブのデプロイメント・プロファイルのデプロイ方法」を参照)。

アプリケーション機能コンテンツをADFモバイル・アプリケーションに追加するには:

1. 「リソース・パレット」を開き、新規ファイルシステム接続を選択します。

2. 「ファイルシステム接続」ダイアログに入力し、機能アーカイブJARファイルを格納するディレクトリへのファイル接続を作成します。詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。

3. 「リソース・パレット」で、機能アーカイブ・ファイル(JARファイルとして示されている)を右クリックします。

4. 「アプリケーションに追加」を選択して、これを使用するアプリケーションのクラスパスに追加します(図5-49を参照)。

図5-49 ADFモバイル・アプリケーションへのFARの追加

注意:

使用するアプリケーションのクラスパスから機能アーカイブJARを削除するには、「アプリケーションから削除」を選択します。

5.12.2 機能アーカイブJARをクラスパスに追加する場合の処理

アプリケーションのクラスパスにFARを追加すると、次のようになります。

- FARのコンテンツが、「アプリケーション・リソース」の「ライブラリ」ノードの下に表示されます(図5-50を参照)。

図5-50 使用するアプリケーションの「アプリケーション・リソース」に表示される機能アーカイブ・ファイル

- JARに含まれるadfmf-feature.xmlファイルで宣言されたすべてのアプリケーション機能は、図5-51に示すように、アプリケーションで使用できるようになります。この図のドロップダウンには、AcmeSales.jarに属している使用可能なアプリケーション機能のID (HCM、PROD、Customers)と、アプリケーション(StockTracker.jar)に追加された別の機能アーカイブ内で定義されたPortfolioというIDが表示されています。第5.5.1項「モバイル・アプリケーションのコンテンツの指定方法」も参照してください。

図5-51 様々なadfmf-feature.xmlファイルで定義されたアプリケーション機能の参照

ヒント:

機能アーカイブJARをアプリケーションのクラスパスに手動で追加すると、アプリケーション機能が機能参照の挿入ダイアログにも表示されるようになります。

- 機能アーカイブJARにあるconnections.xmlファイル内の情報は、使用するアプリケーションのconnections.xmlファイルにマージされます。図5-52に示す「ログ」ウィンドウには、名前の競合が表示されています。

注意:

使用するアプリケーションで接続が有効であることを確認する必要があります。

図5-52 接続での名前の競合を示すメッセージ・ログ・ウィンドウ

5.12.3 機能アーカイブ・リソースの再使用の有効化について

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

6 アプリケーション機能の表示制御

この章では、ADFモバイルJavaScript API拡張機能、ADFモバイル・コンテナ・ユーティリティAPI、およびカスタムSpringboardアプリケーションのためのadfmfjavaUtilities APIの使用方法について説明します。

この章では、次の項目について説明します。

- 第6.1項「ADFモバイルAPIを使用したカスタムSpringboardアプリケーション機能の作成」

- 第6.2項「ADFモバイル・コンテナ・ユーティリティAPI」

- 第6.3項「getDirectoryPathRootメソッドを使用したファイル・アクセス」

6.1 ADFモバイルAPIを使用したカスタムSpringboardアプリケーション機能の作成

JavaScriptを使用してJavaScript API拡張機能をコールすることで、HTMLで作成されたカスタムSpringboardにナビゲーション機能を追加できます。第5.4.4項「HTMLコンテンツによるカスタムSpringboardアプリケーション機能について」で説明したように、JavaScript <script>タグにメソッドを追加することで、コールバックを有効にしてPhoneGapを活用できます。例6-1では、このタグを使用してPhoneGapをコールしています。

例6-1 HTML Springboardページへの<script>タグの埋込み

...
<script type="text/javascript" charset="utf-8" src=../../../www/js/phonegap-1.0.0.js"></script>
<script type="text/javascript" src="../../../www/js/adf.el.js"></script>
...

注意:

adf.el.js内にあるJavaScriptメソッドでadf.mf.apiで始まるものはすべて使用できます。使用方法の詳細は、第6.2項「ADFモバイル・コンテナ・ユーティリティAPI」を参照してください。

ADFモバイルでのJavaScriptの使用では、PhoneGapのインフラストラクチャを活用し、適切なJavaScriptコンストラクタによってブラウザのDOM (Document Object Model)を初期化します。また、PhoneGapオブジェクト・コンストラクタ・インフラストラクチャを使用することで、競合状態も回避します。さらに、ADFモバイルはPhoneGapメッセージをネイティブ・デバイス・コードにポストして、ADFモバイルPhoneGapコマンドを起動します。

PhoneGap APIに対するADFモバイル拡張機能では、モバイル・デバイスのAPIによってadfmf-feature.xmlおよびadfmf-application.xmlファイルの構成セットにアクセスできるようになります。これにより、モバイル・デバイスとADFモバイルのインフラストラクチャ間の通信が確立します。これらの拡張機能は、アプリケーション機能の表示動作も指示します。

6.2 ADFモバイル・コンテナ・ユーティリティAPI

ADFモバイル・コンテナ・ユーティリティAPIのメソッドは、ナビゲーション・バーの表示または非表示、Springboardの表示、アプリケーション機能の起動などの機能をADFモバイル・アプリケーションに提供します。これらのメソッドは、ADFモバイルのJavaおよびJavaScriptレイヤーで使用できます。

例6-2に示すように、JavaScript内でコンテナ・ユーティリティAPIはadf.mf.api JavaScriptオブジェクトに配置されます。この例では、gotoSpringboardメソッドをコールしています。

例6-2 JavaScriptでのコンテナ・ユーティリティAPIのコール

<script type="text/javascript" charset="utf-8" src="../../../www/js/phonegap-1.0.0.js"></script>
...
adf.mf.api.gotoSpringboard();
...

注意:

www/jsディレクトリの場所への相対パスは、常にHTML Springboardページの場所を反映します。HTML Springboardページは、ビュー・コントローラのpublic_htmlディレクトリのルートか、そのサブディレクトリに配置できます。例6-2で、src属性によって定義されているパス(../../../www/js/phonegap-1.0.0.js)は、次のように、HTML Springboardファイルがpublic_htmlディレクトリのルートに配置されているときの位置を基準にしています。

JDeveloper\mywork\Mobile_Application\ViewController\public_html\customspringboard.html

public_htmlのサブディレクトリ内にあるSpringboardファイルが、ホストされたJavaScriptファイルにアクセスできるようにするには、各サブディレクトリの場所に応じて../を追加することで、相対パスの定義を調整する必要があります。

設計時にはパスが存在しないので、JavaScriptインクルードは、JDeveloperによってソース・エディタ内ではエラーとして赤い波線で強調表示されます。このパスは実行時に解決されます。

Javaでは、コンテナ・ユーティリティAPIは、静的メソッドとしてAdfmfContainerUtilitiesクラスに実装されます。このクラスはoracle.adfmf.framework.apiパッケージにあります。例6-3では、gotoSpringboardメソッドをコールしています。oracle.adfmf.framework.api.AdfmfContainerUtilitiesの詳細は、Oracle Fusion Middleware Oracle ADFモバイルJava APIリファレンスを参照してください。

例6-3 Javaでのコンテナ・ユーティリティAPIのコール

import oracle.adfmf.framework.api.AdfmfContainerUtilities;
...
AdfmfContainerUtilities.gotoSpringboard();
...

6.2.1 JavaScriptコールバックの使用方法

JavaとJavaScriptのシグネチャは一致します。Javaでは、シグネチャは同期化され、直接結果が戻されます。JavaScriptは非同期なので、結果を返すsuccessコールバックと、スローされた例外を戻すfailedコールバック2つのコールバック関数が各関数に追加されます。Javaメソッドでは、success値は関数またはメソッドから戻され、例外はメソッドから直接スローされます。たとえば、public static (, , ...) throwsなどの引数をとらないコールは、次のようにJava内で実行されます。

try {
result = AdfmfContainerUtilities.(, , ...);
}
catch() {
...
}

JavaScriptのコールは非同期なので、関数の実行が完了した時点で、コールバック・メカニズムを通して戻す必要があります。JavaScriptのシグネチャはadf.mf.api.(, , ..., , )で、次のように呼び出されます。

adf.mf.api.(, , ..., , )

このコールは、function(request, response)と定義されます。request引数の値は、実際のリクエストです。responseはfunction(request, response)と定義され、この値は実際のリクエストです。レスポンスは関数の実行時にスローされます。

public static <return value> <function name>(<arg0>, <arg1>, ...) throws <exceptions>のように、1つ以上の引数をとるコールは、次のようにJava内で実行されます。

try {
result = AdfmfContainerUtilities.<function_name>(<arg0>, <arg1>, ...);
}
catch(<exception>) {
...
}

JavaScriptのコールは非同期なので、結果を戻すことができません。そのかわりに、関数の実行の完了時にコールバック・メカニズムが必要になります。成功および失敗のコールバックのシグネチャは、どちらもfunction(request, response)です。ここでrequest引数は実際のリクエストのJSON表現です。responseはメソッドから戻されたもののJSON表現です(successコールバック関数の場合)。failedコールバック関数の場合は、スローされた例外のJSON表現になります。

6.2.2 コンテナ・ユーティリティAPIの使用方法

コンテナ・ユーティリティAPIでは、次のメソッドが提供されます。

- checkforNewConfiguration: ホストされたconnections.xmlファイル内の変更をチェックします。

- getApplicationInformation: ADFモバイル・アプリケーションのメタデータを取得します。

- gotoDefaultFeature: デフォルトのアプリケーション機能を表示します。

- getFeatures: アプリケーション機能を取得します。

- gotoFeature: 特定のアプリケーション機能を表示します。

- getFeatureByName: アプリケーション機能の名前を使用して、アプリケーション機能に関する情報を取得します。

- getFeatureById: IDを使用してアプリケーション機能を取得します。

- resetFeature: アプリケーション機能をロード時の状態にリセットします。

- gotoSpringboard: Springboardを表示します。

- hideNavigationBar: ナビゲーション・バーを非表示にします。

- showNavigationBar: ナビゲーション・バーを表示します。

- "invokeMethod": Javaメソッドを起動します。

- invokeContainerJavaScriptFunction: JavaScriptメソッドを起動します。

6.2.3 checkforNewConfiguration

構成サービスの使用時に、このメソッドは、構成済のエンドポイントに対する変更がないか、connections.xmlファイルをホストするサーバーをチェックするように、ADFモバイルにリクエストします。変更をチェックするために、ADFモバイルは、サーバー上でホストされる接続関連のコンテンツとデバイス上の構成を比較するスレッドを作成します。ADFモバイルが、デバイス構成が古くなっているのを検出したら、checkforNewConfigurationメソッドによって、新しい構成が検出されたのでアプリケーションを閉じることをユーザーに通知する、非ブロッキング・コールが発行されます。ADFモバイルはユーザーにアプリケーションの再起動を促します。

Javaでは、このメソッドは次のようになります。

public static void checkForNewConfiguration()
throws oracle.adfmf.framework.exception.AdfException

例6-4は、このメソッドの使用方法を示しています。

例6-4 Javaを使用した構成情報の取得

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.checkForNewConfiguration();
}catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void checkForNewConfiguration(success, failed)

successコールバックはfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数には関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。failedコールバックはfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数にはエラー(AdfException)が格納されます。

例6-5は、これらのコールバック関数を使用して構成情報を取得する方法を示しています。

例6-5 JavaScriptでコールバック関数を使用して構成情報を戻す方法

adf.mf.api.checkForNewConfiguration(
function(req, res) { alert("checkForNewConfiguration complete"); },
function(req, res) { alert("checkForNewConfiguration failed with " +
adf.mf.util.stringify(res); }
);

6.2.4 getApplicationInformation

このメソッドは、アプリケーションに関する情報を格納したApplicationInformationオブジェクトを戻します。このメソッドでは、アプリケーションID、アプリケーション名、バージョン、カスタムSpringboardアプリケーションのベンダーといったメタデータが戻されます。

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.ApplicationInformation
getApplicationInformation()
throws oracle.adfmf.framework.exception.AdfException

例6-6は、このメソッドのコール方法を示しています。

例6-6 Javaを使用したアプリケーション情報の取得

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
ApplicationInformation[] ai = AdfmfContainerUtilities.getApplicationInformation();
...
}catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void getApplicationInformation(success, failed)

successコールバックはfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数には関連するAdfmfContainerUtilitiesメソッドの戻り値が格納されます。この戻り値は、アプリケーション・レベルのメタデータを格納するApplicatiaonInformationオブジェクトです。ここには、アプリケーション名、ベンダー、バージョンおよびアプリケーションIDが含まれます。

failedコールバックはfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

例6-7は、これらのコールバック関数を使用してアプリケーション情報を取得する方法を示しています。

例6-7 JavaScriptでコールバック関数を使用してアプリケーション情報を取得する方法

adf.mf.api.getApplicationInformation(
function(req, res) { alert("getApplicationInformation complete"); },
function(req, res) { alert("getApplicationInformation failed with " +
adf.mf.util.stringify(res); }
);

6.2.5 gotoDefaultFeature

このメソッドは、ADFモバイルがデフォルトのアプリケーション機能を表示するようにリクエストします。デフォルトのアプリケーション機能とは、ADFモバイル・アプリケーションの起動時に表示されるアプリケーション機能です。

注意:

認証関連または許可関連の問題が発生している場合、このメソッドではアプリケーション機能を表示できないことがあります。

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void gotoDefaultFeature(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数には関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数にはエラーが格納されます。

例6-8は、これらのコールバック関数を使用してデフォルトのアプリケーション機能をコールする方法を示しています。

例6-8 JavaScriptのコールバック関数を使用してデフォルトのアプリケーション機能をコールする方法

adf.mf.api.gotoDefaultFeature(
function(req, res) { alert("gotoDefaultFeature complete"); },
function(req, res) { alert("gotoDefaultFeature failed with " +
adf.mf.util.stringify(res); }
);

6.2.6 getFeatures

このメソッドは、使用可能なアプリケーション機能を表すFeatureInformationオブジェクトの配列を戻します。戻されるメタデータには、機能ID、アプリケーション機能名およびアプリケーション・アイコンに使用するイメージ・ファイルの場所が含まれます。このコールにより、カスタムSpringboardの実装は、制約の適用後に使用可能になるアプリケーション機能のリストにアクセスできるようになります。(これらのアプリケーション機能もデフォルトのSpringboardに表示されることがあります。)

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.FeatureInformation[] getFeatures()
throws oracle.adfmf.framework.exception.AdfException

例6-9は、このメソッドの使用方法を示しています。

例6-9 Javaを使用したアプリケーション機能情報の取得

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
FeatureInformation[] fia = null;
fia = AdfmfContainerUtilities.getFeatures();

for(int f = 0; f < fia.length; ++f) {
FeatureInformation fi = fia[i];
...
}
}catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void getFeatures(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数には関連するAdfmfContainerUtilitiesメソッドの戻り値(FeatureInformationオブジェクトの配列)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequest引数には元のリクエストが格納され、response引数にはエラー(AdfException)が格納されます。

例6-10は、JavaScriptのコールバック関数を使用してアプリケーション機能情報を取得する方法を示しています。

adf.mf.api.getFeatures(
function(req, res) { alert("getFeatures complete"); },
function(req, res) { alert("getFeatures failed with " + adf.mf.util.stringify(res); }
);

6.2.7 gotoFeature

このメソッドは、ADFモバイルが、IDによって識別されたアプリケーション機能を表示するようにリクエストします。

注意:

認証関連または許可関連の問題が発生している場合、このメソッドではアプリケーション機能を表示できないことがあります。

Javaでは、このメソッドは次のようにコールされます。

public static void gotoFeature(java.lang.String featureId)
throws oracle.adfmf.framework.exception.AdfException

例6-11に示すように、このメソッドのパラメータはアプリケーション機能のIDです。

例6-11 アプリケーション機能のアクティブ化

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.gotoFeature("feature.id");
}catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void gotoFeature(featureId, success, failed)

featureIdパラメータは、アプリケーション機能IDです。このパラメータはsuccessコールバック関数をアクティブ化します。このコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

例6-12は、これらのコールバック関数を使用してアプリケーション機能をコールする方法を示しています。

例6-12 JavaScriptのコールバック関数を使用したアプリケーション機能のアクティブ化

adf.mf.api.gotoFeature("feature0",
function(req, res) { alert("gotoFeature complete"); },
function(req, res) { alert("gotoFeature failed with " +
adf.mf.util.stringify(res); }
);

6.2.8 getFeatureByName

このメソッドは、渡されたアプリケーション機能の名前を使用して、アプリケーション機能に関する情報を戻します。

Javaでは、このメソッドは次のようにコールされます。

public static oracle.adfmf.framework.FeatureInformation getFeatureByName(java.lang.String                                                                          featureName)
throws oracle.adfmf.framework.exception.AdfException

例6-13に示すように、このメソッドのパラメータはアプリケーション機能の名前です。

例6-13 アプリケーション機能名を使用したアプリケーション機能情報の取得

...
try {
FeatureInformation fi = AdfmfContainerUtilities.getFeatureByName("feature.name");
}catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void getFeatureByName(featureName, success, failed)

featureNameパラメータは、アプリケーション機能の名前です。successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

例6-14は、これらのコールバック関数の使用方法を示しています。

例6-14 JavaScriptのコールバック関数を使用した、アプリケーション機能名によるアプリケーション機能情報の取得

adf.mf.api.getFeatureByName("feature.name",
function(req, res) { alert("getFeatureByName complete"); },
function(req, res) { alert("getFeatureByName failed with " +
adf.mf.util.stringify(res); }
);

6.2.9 getFeatureById

このメソッドは、アプリケーションIDを使用してアプリケーション機能を取得します。

Javaでは、このメソッドは次のようにコールされます。

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

例6-15に示すように、このメソッドのパラメータはアプリケーション機能のIDです。

例6-15 JavaでのIDを使用したアプリケーション機能の取得

try {
FeatureInformation fi =AdfmfContainerUtilities.getFeatureById("feature.id");
}catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void getFeatureById(featureId, success, failed)

featureIdパラメータは、アプリケーション機能のIDです。successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するAdfmfContainerUtilitiesメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

例6-16は、これらのコールバック関数を使用してアプリケーション機能を取得する方法を示しています。

例6-16 JavaScriptのコールバック関数を使用した、IDによるアプリケーション機能の取得

adf.mf.api.getFeatureById("feature.id",
function(req, res) { alert("getFeatureById complete"); },
function(req, res) { alert("getFeatureById failed with " + adf.mf.util.stringify(res); }
);

6.2.10 resetFeature

このメソッドは、アプリケーション機能の状態をリセットします。このメソッドでは、アプリケーション機能のJava側のモデルをリセットして、ADFモバイル・アプリケーションがロードされ、最初にアプリケーション機能が表示されたときのようにユーザー・インタフェース・プレゼンテーションを再起動します。

Javaでは、このメソッドは次のようにコールされます。

public static void resetFeature(java.lang.String featureId)
throws oracle.adfmf.framework.exception.AdfException

例6-17に示すように、このメソッドのパラメータはリセットされるアプリケーション機能のIDです。

例6-17 Javaでのアプリケーション機能のリセット

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.resetFeature("feature.id");
}catch(AdfException e) {
// handle the exception

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void resetFeature(featureId, success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(アプリケーション機能のID)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

例6-18は、これらのコールバック関数を使用してアプリケーション機能をコールする方法を示しています。

例6-18 JavaScriptのコールバック関数を使用してアプリケーション機能をリセットする方法

adf.mf.api.resetFeature("feature0",
function(req, res) { alert("resetFeature complete"); },
function(req, res) { alert("resetFeature failed with " +
adf.mf.util.stringify(res); }
);

6.2.11 gotoSpringboard

このメソッドは、ADFモバイルがSpringboardを表示するようにリクエストします。

注意:

adfmf-application.xmlファイルで機能参照として指定されていない場合や、認証関連または許可関連の問題が発生している場合、このメソッドではSpringboardを表示できないことがあります。第5.4項「Springboardとナビゲーション・バーの動作の構成」も参照してください。

Javaでは、このメソッドは次のようにコールされます。

public static void gotoSpringboard()

例6-19は、このメソッドの使用方法を示しています。

例6-19 JavaでのSpringboardのアクティブ化

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.gotoSpringboard();
}catch(AdfException e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void gotoSpringboard(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

例6-20は、これらのコールバック関数の使用方法を示しています。

例6-20 JavaScriptのコールバック関数を使用してSpringboardをアクティブ化する方法

adf.mf.api.gotoSpringboard(
function(req, res) { alert("gotoSpringboard complete"); },
function(req, res) { alert("gotoSpringboard failed with " + adf.mf.util.stringify(res); }
);

6.2.12 hideNavigationBar

このメソッドは、ADFモバイルがナビゲーション・バーを非表示にするようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void hideNavigationBar()

例6-21は、このメソッドの使用方法を示しています。

例6-21 Javaでのナビゲーション・バーの非表示化

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.hideNavigationBar();
}catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void hideNavigationBar(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

例6-22は、これらのコールバック関数の使用方法を示しています。

例6-22 JavaScriptのコールバック関数を使用してナビゲーション・バーを非表示にする方法

adf.mf.api.hideNavigationBar(
function(req, res) { alert("hideNavigationBar complete"); },
function(req, res) { alert("hideNavigationBar failed with " + adf.mf.util.stringify(res); }
);

6.2.13 showNavigationBar

このメソッドは、ADFモバイルがナビゲーション・バーを表示するようにリクエストします。

Javaでは、このメソッドは次のようにコールされます。

public static void showNavigationBar()

例6-23は、このメソッドの使用方法を示しています。

例6-23 Javaでのナビゲーション・バーの表示

import oracle.adfmf.framework.api.AdfmfContainerUtilties;

...
try {
AdfmfContainerUtilities.showNavigationBar();
}catch(Exception e) {
// handle the exception
}

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void showNavigationBar(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値(void)が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

例6-24は、これらのコールバック関数の使用方法を示しています。

例6-24 JavaScriptのコールバック関数を使用してナビゲーション・バーを表示する方法

adf.mf.api.showNavigationBar(
function(req, res) { alert("showNavigationBar complete"); },
function(req, res) { alert("showNavigationBar failed with " + adf.mf.util.stringify(res); }
);

6.2.14 invokeMethod

このメソッドは、次のようにクラスパス内の任意のクラスからJavaメソッドを起動します。

adf.mf.api.invokeMethod(classname, methodname, param1, param2, ... , paramN ,successCallback,
failedCallback);

表6-1に、このメソッドによって取得されるパラメータを示します。

表6-1 invokeJavaMethodに渡されるパラメータ

パラメータ

説明

classname

Javaメソッドのコール時にADFモバイルがインスタンスを作成するために使用するクラス名(パッケージ情報を含む)

methodname

classnameパラメータによって指定されたクラスのインスタンスで起動させるメソッドの名前

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

複数のパラメータによるこのメソッドの使用例は次のとおりです。

- adf.mf.api.invokeMethod("TestBean", "setStringProp", "foo", success, failed);

- adf.mf.api.invokeMethod("TestBean", "getStringProp", success, failed);

整数パラメータの使用例は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "testSimpleIntMethod", "101", success, failed);

複合パラメータの使用方法は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "testComplexMethod",
{"foo":"newfoo","baz":"newbaz",".type":"TestBeanComplexSubType"}, success, failed);

パラメータが存在しない場合の使用方法は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "getComplexColl", success, failed);

Stringパラメータの使用方法は次のとおりです。

adf.mf.api.invokeMethod("TestBean", "testMethodStringStringString", "Hello ", "World", success, failed);

6.2.15 invokeContainerJavaScriptFunction

invokeContainerJascriptFunctionは、JavaScriptメソッドを起動します。表6-2に、このメソッドによって渡されるパラメータを示します。

表6-2 invokeContainerJavaScriptFunctionに渡されるパラメータ

パラメータ

説明

featureId

JavaScriptの起動コンテキストを決定するためにADFモバイルによって使用されるアプリケーション機能のID。このIDによって、このメソッドがコールされるWebビューが決まります。

method

起動させるメソッドの名前。

args

メソッドに渡される引数の配列。この配列内で、これらの引数はメソッドが期待する順序で並べられます。

このメソッドは、JSONオブジェクトを戻します。

例6-25 invokeContainerJavaScriptFunctionメソッド

public static java.lang.Object invokeContainerJavaScriptFunction(java.lang.String featureId,
java.lang.Object[] args)
throws oracle.adfmf.framework.exception.AdfException

例6-26は、feature1という名前のアプリケーション機能に含まれるappFunctions.jsという名前のJavaScriptファイルを示しています。このファイル内で記述されているJavaScriptメソッド、application.testFunctionは、invokeContainerJavaScriptFunction methodによってコールされます(例6-27を参照)。アプリケーションには、この関数をコールするアクション・リスナーで構成されるコマンド・ボタンが含まれているので、ユーザーがこのボタンをクリックすると、次のようなアラートが表示されます。

- APP ALERT 0

- APP ALERT 1

- APP ALERT 2

例6-26 appFunctions.js

(function()
{
if (!window.application) window.application = {};

application.testFunction = function()
{
var args = arguments;

alert("APP ALERT " + args.length + " ");
return "application.testFunction - passed";
};
})();

例6-27は、invokeApplicationJavaScriptFunctionメソッドによって、例6-26で記述されているJavaScriptメソッド(application.testFunction)をコールする方法を示しています。

例6-27 JavaScript関数のコール

invokeApplicationJavaScriptFuntions
public void invokeApplicationJavaScriptFuntions(ActionEvent actionEvent) {
AdfmfContainerUtilities.invokeContainerJavaScriptFunction("feature1",
"application.testFunction",
new Object[] {} );
AdfmfContainerUtilities.invokeContainerJavaScriptFunction("feature1",
"application.testFunction",
new Object[] {"P1"} );
AdfmfContainerUtilities.invokeContainerJavaScriptFunction("feature1",
"application.testFunction",
new Object[] {"P1", "P2"} );
}

詳細は、Oracle Fusion Middleware Oracle ADFモバイルJava APIリファレンスを参照してください。

JavaScriptでは、次のように、successおよびfailedコールバック関数によって、戻り値と例外をJavaScriptのコール元コードに戻すことができます。

public void invokeContainerJavaScriptFunction(success, failed)

successコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseには関連するメソッドの戻り値が格納されます(表6-2を参照)。responseには関連するAdfmfContainerUtilitiesメソッドの戻り値が格納されます。

failedコールバック関数はfunction(request, response)という形式にする必要があります。このrequestには元のリクエストが格納され、responseにはエラーが格納されます。

6.3 getDirectoryPathRootメソッドを使用したファイル・アクセス

adfmfJavaUtilties APIには、getDirectoryPathRootメソッドが含まれています。このメソッドはJavaレイヤーからのみコールでき、iOSシステム上のファイルへのアクセスを可能にします。例6-28に示すように、このメソッドは、iOSアプリケーション・バンドル(.ipaファイル)にパッケージ化されているファイル、一時ファイルの場所およびデバイス上のキャッシュ・ディレクトリの場所へのアクセスを可能にします。oracle.adfmf.framework.api.AdfmfJavaUtilitiesの詳細は、Oracle Fusion Middleware Oracle ADFモバイルJava APIリファレンスを参照してください。

例6-28 iOSシステム上のファイルへのアクセス

import oracle.adfmf.framework.api.AdfmfJavaUtilities;

...

public void getDirectoryPathRoot()
{
// returns the directory for storing temporary files

String tempDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.TemporaryDirectory);

// returns the directory for storing application files

String appDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.ApplicationDirectory);

// returns the directory for storing cache files

String deviceDir =
AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DeviceOnlyDirectory);

}

第IV部

ADFモバイルAMXアプリケーション機能の作成

タスク・フローやアプリケーション・ページの作成方法や、データ・コントロール、Webサービスおよびローカル・データベースの使用方法など、ADFモバイル・アプリケーション用のADFモバイルAMXコンテンツの作成方法について説明します。

第IV部の内容は次のとおりです。

- 第7章「ADFモバイルAMXページの作成」

- 第8章「ADFモバイルAMXユーザー・インタフェースの作成」

- 第9章「バインディングの使用とデータ・コントロールの作成」

- 第10章「Webサービスの使用方法」

- 第11章「ローカル・データベースの使用方法」

7 ADFモバイルAMXページの作成

この章では、ADFモバイルAMXアプリケーション機能の作成方法について説明します。

この章では、次の項目について説明します。

- 第7.1項「ADFモバイルAMXアプリケーション機能の概要」

- 7.2項「タスク・フローの作成」

- 第7.3項「ビューの作成」

7.1 ADFモバイルAMXアプリケーション機能の概要

ADFモバイルAMXは、サポートされるすべてのプラットフォームで動作が同一となるアプリケーション機能を作成できる一連のUIコンポーネントを提供するADFモバイル内のサブフレームワークです。ADFモバイルAMXでは、コンポーネントをコンポーネント・パレットまたはデータ・コントロール・パレットからエディタにドラッグできるようにすることで、ADF Facesと同じ開発操作性が維持されていますが、それらのコンポーネントはADF Facesのものと同等ではなく、ADFモバイルAMXコンポーネントでは、ADF Facesコンポーネントの各プロパティおよび動作がサポートされていません。

注意:

モバイル・デバイスのインタフェースを開発する際には、画面領域が非常に限られているということを常に意識する必要があります。また、一部のモバイル・デバイスではタッチスクリーンが使用できません。

詳細は、次の項を参照してください。

- 第2.8項「ADFモバイルAMXアプリケーション機能」

- 第4.2.4項「ADFモバイルAMXアプリケーション用のアプリケーション・ワークスペースの作成」

- 第4章「ADFモバイル・アプリケーション開発の開始」

- 第8章「ADFモバイルAMXユーザー・インタフェースの作成」

- 第9章「バインディングの使用とデータ・コントロールの作成」

7.2 タスク・フローの作成

タスク・フローにより、ADFモバイルAMXページ間のナビゲーションを定義できます。JDeveloperのアプリケーション・ワークスペース(第4.2項「アプリケーション・ワークスペースの作成」を参照)を使用して、タスク・フローを設計することにより、ADFモバイルAMXアプリケーション機能のユーザー・インタフェースの作成を開始できます。標準JSFアプリケーションの場合と同様に、ADFモバイルAMXでは、タスク・フローの定義にナビゲーション・ケースとルールが使用されます。これらの定義は、ViewController-task-flow.xmlというデフォルト名のファイルに格納されています(第7.2.3項「ViewController-task-flow.xmlファイルについて」を参照)。

NavigationというADFモバイルのサンプル・アプリケーション(開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/SamplesディレクトリにあるPublicSamples.zipファイルにあります)には、循環ナビゲーション、ルーターなど様々なナビゲーション技術の使用方法が示されています。

ADFモバイルでは、バインド・タスク・フローとバインドなしタスク・フローの両方を持つADFモバイルAMXアプリケーション機能を作成できます。『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のタスク・フローのタイプに関する項で説明しているとおり、バインド・タスク・フローはタスク・フロー定義とも呼ばれ、アプリケーションの再利用可能な部分を表します。ADFモバイルでは、バインド・タスク・フローにはエントリ・ポイントが1つありますが、終了ポイントはありません。バインド・タスク・フローには、アクティビティと制御フロー・ルールの独自のコレクションに加え、独自のメモリー・スコープとマネージドBean存続期間が含まれます。

独自の機能のバインド・タスク・フローを作成するには、ADFモバイルAMXタスク・フロー・デザイナを使用します。ADFモバイルAMXタスク・フローを設計する際、JDeveloperでは、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のタスク・フローの作成に関する項で説明している、ADFタスク・フローの設計と同じ操作性が維持されます。タスク・フローの概要エディタと同様、このツールにはダイアグラマ(第7.2.4項「ADFモバイル・タスク・フロー・ダイアグラマについて」を参照)が含まれており、ここで、コンポーネント・エディタからアクティビティと制御フローをドラッグ・アンド・ドロップすることにより、タスク・フローを構築します。その後、プロパティ・インスペクタを使用して、これらのアクティビティとそれらの間の遷移を定義します。

タスク・フローがすでに作成されている場合を除き、ADFモバイルは、新しいADFモバイルAMXページが作成されると、自動的にデフォルトのバインドなしタスク・フロー(adfc-mobile-config.xmlファイル)を生成します。バインドなしタスク・フローの例は、開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルにあるNavigationというサンプル・アプリケーションのadfc-mobile-config.xmlファイルを参照してください。

詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFタスク・フローの作成に関する項を参照してください。

7.2.1 タスク・フローの作成方法

ナビゲーション・ダイアグラマを使用して、ADFモバイルAMXアプリケーション機能のタスク・フローを宣言的に作成します。ダイアグラマを使用すると、独自の機能でナビゲーションが機能するために必要なXMLメタデータが、JDeveloperによってViewController-task-flow.xmlファイル(デフォルト)に作成されます。

始める前に:

タスク・フローを設計するには、ADFモバイル・アプリケーションにビュー・コントローラ・プロジェクト・ファイル(第4章「ADFモバイル・アプリケーション開発の開始」を参照)が含まれている必要があります。

ADFモバイルでタスク・フローを作成するには、次の2つの方法があります。

- バインド・タスク・フローはadmf-feature.xmlファイルから作成できます。詳細は、第5.9.1項「アプリケーション・コンテンツの定義方法」を参照してください。

- JDeveloperの「新規ギャラリ」を使用できます。詳細は、「「新規ギャラリ」からタスク・フローを作成するには:」を参照してください。

「新規ギャラリ」からタスク・フローを作成するには:

1. JDeveloperのトップレベル・メニューから「ファイル」をクリックし、「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で「クライアント層」ノードを開き、「ADFモバイル」→「ADFモバイル・タスク・フロー」を選択します。(図7-1を参照)。「OK」をクリックします。

図7-1 新しいADFモバイル・タスク・フローの作成

3. 「ADFモバイル・タスク・フローの作成」ダイアログ(図7-2を参照)で、新しいタスク・フローのファイル名と場所を指定して「OK」をクリックし、図7-3に示すナビゲーション・ダイアグラマで<Name>-flow.xmlファイルを開きます。

注意:

タスク・フローは、ADFモバイル・アプリケーションのビュー・コントローラ・プロジェクト内で作成する必要があります。

注意:

JDeveloperでは、同じパターンですでに存在するタスク・フローの数に従い、タスク・フローの数が増分されます。

図7-2 「ADFモバイル・タスク・フローの作成」ダイアログ

4. 「コンポーネント・パレット」で「ADFモバイル・タスク・フロー」( 図7-3を参照)を選択し、使用するコンポーネントを選択して、これをダイアグラムにドラッグします。

ヒント:

「コンポーネント・パレット」が表示されない場合は、メイン・メニューから「ビュー」→「コンポーネント・パレット」を選択します。デフォルトでは、コンポーネント・パレットはJDeveloperの右上部に表示されます。

図7-3 新しい空白のタスク・フロー

JDeveloperでは、バインド・タスク・フローが作成され、新たに追加されたコンポーネントを使用してダイアグラムが再描画されます。

「概要」タブを開き、概要エディタを使用してナビゲーション・ルールとナビゲーション・ケースの作成することもできます。概要エディタを使用したナビゲーション作成の詳細は、[F1]キーで参照できます。

また、「ソース」エディタでページを直接編集して、タスク・フロー・ファイルに手動で要素を追加することもできます。「ソース」エディタでファイルを開くには、「ソース」タブをクリックします。

ADFモバイルAMX機能のナビゲーションが定義されると、ページを作成し、ナビゲーションを実行するコンポーネントを追加できます。ページでのナビゲーション・コンポーネントの使用方法の詳細は、7.2.8「制御フロー・ケースを使用してページ・ナビゲーションを有効にする方法」を参照してください。

ADFモバイルAMXアプリケーション機能のタスク・フローを定義すると、ビュー・ファイルをダブルクリックしてADFモバイルAMXビューにアクセスできます。詳細は、第7.3項「ビューの作成」を参照してください。

7.2.2 サポートされるアクティビティと制御フローについて

ADFモバイル・タスク・フロー・デザイナでは、表7-1に示すADFアクティビティと制御フローのサブセットをサポートしています。

表7-1 サポートされるアクティビティ

アクティビティ

説明

メソッド・コール

メソッド(通常はマネージドBean上のメソッド)を起動します。メソッド・コール・アクティビティは、ADFモバイルAMXアプリケーション機能の制御フローの任意の位置に配置し、制御フロー・ルールに基づいてロジックを起動できます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のメソッド・コール・アクティビティの使用に関する項を参照してください。

タスク・フローに含まれるメソッド・コールに渡すパラメータを指定することもできます。これらには、ADFモバイルAMXタスク・フロー内メソッド・コール・アクションの標準ADFパラメータが含まれます。デザイナを使用してメソッドを生成する場合、デザイナにより必要な引数およびタイプが追加されます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の次の項を参照してください。

- メソッド・コール・アクティビティの使用に関する項

- メソッド・パラメータおよび戻り値の指定方法に関する項

実行時にタスク・フローのメソッド・コールのパラメータを定義し、メソッド・コール自体にパラメータを渡してこれを使用できます。メソッド・コール・パラメータを渡す方法の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の次の項を参照してください。

- 複雑なタスク・フローの作成に関する項

- コマンド・コンポーネントを使用したパラメータ値の設定に関する項

- タスク・フロー・アクティビティの使用に関する項

- メソッド・パラメータおよび戻り値の指定方法に関する項

ルーター

式言語(EL)式を評価し、その式の値に基づいて結果を戻します。その後、このような結果を使用して、タスク・フローの他のアクティビティに制御をルーティングします。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のルーター・アクティビティの使用方法に関する項を参照してください。

ビュー

ADFモバイルAMXページを表示します。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のビュー・アクティビティの使用方法に関する項を参照してください。

タスク・フロー・コール

バインドなしタスク・フローまたはバインド・タスク・フローからバインド・タスク・フローをコールします。タスク・フロー・コール・アクティビティでは、同じADFモバイルAMXアプリケーション機能内にあるバインド・タスク・フローをコールできますが、別のADFモバイルAMXアプリケーション機能またはOracle ADFライブラリが追加された機能アーカイブ・ファイル(FAR)(第5.12項「機能アーカイブ・ファイルの使用」を参照)からバインド・タスク・フローをコールすることもできます。

タスク・フロー・コール・アクティビティは、タスク・フロー入力パラメータおよび戻り値をサポートします。

詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のタスク・フロー・コール・アクティビティの使用方法に関する項を参照してください。

7.2.3 ViewController-task-flow.xmlファイルについて

ViewController-task-flow.xmlファイルは、ADFモバイルAMXにおける、ADFのtask-flow-definition.xmlと同等のファイルで、ADFモバイルAMXタスク・フロー・コンポーネントを「コンポーネント・パレット」からダイアグラマにドラッグ・アンド・ドロップすることにより、ビュー(ADFモバイルAMXページ)間の相互作用を設計できます。

図7-4に、Products-flow.xmlというタスク・フロー・ファイル例を示します。このファイルでは、制御フローはproductsページからproductdetailsページに方向付けられます。productdetailsページからproductsページに戻るには、組込みの__backナビゲーションが使用されます。

図7-4 タスク・フロー・ファイル

7.2.4 ADFモバイル・タスク・フロー・ダイアグラマについて

ADFモバイル・タスク・フロー作成ユーティリティを使用してタスク・フローを作成すると、図7-4に示すように、タスク・フロー・ダイアグラムおよび「コンポーネント・パレット」が自動的に表示されます。タスク・フロー・ダイアグラムは、そこに「コンポーネント・パレット」または「アプリケーション・ナビゲータ」からのアクティビティおよびタスク・フローをドラッグ・アンド・ドロップできるビジュアル・エディタです。詳細は、第7.2.5項「ADFモバイル・アクティビティの追加方法」を参照してください。

7.2.5 ADFモバイル・アクティビティの追加方法

ADFアプリケーション開発などでは、タスク・フロー・ダイアグラマを使用して、アクティビティ、ビューおよび制御フローをドラッグ・アンド・ドロップします。

始める前に:

図7-5に示すように、「コンポーネント・パレット」から「ADFモバイル・タスク・フロー」を選択する必要があります。

ADFモバイル・タスク・フローにアクティビティを追加するには:

1. 「アプリケーション・ナビゲータ」で、タスク・フロー・ソース・ファイル(ViewController-task-flow.xmlなど)をダブルクリックし、図7-5に示すようなタスク・フロー・ダイアグラムと「コンポーネント・パレット」を表示します。ダイアグラマにはタスク・フロー・エディタが表示されます。「コンポーネント・パレット」には、ADFモバイル・タスク・フローで使用できるコンポーネントが自動的に表示されます。

2. アクティビティを「コンポーネント・パレット」からダイアグラムにドラッグします。ダイアグラムにビュー・アクティビティをドラッグすると、「ADFモバイルAMXファイルの作成」ウィザードを起動できます(第7.2.6項「ビュー・アクティビティの追加方法」を参照)。

図7-5 タスク・フロー・エディタのダイアグラマ

注意:

各タスク・フローに関連付けられているデフォルトのアクティビティがあります。

7.2.6 ビュー・アクティビティの追加方法

ビュー・アクティビティは、メタデータで実際のADFモバイルAMXページに関連付けられています。「コンポーネント・パレット」からドラッグ・アンド・ドロップすることによって、これを追加します。ビュー・アクティビティは、ADFモバイルAMXページを表示します。実際のADFモバイルAMXページは、「ダイアグラム」ウィンドウでビュー・アクティビティをダブルクリックして作成できます。ビュー・アクティビティは、「アプリケーション・ナビゲータ」のADFモバイルAMXファイルを概要エディタの「ダイアグラム」タブにドラッグ・アンド・ドロップして作成することもできます。

7.2.7 ワイルドカード制御フロー・ルールの追加方法

ADFモバイル・タスク・フローではワイルドカード制御フロー・ルールをサポートします。これは、後方ワイルドカード(foo*)や単一ワイルドカード文字のある制御フローfrom-activity-idを表します。ワイルドカード制御フロー・ルールは、「コンポーネント・パレット」からドラッグ・アンド・ドロップして追加できます。ワイルドカード制御フロー・ルールを構成するには、「プロパティ・インスペクタ」を使用します。

7.2.8 制御フロー・ケースを使用してページ・ナビゲーションを有効にする方法

制御がアクティビティから次のアクティビティに渡される方法を指定する制御フロー・ケース・コンポーネントを使用してナビゲーションを作成できます。制御フローを作成するには、「コンポーネント・パレット」から「制御フロー・ケース」を選択します。次に、制御フロー・ケースをソース・アクティビティに接続し、さらにターゲット・アクティビティに接続します。ソースおよびターゲット・アクティビティを接続すると、JDeveloperでは、次のものが作成されます。

- control-flow-rule: from-activity-idを使用してソース・アクティビティを識別します。

- control-flow-case: to-activity-idを使用してターゲット・アクティビティを識別します。

ADFモバイル・タスク・フロー・ダイアグラムで制御フロー・ケースを直接定義するには:

1. 「アプリケーション・ナビゲータ」で、タスク・フロー・ソース・ファイルをダブルクリックして、タスク・フロー・ダイアグラムを表示します。

2. 「コンポーネント・パレット」から「制御フロー・ケース」を選択します。

3. ダイアグラムで、ソース・アクティビティをクリックし、次にターゲット・アクティビティをクリックします。ダイアグラムに制御フロー・ケースが追加されます。アクティビティ間に追加された各線は、制御フロー・ケースを表します。from-outcomeには、UIコンポーネントのaction属性に指定された値と照合される値が含まれています。

4. from-outcomeを変更するには、ダイアグラムの制御フローの隣のテキストを選択します。デフォルトでは、これはワイルドカード文字です。

5. from-activity-id(ソース・アクティビティの識別子)やto-activity-id(ターゲット・アクティビティの識別子)を変更するには、ダイアグラムの矢印のどちらかの端を新規のアクティビティにドラッグします。
詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のコントロール・フロー・ルールの作成時の処理に関する項を参照してください。

7.2.9 UIコンポーネントを使用したアクション結果の指定方法

「プロパティ・インスペクタ」を使用して、次に示すUIコンポーネントのいずれかのaction属性を該当する制御フロー・ケースfrom-outcomeに設定して次のタスク・フロー・アクティビティに導くことにより、アクション結果を指定できます。

- コマンド・ボタン(第8.3.5項「ボタンの使用方法」を参照)

- コマンド・リンク(第8.3.6項「リンクの使用方法」を参照)

- リスト・アイテム

UIコンポーネントの「アクション」フィールド(図7-6を参照)を使用して、特定のADFモバイルAMXページの1つ以上のタスク・フローで定義される可能性のあるアクション結果のリストから選択を行います。

図7-6 アクションの設定

戻るアクション(__back)は、各リストに自動的に追加され、前に参照したページへのナビゲーションを可能にします。

注意:

ADFモバイルAMXページは、バインド・タスク・フローとバインドなしタスク・フローの両方で参照でき、その場合、両方のタスク・フローからのアクション結果がアクション選択リストに含まれます。

7.2.10 マネージドBeanの作成および参照方法

独自のADFモバイル・アプリケーションでマネージドBeanを作成および使用して、追加データを格納したり、カスタム・コードを実行できます。JDeveloperの通常の編集メカニズムを使用して、マネージドBeanを参照したり、適用可能なフィールドに対してマネージドBeanへの参照を作成できます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のFusion WebアプリケーションでのマネージドBeanの使用に関する項を参照してください。

図7-7 は、「プロパティ・インスペクタ」のactionプロパティの「編集」オプションを示しています。このオプションをクリックすると、図7-8に示す「プロパティの編集」ダイアログが表示されます。

図7-7 「編集」ダイアログ

図7-8 アクションの「プロパティの編集」ダイアログ

表7-5に、「プロパティ・インスペクタ」の「編集」オプションが使用可能なADFモバイルAMX属性をリストします。

表7-2 編集可能な属性

プロパティ

要素

binding

actionListener

action

commandButton

actionListener

commandButton

action

commandLink

actionListener

commandLink

action

listItem

actionListener

listItem

valueChangeListener

inputDate

valueChangeListener

inputNumberSlider

valueChangeListener

inputText

valueChangeListener

selectBooleanCheckbox

valueChangeListener

selectBooleanSwitch

valueChangeListener

selectManyCheckbox

valueChangeListener

selectOneButton

valueChangeListener

selectOneChoice

valueChangeListener

selectOneRadio

rangeChangeListener

listView

selectionListener

listView

その他のどのプロパティに対しても「編集」をクリックすると同様のダイアログが表示されますが、図7-9に示すように「アクション結果」オプションはありません。

図7-9 アクション・リスナーの「プロパティの編集」ダイアログ

このダイアログは、マネージドBeanを作成するか、actionプロパティに使用可能なアクション結果を選択できることを示しています。

図7-8に示された「アクション結果」リストには、特定のADFモバイルAMXページが属するすべてのタスク・フローからのアクション結果が含まれています。また、このリストには、前に参照したページに戻るための__backナビゲーション結果が含まれています(詳細は第7.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください)。ページがタスク・フローの一部ではない場合、__backが「アクション結果」リストで使用可能な唯一の結果です。使用可能なアクション結果のいずれかを選択し、「OK」をクリックすると、アクション・プロパティ値は、適切なEL式(commandButtonの場合、次のとおり)で更新されます。

<amx:commandButton action="goHome"/>

「メソッド・バインディング」オプション(図7-8を参照)では、新しいマネージドBeanクラスを作成するか、既存のマネージドBeanクラスを選択できます。

新しいマネージドBeanクラスを作成するには:

1. 「マネージドBean」フィールドの横にある「新規」をクリックし、図7-10に示す「マネージドBeanの作成」ダイアログを開きます。

図7-10 「マネージドBeanの作成」ダイアログ・ボックス

ADFモバイルでは、次のスコープがサポートされています。

- application

- view

- pageFlow

ADFモバイル・アプリケーションまたはADFモバイルAMXアプリケーションに対してマネージドBeanを宣言すると、マネージドBeanはインスタンス化されて適切なスコープ内で識別され、Beanのプロパティが解決されてそのメソッドがELを介してコールされます。詳細は、第9.2項「ELサポートの理解」を参照してください。

2. マネージドBeanおよびクラス名を指定し、「OK」をクリックします。
例7-1に、新たに作成されたマネージドBeanクラスを示します。このADFモバイルAMXページが含まれるタスク・フローが、Beanを参照するように更新されます。

例7-1 新しいマネージドBeanクラス

<managed-bean id="__3">
<managed-bean-name>MyBean</managed-bean-name>
<managed-bean-class>mobile.MyBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

注意:

特定のADFモバイルAMXページがバインド・タスク・フローおよびバインドなしタスク・フローの一部である場合、これら両方のタスク・フローがマネージドBeanエントリで更新されます。

3. 「メソッド」フィールドの横にある「新規」をクリックし(図7-8および図7-9を参照)、図7-11に示す「メソッドの作成」ダイアログを開きます。このダイアログを使用して、マネージドBeanメソッド名を指定します。

図7-11 「メソッドの作成」ダイアログ

完了すると、選択したプロパティ値は、適切なEL式(commandButtonの場合は次のとおり)で更新されます。

<amx:commandButton action="#{MyBean.getMeHome}"/>

マネージドBeanクラスも、例7-2に示すとおり、新たに作成されたメソッドを含むように更新されます。

例7-2 マネージドBeanクラスの新しいメソッド

package mobile;

public class MyBean {
public MyBean() {
}

public String getMeHome() {
// Add event code here...
return null;
}
}

既存のマネージドBeanを選択するには:

1. 図7-12に示す「マネージドBean」リストから選択を行います。

図7-12 マネージドBeanの選択

アクション結果と同様、マネージドBeanリストには、このADFモバイルAMXページが含まれるすべてのタスク・フローからのマネージドBeanが移入されます。

注意:

ADFモバイルAMXページがタスク・フローの一部ではない場合でも、マネージドBeanは作成できます。

詳細は、次の項を参照してください。

- 第9.2.4.2項「ADFマネージドBean」

- JavaDemo。これは開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルにあるADFモバイルのサンプル・アプリケーションです。

7.2.11 ページ遷移スタイルの指定方法

タスク・フローでページ遷移スタイルを定義することにより、ビューから別のビューへのADFモバイルAMXページの遷移方法指定できます。ADFモバイルAMXページの遷移動作は次のようにできます。

- フェード・イン

- 左からスライド・イン

- 右からスライド・イン

- 下からスライド・アップ

- 上からスライド・ダウン

- 下からフリップ・アップ

- 上からフリップ・ダウン

- 左からフリップ

- 右からフリップ

- なし

例7-3のようにcontrol-flow-case(制御フロー・ケース・コンポーネント)のtransition属性を変更することによって、遷移スタイルを設定します。

例7-3 遷移スタイルの設定

<control-flow-rule id="__1">
<from-activity-id>products</from-activity-id>
<control-flow-case id="__2">
<from-outcome>details</from-outcome>
<to-activity-id>productdetails</to-activity-id>
<transition>fade</transition>
</control-flow-case>
</control-flow-rule>

「プロパティ・インスペクタ」で、transition属性は、図7-13に示すように「動作」の下にあります。デフォルトの遷移スタイルはslideLeftです。

図7-13 「プロパティ・インスペクタ」での遷移スタイルの設定

7.3 ビューの作成

ADFモバイルAMXビューの作成は、次のようにして開始できます。

- ADFモバイルAMXページの構造を理解する

- プレビューを使用する

- ADFモバイルAMXページにコンポーネントをドラッグ・アンド・ドロップする

- ビューにデータ・コントロールを追加する

7.3.1 ADFモバイルAMXページの使用方法

ADFモバイルAMXページは、Oracle ADF FacesのJSPXファイルに類似したXMLファイルで表されます。

7.3.1.1 ADFモバイルAMXページ構造の解釈

次にADFモバイルAMXファイルの基本構造を示します。

<amx:view>
<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="ot1" value="Welcome"/>
…
</amx:facet>
</amx:panelPage>
</amx:view>

データ可視化コンポーネント(第8.5項「データ視覚化の指定」を参照)を除き、UI要素は<amx>名前空間の下で宣言されます。

詳細は、第7.3.1.3項「ADFモバイルAMXページの作成時の処理」を参照してください。

7.3.1.2 ADFモバイルAMXページの作成

ADFモバイルAMXファイルは、ADFモバイル・アプリケーションのビュー・コントローラ・プロジェクトに含まれています。これらのファイルは、「ADFモバイルAMXページの作成」ダイアログを使用して作成します。

ADFモバイルでは、ADFモバイルAMXページを作成する別の方法を2通り提供しています。

- 「新規ギャラリ」から

- 既存のタスク・フローから

始める前に:

ADFモバイルAMXページを作成するには、ADFモバイル・アプリケーションにビュー・コントローラ・プロジェクト・ファイル(第4章「ADFモバイル・アプリケーション開発の開始」を参照)が含まれている必要があります。

「新規ギャラリ」からADFモバイルAMXページを作成するには:

1. JDeveloperのトップレベル・メニューから「ファイル」をクリックし、「新規」→「ギャラリから」を選択します。

2. 「新規ギャラリ」で「クライアント層」ノードを開き、「ADFモバイル」→「ADFモバイルAMXページ」を選択します(図7-14を参照)。「OK」をクリックします。

図7-14 ADFモバイルAMXページの作成

3. 図7-15に示すように、「ADFモバイルAMXページの作成」ダイアログで、新しいファイルの名前と必要に応じて場所を入力します。

4. オプションで、ページ・レイアウトの一部としてどのファセットを新しいADFモバイルAMXページに含めるかを選択することもできます。

- ヘッダー

- プライマリ

- セカンダリ

- フッター

詳細は、第7.3.1.3項「ADFモバイルAMXページの作成時の処理」および第8.2.6項「ファセット・コンポーネントの使用方法」を参照してください。

ファセットを選択または選択解除すると、変更されたページの外観を反映するよう、ページを表すイメージは動的に変わります。

図7-15「ADFモバイルAMXページの作成」ダイアログ

注意:

ADFモバイルでは、ファセットの選択を持続し、後に続く「ADFモバイルAMXページの作成」ダイアログが開かれるたびにその選択が適用されます。

5. 「ADFモバイルAMXページの作成」ダイアログで、「OK」をクリックします。

タスク・フローのビュー・コンポーネントからADFモバイルAMXページを作成するには:

1. ダイアグラマでタスク・フロー・ファイルを開きます(図7-5「フロー・エディタのダイアグラマ」、第7.2.1項「タスク・フローの作成方法」および第7.2.4項「ADFモバイル・タスク・フロー・ダイアグラマについて」を参照)。

2. タスク・フローのビュー・コンポーネントをダブルクリックして図7-15に示す「ADFモバイルAMXページの作成」ダイアログを開き、新しいファイルの名前と必要に応じて場所を入力します。「OK」をクリックします。

7.3.1.3 ADFモバイルAMXページの作成時の処理

「ADFモバイルAMXページの作成」ダイアログを使用してADFモバイルAMXページを作成すると、JDeveloperは物理ファイルを作成し、これをビュー・コントローラ・プロジェクトのWeb Contentディレクトリに追加します。

図7-16に示す「アプリケーション・ナビゲータ」では、Web Contentノードに、新たに作成されたorder.amxというADFモバイルAMXファイルが含まれています。

図7-16 「アプリケーション・ナビゲータ」のADFモバイルAMXファイル

JDeveloperは、コンポーネント・ライブラリをインポートし、ページを表示するために必要なコードの追加も行います。このコードは、図7-16に示す「ソース」エディタに表示されます。

図7-17は、ページの作成時に「ADFモバイルAMXページの作成」ダイアログのページ・ファセットセクションにリストされたすべてのファセット・タイプを選択した場合に、「プレビュー」ペインおよび生成されたADFモバイルAMXコードがどのようになるかを示しています。

図7-17 すべてのファセットが含まれるADFモバイルAMXページ

すべてのファセットを選択して作成したページ(図7-17を参照)では、次の点に注意してください。

- ヘッダーは出力テキスト・コンポーネントで作成されます。これはこのコンポーネントが通常ページ・タイトルに使用されるためです。

- プライマリおよびセカンダリのアクションは、ボタン・コンポーネントで作成されます。これは、これが通常のパターンであるためです。

- フッターの場合、1つだけ群を抜いているパターンはないため、デフォルトでは出力テキスト・コンポーネントで作成されます。これは、このコンポーネントがいくつかのパターンで使用されており、JDeveloperが監査違反のある初期コードを生成することを回避できるためです。

- ヘッダー・ファセットを追加せずにプライマリまたはセカンダリのいずれかのアクションを追加しても、ヘッダー・セクションは「ADFモバイルAMXページの作成」ダイアログのページ・ファセットセクションに表示されます。

図7-18に、「ADFモバイルAMXページの作成」ダイアログのファセットが選択されていないページ・ファセットセクション、「プレビュー」ペインおよび生成されたADFモバイルAMXコード(図7-16にも示されています)を示します。

図7-18 ファセットがないADFモバイルAMXページ

7.3.1.4 UIエディタの使用方法

最初にJDeveloperに表示されるとき、ページは「ソース」エディタに表示されます。WYSIWYG環境でページを表示するには、「プレビュー」ペイン(「プレビュー」タブをクリックしてアクセスします)を使用します。図7-19は、order.amxという新たに作成されたADFモバイルAMXページで選択された「プレビュー」タブを示しています。このページは、まだADFモバイルAMX UIコンポーネントやデータ・コントロールが移入されていないため、空です。

図7-19 新たに作成されたページの「プレビュー」ペイン

図7-19に示す「プレビュー」ペインのツールバーを使用して、次のことができます。

- 「ページのリフレッシュ」をクリックすると、ADFモバイルAMXページの表示をリフレッシュできます。

- 「ページのロードを中止」をクリックすると、ページのロードを中止できます。

- ドロップダウンリストから別のフォーム・ファクタを選択すると、ページのフォーム・ファクタを変更できます。フォーム・ファクタの詳細は、第3.3.1.1項「フォーム・ファクタに応じた環境の構成」を参照してください。

- ドロップダウン・リストから別のパーセント値を選択すると、表示のスケーリングを変更できます。モバイル・デバイスは様々なサイズおよび密度で表示されるため、「プレビュー」ペインでは、ADFモバイルAMXページでのスケーリングの効果を確認することができます。

注意:

スケーリングは縦と横の両方のモードで使用できます。

- 「縦向きの表示」または「横向きの表示」を選択することにより、表示の向きをそれぞれ横または縦に変更できます。

- 使用可能なアプリケーション機能のドロップダウン・リストからADFモバイルAMXページの機能コンテンツを選択します。デフォルトでは、「機能コンテンツが選択されていません」が表示されます。

「ソース」エディタでページのソースを表示するには、図7-16「「アプリケーション・ナビゲータ」のADFモバイルAMXファイル」に示されている「ソース」タブをクリックします。JDeveloperの左下部にある「構造」ウィンドウ(図7-16および図7-19)には、ページが階層形式で表示されます。詳細は、第7.3.2.2項「「プレビュー」の使用方法」を参照してください。

7.3.1.5 ページ定義へのアクセス

ADFモバイルAMXでは、JDeveloperのページ定義に移動機能をサポートしており、バインディング情報を迅速に見つけて編集できるようにするポップアップ・メニューを使用することで、ADFモバイルAMXページのページ定義にナビゲートできます。

次の場所から「ページ定義に移動」オプションを含むポップアップ・メニューを起動できます。

- ソース・エディタ(図7-20)

図7-20 「ソース」エディタからの「ページ定義に移動」

- アプリケーション・ナビゲータ(図7-21)

図7-21 「アプリケーション・ナビゲータ」からの「ページ定義に移動」

- 「構造」ペイン(図7-22)

図7-22 「構造」ペインからの「ページ定義に移動」

さらに、図7-23のように、メイン・メニューの「ツール」→「プリファレンス」の下で定義されている「ページ定義に移動」ショートカット・キーを使用して、ページ定義ファイルを開くこともできます。

図7-23 「プリファレンス」から「ページ定義」を開く

7.3.2 ADFモバイルAMXページへのUIコンポーネントおよびデータ・コントロールの追加方法

ADFモバイルAMXページを作成すると、ページへのADFモバイルAMX UIコンポーネントおよびデータ・コントロールの追加を開始できます。

7.3.2.1 UIコンポーネントの追加

「コンポーネント・パレット」を使用して、ADFモバイルAMXコンポーネントをページ上にドラッグ・アンド・ドロップできます。コンポーネントを追加すると、必要な宣言的ページ・コードが追加され、各コンポーネント属性に特定の値が設定されます。

「コンポーネント・パレット」には、ADFモバイルAMXコンポーネントがカテゴリ別に表示されます(図7-24を参照)。

- 一般コントロール

- テキストおよび選択

- データ・ビュー

- レイアウト。次のサブカテゴリがあります。

- 対話型コンテナおよびヘッダー

- セカンダリ・ウィンドウ

- コア構造

- 操作。次のサブカテゴリがあります。

- 動作

- リスナー

- バリデータおよびコンバータ

特定のコンポーネントの追加および使用については、第8.3項「UIコンポーネントの作成と使用方法」を参照してください。

始める前に:

ADFモバイル・アプリケーションには、ビュー・コントローラ・プロジェクトが含まれている必要があります。このプロジェクトには、ADFモバイルAMXページまたはADFモバイルAMXページのタスク・フロー(ここからページを作成します)が含まれている場合と含まれていない場合があります。

「ADFモバイルAMXページの作成」ダイアログを起動するには、第7.3.1.2項「ADFモバイルAMXページの作成」で説明したように、タスク・フロー・ダイアグラムでビュー・アイコンをダブルクリックするか、「新規ギャラリ」から「クライアント層」→「ADFモバイル」→「ADFモバイルAMXページ」を選択します。

UIコンポーネントをページに追加するには:

1. 「ソース」エディタでADFモバイルAMXページを開きます(デフォルト)。

2. 「コンポーネント・パレット」で、図7-24に示すように、メニューを使用して「ADFモバイルAMX」を選択します。

ヒント:

「コンポーネント・パレット」が表示されない場合は、メインのJDeveloperメニューから「ビュー」→「コンポーネント・パレット」を選択します。デフォルトでは、コンポーネント・パレットはJDeveloperの右上部に表示されます。

図7-24 ADFモバイルAMXの「コンポーネント・パレット」

3. 使用するコンポーネントを選択し、「ソース」エディタまたは「構造」ウィンドウにドラッグ・アンド・ドロップします。「プレビュー」ペインにコンポーネントをドロップすることはできません。

注意:

ADFモバイルAMXページの構築の際、UIコンポーネントは、「パネル・グループ・レイアウト」などのUIコンテナにのみドロップできます。

新たに追加されたコンポーネントを使用して、JDeveloperで「プレビュー」ペインのページが再描画されます。

7.3.2.2 「プレビュー」の使用方法

ADFモバイルAMXファイルを使用してユーザー・インタフェースを構築する際、JDeveloperのプレビューでは、iOSとAndroidの両方のプラットフォームに対してWYSIWYGサポートを提供します。図7-25に示すように、ビューを分割した状態で、ADFモバイルAMXコンポーネントをADFモバイルAMXファイルに追加すると、コード・ビューは「ソース」エディタから、UIビューは「プレビュー」ペインから同時に確認できます。これにより、ソースを変更してすぐに、iOSとAndroidの両方のプラットフォームで、そのアプリケーションの変更されたルック・アンド・フィールを表示できます。

図7-25 デザイン・ビューとソース・ビューの分割

デザイン・ビューとソース・ビューを同時に確認できる以外に、複数のデザイン・ビューを同時に開いて使用し、それぞれを異なるプラットフォームおよび画面サイズに設定できます。様々なデバイスのデザイン・ビューの組合せを開くことで、様々なプラットフォームおよびフォーム・ファクタに対し、同時に、異なる向きでアプリケーションを開発できます。図7-26は、上段がiPhone Standard、下段が50%のスケーリングのiPadの分割画面を示しています。「プレビュー」ペインは、JDeveloperのデフォルトの分割機能を使用して分割できます。

図7-26 複数のデザイン・ビュー

注意:

無効なADFモバイルAMXファイルであっても、ADFモバイルAMXページはレンダリングされます。エラーはコンポーネントのエラー・アイコンで示されます。マウスをエラー・アイコンの上に移動すると、エラーの詳細を表示できます。

7.3.2.3 UIコンポーネントの構成

UIコンポーネントのページへのドロップ後、「プロパティ・インスペクタ」(デフォルトではJDeveloperの右下部に表示)を使用して、各コンポーネントの属性値を設定できます。

ヒント:

「プロパティ・インスペクタ」が表示されない場合は、JDeveloperのメイン・メニューから「ウィンドウ」→デフォルトのファクトリ設定にリセットを選択します。

図7-27に、出力テキスト・コンポーネントの属性を表示している「プロパティ・インスペクタ」を示します。

図7-27 プロパティ・インスペクタ

コンポーネント属性の設定手順:

1. 属性を設定するコンポーネントを選択します。「構造」ウィンドウでコンポーネントを選択するか、「ソース」エディタで直接そのタグを選択することができます。

2. プロパティ・インスペクタで、設定する属性が含まれるセクションを開きます。

ヒント:

一部の属性は、複数のセクションに表示されます。あるセクションで値を入力または変更すると、他のセクションでもその値が変更されます。「プロパティ・インスペクタ」の最上部の検索フィールドに属性名を入力して、属性を検索できます。

3. 「プロパティ・インスペクタ」で、フィールドに値を直接入力するか、フィールドにリストがある場合はそのリストを使用して、値を選択します。フィールドの右にあるリストを使用して、値の設定に使用できるツールを含むポップアップを起動することもできます。これらのツールは、特定のプロパティ・エディタ(「編集」を選択して開く)または値のEL式の作成に使用できる式ビルダー(「式ビルダー」を選択して開く)です。式ビルダーの使用の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』のEL式の作成に関する項を参照してください。

プロパティ・インスペクタを使用して属性値を設定または変更すると、入力された値に合致するよう、属性のページ・ソースがJDeveloperで自動的に変更されます。

ヒント:

「ソース」エディタでページを直接編集することで、いつでも属性値を変更できます。「ソース」エディタにページを表示するには、ページの下部の「ソース」タブをクリックします。

7.3.2.4 データ・コントロールのビューへの追加

データ・コントロール要素を「データ・コントロール」パネルからドラッグし、「構造」ウィンドウまたは「ソース」エディタのいずれかにドロップすることで、ADFモバイルAMXビューでデータバインドされたUIコンポーネントを作成できます。「データ・コントロール」パネルからアイテムをドラッグしてこれらのいずれかの場所にドロップすると、ドロップしたアイテムに使用できるデフォルトUIコンポーネントのポップアップ・メニューが表示されます。目的のUIコンポーネントを選択すると、そのコンポーネントがADFモバイルAMXページに挿入されます。また、関連ページ定義ファイルにバインディング情報が作成されます。そのようなファイルが存在しない場合は、JDeveloperによって作成されます。ADFモバイルには、データ・コントロールのドロップ用のビジュアル・インジケータが用意されており、新しいデータ・コントロールの場所を知らせます。

注意:

データ・コントロールは、基礎となるXMLスキーマで許可された場所にのみドロップできます。

方法によっては、様々なタイプのデータ・コントロールをADFモバイルAMXページの「構造」ウィンドウに挿入できます。

コレクションの属性をドロップすることにより、様々な入力および出力コンポーネントを作成できます。ページにデータ・コントロール操作をドロップすることにより、ボタンやリンクも作成できます。

これらの各操作に対し、ADFモバイルAMXボタンにそれぞれのアクション・リスナーが追加されます。actionListenerのEL式は、操作をOracle ADF Facesアプリケーションにドロップしたときに作成したEL式と同じです。

データ・コントロールの属性および操作は、次の1つ以上のADFモバイルAMX UIコンポーネントとしてドロップできます(第8.3項「UIコンポーネントの作成と使用方法」を参照してください)。

- ボタン

- リンク

- 入力日

- ラベル付入力日

- 入力テキスト

- ラベル付入力テキスト

- 出力テキスト

- ラベル付出力テキスト

- イテレータ

- リスト・アイテム

- リスト・ビュー

- ブール・チェック・ボックスの選択

- ブール・スイッチの選択

- ボタンを1つ選択

- 選択肢を1つ選択

- ラジオ・ボタンを1つ選択

- チェック・ボックスを複数選択

- 選択肢を複数選択

- 日時の変換

- 数値の変換

- フォーム

- 読取り専用フォーム

- パラメータ・フォーム

次の日付および数値タイプがサポートされています。

- java.util.Date

- java.sql.Timestamp

- java.sql.Date

- java.lang.Number

- java.lang.Integer

- java.lang.Long

- java.lang.Float

- java.lang.Double

7.3.2.4.1 属性のドラッグ・アンド・ドロップ

ADFモバイルAMXページにすでにパネル・フォーム・レイアウト・コンポーネントが含まれているか、すべてのフィールドを追加する必要がない場合は、データ・コントロールから個別の属性をドロップできます。属性タイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

- 日付: このカテゴリは、ADFモバイル入力日およびラベル付ADFモバイル入力日のコントロールを作成するためのオプションを提供します。図7-28は、属性を「データ・コントロール」パネルからADFモバイルAMXページの「構造」ウィンドウにドラッグすると表示される日付コントロールを追加するためのポップアップ・メニューを示しています。

図7-28 日付コントロールのポップアップ・メニュー

- 単一選択: このカテゴリは、次のコントロールを作成するためのオプションを提供します。

- ADFモバイル・ボタンを1つ選択

- ADFモバイル選択肢を1つ選択

- ADFモバイル・ラジオ・ボタンを1つ選択

- ADFモバイル・ブール・チェック・ボックスの選択

- ADFモバイル・ブール・スイッチの選択

図7-29は、属性を「データ・コントロール」パネルからADFモバイルAMXページの「構造」ウィンドウにドラッグすると表示される選択コントロールを追加するためのポップアップ・メニューを示しています。

図7-29 選択コントロールのポップアップ・メニュー

既存のADFモバイルAMXページを使用していて、「ADFモバイル・ボタンを1つ選択」オプションまたはADFモバイル選択肢を1つ選択オプションを選択すると、適切な「リスト・バインディングの編集」ダイアログが表示されます(図7-30を参照してください)。まったく新しいADFモバイルAMXページにコントロールをドロップした場合には、かわりに「アクション・バインディングの編集」ダイアログが開かれます。「OK」をクリックすると、「リスト・バインディングの編集」が開かれます。

注意:

単一選択またはブール選択のコンポーネントとして任意のデータ・コントロール属性をドロップするたびに、それぞれ「リスト・バインディングの編集」または「Booleanバインディングの編集」が表示されます。

図7-30 ボタンを1つ選択コントロールおよび選択肢を1つ選択コントロールの「リスト・バインディングの編集」ダイアログ

「ADFモバイル・ラジオボタンを1つ選択」を選択すると、図7-31に示すような、別の「リスト・バインディングの編集」ダイアログが表示されます。

図7-31 ラジオ・ボタンを1つ選択コントロールの「リスト・バインディングの編集」ダイアログ

「ADFモバイル・ブール・チェックボックスの選択」オプションまたは「ADFモバイル・ブール・スイッチの選択」オプションを選択すると、図7-32に示すような、別の「リスト・バインディングの編集」ダイアログが表示されます。

図7-32 ブール・チェック・ボックスおよびスイッチの選択コントロールの「リスト・バインディングの編集」ダイアログ

- テキスト: このカテゴリは、次のコントロールを作成するためのオプションを提供します。

- ADFモバイル入力テキスト

- ラベル付ADFモバイル入力テキスト

- ADFモバイル出力テキスト

- ラベル付ADFモバイル出力テキスト

図7-29は、属性を「データ・コントロール」パネルからADFモバイルAMXページの「構造」ウィンドウにドラッグすると表示される選択コントロールを追加するためのポップアップ・メニューを示しています。

図7-33 テキスト・コントロールのポップアップ・メニュー

7.3.2.4.2 操作のドラッグ・アンド・ドロップ

属性に加え、操作やカスタム・メソッドもドラッグ・アンド・ドロップできます。操作やメソッドのタイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

- 操作: データ・コントロール操作のカテゴリです。次のオプションがあります(図7-34を参照)。

- ADFモバイル・ボタン

- ADFモバイル・リンク

- ADFモバイル・パラメータ・フォーム

図7-34 操作のポップアップ・メニュー

注意:

操作またはメソッドを、リスト・ビュー・コントロールの子としてドロップすると、ポップアップ・メニューは表示されず、リスト・アイテムが自動的に作成されます。これは、リスト・ビュー・コントロールの直接の子としてドロップできる有効なコントロールが他にないためです。生成されるリスト・アイテムに対して、JDeveloperにより次のようなバインディングが作成されます。

<amx:listItem actionListener="#{bindings.getLocation.execute}"/>

- メソッド: カスタム・メソッドのカテゴリです。次のオプションがあります(図7-34を参照)。

- ADFモバイル・ボタン

- ADFモバイル・リンク

- ADFモバイル・パラメータ・フォーム

図7-35 メソッドのポップアップ・メニュー

「ADFモバイル・パラメータ・フォーム」オプションでは、フォームに挿入するメソッドまたは操作の引数に加え、各引数に対してそれぞれのコントロールも選択できます(図7-36を参照)。

図7-36 「フォーム・フィールドの編集」ダイアログ

「フォーム・フィールドの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<amx:panelFormLayout id="pfl1">
<amx:inputText id="it1"
value="#{bindings.actionEvent.inputValue}"
label="#{bindings.actionEvent.hints.label}"
required="#{bindings.actionEvent.hints.mandatory}"
maximumLength="#{bindings.actionEvent.hints.precision}"/>
</amx:panelFormLayout>
<amx:commandButton id="cb1"
actionListener="#{bindings.cleanInputParameter.execute}"
text="cleanInputParameter"
disabled="#{!bindings.cleanInputParameter.enabled}"/>

生成されるバインディングの詳細は、第7.3.2.4.4項「生成されるバインディングについて」を参照してください。

次にADFモバイル・パラメータ・フォームでサポートされるコントロールのタイプを示します。

- ADFモバイル入力日

- ラベル付ADFモバイル入力日

- ADFモバイル入力テキスト

- ラベル付ADFモバイル入力テキスト

- ラベル付ADFモバイル出力テキスト

7.3.2.4.3 コレクションのドラッグ・アンド・ドロップ

コレクションをドラッグ・アンド・ドロップできます。コレクションのタイプによって、次のように様々なデータ・バインディング・メニュー・オプションが提供されます。

- 複数選択: このカテゴリは、複数選択コントロールを作成するためのオプションを提供します。このカテゴリでは次のコントロールが作成されます(図7-37を参照)。

- ADFモバイル・チェック・ボックスを複数選択

- ADFモバイル選択肢を複数選択

図7-37 複数選択コントロールのポップアップ・メニュー

- フォーム: このカテゴリは、ADFモバイルAMXパネル・フォーム・コントロールの作成に使用されます。このカテゴリでは次のコントロールが作成されます(図7-38を参照)。

- ADFモバイル・フォーム

- ADFモバイル読取り専用フォーム

図7-38 フォーム・コントロールのポップアップ・メニュー

作成するフォームのタイプとして「ADFモバイル・フォーム」を選択すると、JDeveloperウィザードが起動され、ここで、フォームに挿入するフィールドに加え、各フィールドに対してそれぞれのコントロールも選択できます(図7-39を参照)。

図7-39 ADFモバイル・フォームの「フォーム・フィールドの編集」ダイアログ

「フォーム・フィールドの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<amx:panelFormLayout id="pfl1">
<amx:inputDate id="id1"
value="#{bindings.timeStamp.inputValue}"
required="#{bindings.timeStamp.hints.mandatory}">
<amx:convertDateTime pattern="#{bindings.timeStamp.format}"/>
</amx:inputDate>
<amx:inputText id="it1"
value="#{bindings.speed.inputValue}"
simple="true"
required="#{bindings.speed.hints.mandatory}"
maximumLength="#{bindings.speed.hints.precision}"/>
<amx:inputText id="it2"
value="#{bindings.heading.inputValue}"
label="#{bindings.heading.hints.label}"
required="#{bindings.heading.hints.mandatory}"
maximumLength="#{bindings.heading.hints.precision}"/>
<amx:panelLabelAndMessage id="plm1"
label="#{bindings.latitude.hints.label}">
<amx:outputText id="ot1" value="#{bindings.latitude.inputValue}"/>
</amx:panelLabelAndMessage>
<amx:inputDate id="it3"
value="#{bindings.timeStamp.inputValue}"
label="#{bindings.timeStamp.hints.label}"
required="#{bindings.timeStamp.hints.mandatory}">
<amx:convertDateTime pattern="#{bindings.timeStamp.format}"/>
</amx:inputDate>
</amx:panelFormLayout>

生成されるバインディングの詳細は、第7.3.2.4.4項「生成されるバインディングについて」を参照してください。

次にADFモバイル・フォームでサポートされるコントロールを示します。

- ADFモバイル入力日

- ラベル付ADFモバイル入力日

- ADFモバイル入力テキスト

- ラベル付ADFモバイル入力テキスト

- ラベル付ADFモバイル出力テキスト

注意:

ADFモバイル出力テキストは、ADFモバイル・スキーマで定義される有効なパネル・フォーム・レイアウトの子要素ではないため、サポートされていません。

作成するフォームのタイプとして「ADFモバイル読取り専用フォーム」を選択すると、JDeveloperウィザードが起動され、ここで、フォームに挿入するフィールドに加え、各フィールドに対してそれぞれのコントロールも選択できます(図7-40を参照)。

図7-40 ADFモバイル読取り専用フォームの「フォーム・フィールドの編集」ダイアログ

「フォーム・フィールドの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<amx:panelFormLayout id="pfl1">
<amx:panelLabelAndMessage id="plm1" label="#{bindings.AssetNo.hints.label}">
<amx:outputText id="ot1" value="#{bindings.AssetNo.inputValue}"/>
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="plm2" label="#{bindings.Item.hints.label}">
<amx:outputText id="ot2" value="#{bindings.Item.inputValue}"/>
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="plm3"
label="#{bindings.Description.hints.label}">
<amx:outputText id="ot3" value="#{bindings.Description.inputValue}"/>
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="plm4"
label="#{bindings.Assignee.hints.label}">
<amx:outputText id="ot4" value="#{bindings.Assignee.inputValue}"/>
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="plm5"
label="#{bindings.AssignedOn.hints.label}">
<amx:outputText id="ot5" value="#{bindings.AssignedOn.inputValue}"/>
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="plm6"
label="#{bindings.SupplierId.hints.label}">
<amx:outputText id="ot6" value="#{bindings.SupplierId.inputValue}"/>
</amx:panelLabelAndMessage>
</amx:panelFormLayout>

生成されるバインディングの詳細は、第7.3.2.4.4項「生成されるバインディングについて」を参照してください。

ADFモバイル読取り専用フォームは、ラベル付ADFモバイル出力テキストのみをサポートします。

- イテレータ: これは、子コンポーネントのあるADFモバイルAMXイテレータを作成するためのオプションを提供します(図7-41を参照)。

図7-41 イテレータ・コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「ADFモバイル・イテレータ」を選択すると、JDeveloperウィザードが起動され、ここで、イテレータに挿入するフィールドに加え、各フィールドに対してそれぞれのコントロールも選択できます(デフォルトの選択は「ラベル付ADFモバイル出力テキスト」です。図7-42を参照してください)。

図7-42 ADFモバイル・イテレータの編集ダイアログ

「イテレータの編集」ダイアログで適切なオプションを選択すると、次のデータ・バインディングが生成されます。

<amx:iterator var="row"
value="#{bindings.addresses.collectionModel}"
id="iterator1">
<amx:panelLabelAndMessage label="#{bindings.addresses.hints.type.label}"
id="panelLabelAndMessage6">
<amx:outputText value="#{row.type}" id="outputText6"/>
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage label=
"#{bindings.addresses.hints.formatted.label}"
id="panelLabelAndMessage2">
<amx:outputText value="#{row.formatted}"/>
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage label=
"#{bindings.addresses.hints.streetAddress.label}"
id="panelLabelAndMessage5">
<amx:outputText value="#{row.streetAddress}" id="outputText5"/>
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage label="#{bindings.addresses.hints.locality.label}"
id="panelLabelAndMessage4">
<amx:outputText value="#{row.locality}" id="outputText4"/>
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage label="#{bindings.addresses.hints.region.label}"
id="panelLabelAndMessage7">
<amx:outputText value="#{row.region}" id="outputText7"/>
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage label=
"#{bindings.addresses.hints.postalCode.label}"
id="panelLabelAndMessage1">
<amx:outputText value="#{row.postalCode}" id="outputText1"/>
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage label="#{bindings.addresses.hints.country.label}"
id="panelLabelAndMessage3">
<amx:outputText value="#{row.country}" id="outputText3"/>
</amx:panelLabelAndMessage>
</amx:iterator>

生成されるバインディングの詳細は、第7.3.2.4.4項「生成されるバインディングについて」を参照してください。

次にADFモバイル・イテレータでサポートされるコントロールを示します。

- ADFモバイル入力テキスト

- ラベル付ADFモバイル入力テキスト

- ADFモバイル出力テキスト

- ラベル付ADFモバイル出力テキスト

- リスト・ビュー: これは、子コンポーネントのあるADFモバイルAMXリスト・ビューを作成するためのオプションを提供します(図7-43を参照)。

図7-43 リスト・ビュー・コントロールのポップアップ・メニュー

作成するコントロールのタイプとして「ADFモバイル・リスト・ビュー」を選択すると、図7-44に示す「ListViewギャラリ」が開かれ、リスト・ビューの特定のレイアウトを選択できます。

図7-44 ListViewギャラリ

表7-3は、「ListViewギャラリ」に表示される、サポートされるリスト・フォーマットを示しています。

表7-3 リスト・フォーマット

フォーマット

要素行の値

シンプル

- テキスト

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

開始-終了

- 開始テキスト

- 終了テキスト

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

選択したリスト・フォーマットの「ListViewギャラリ」に表示されている「バリエーション」(図7-44を参照)は、区切りか先頭イメージのいずれかまたは両方を追加するためのオプションで構成されています。

- 先頭イメージのあるバリエーションを選択すると、イメージ行が「リスト・アイテム・コンテンツ」表(図7-45を参照)に追加されます。

- 区切りのあるバリエーションを選択すると、「区切り属性」フィールドがデフォルトの「区切りなし」ではなく、リスト内の最初の属性にデフォルトで設定され、「区切りモード」フィールドにそのデフォルト値の「すべて」が移入されます。

「ListViewギャラリ」に表示されている「スタイル」オプション(図7-44を参照)では、シェブロンを抑制することも、凹枠スタイル・リストを使用することも、その両方を行うこともできます。

- この選択によって、「リスト・ビューの編集」ダイアログ(図7-45を参照)の状態は変更されません。影響するのは、生成されるADFモバイルAMXマークアップのみです。

- 凹枠リストのあるスタイルを選択すると、生成されたADFモバイルAMXマークアップのlistView要素にadfmf-listView-insetListスタイル・クラスが設定されます。

- シェブロンのないスタイルを選択すると、生成されたADFモバイルAMXマークアップのlistItem要素のshowLinkIcon属性がfalseに設定されます。

次に、凹枠リストとシェブロンのあるシンプル・フォーマットの例を示します。

<amx:listView var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
styleClass="adfmf-listView-insetList"
id="listView2">
<amx:listItem id="li2">
<amx:outputText value="#{row.employeename}" id="ot3"/>
</amx:listItem>
</amx:listView>

「ListViewギャラリ」の「説明」ペインは、現在選択されているバリエーションに基づいて更新されます。フォーマットには、メイン・スタイルの簡単な説明が示され、その後に選択したバリエーションの詳細が続きます。4つのメイン・スタイルに、それぞれ4つのバリエーションがあり、表7-4に示す16の固有の説明が提供されています。

表7-4 リスト・ビューのバリエーションとスタイル

リスト・フォーマット

バリエーション

説明

シンプル

基本

テキスト・フィールドは、リスト・アイテムの開始側に表示されます。

シンプル

区切り

テキスト・フィールドは、リスト・アイテムの開始側に、アイテムが区切りによりグループ化されて表示されます。

シンプル

イメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。

シンプル

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

基本

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。

メイン-サブ・テキスト

区切り

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

イメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。

メイン-サブ・テキスト

区切りおよびイメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

開始-終了

基本

テキスト・フィールドは、リスト・アイテムの両側に表示されます。

開始-終了

区切り

テキスト・フィールドは、リスト・アイテムの両側に、アイテムが区切りによりグループ化されて表示されます。

開始-終了

イメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。

開始-終了

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

四分円

基本

テキスト・フィールドは、リスト・アイテムの四隅に表示されます。

四分円

区切り

テキスト・フィールドは、リスト・アイテムの四隅に、アイテムが区切りによりグループ化されて表示されます。

四分円

イメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。

四分円

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

「ListViewギャラリ」で選択し、「OK」をクリックすると、「リスト・ビューの編集」ウィザードが起動され、ここで図7-45に示すように、バインディング属性を選択したリスト・ビュー・フォーマットの要素にマップすることにより、リスト・アイテムのコンテンツを作成できます。

図7-45 ADFモバイル・リスト・ビューの編集ダイアログ

図7-45に示すダイアログに入力する際は、次の点を考慮してください。

- 最初のイメージは、選択したリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映し、略図から基礎となる表の名前付き要素へのマッピングを提供します。

- 「要素」列の読取り専用セルは、選択したリスト・ビュー・フォーマットから抽出されます。

- 「値バインディング」列の編集可能セルは、ドロップされたデータ・コントロール・ノードに基づいています。

- リスト・アイテムは、その特定要素に対してどちらが適切であるかによって、出力テキストまたはイメージ・コンポーネントのいずれかとして生成されます。

- 要素(行)数は選択したリスト・ビュー・フォーマットであらかじめ決まっているため、行を追加または削除することはできません。

- 要素の順序は変更できません。

- 「区切り属性」フィールドのデフォルト値は「区切りなし」です。この場合、「区切りモード」フィールドは無効です。デフォルト以外の値を選択する場合は、図7-46および図7-47に示すように、「区切りモード」パラメータを指定する必要があります。

図7-46 区切り属性の指定

図7-47 区切りモードの指定

リスト・ビューの区切りの詳細は、第8.2.7項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照してください。

「リスト・ビューの編集」ダイアログで適切なオプションを選択すると、次のADFモバイルAMXマークアップおよびデータ・バインディングが生成されます。

<amx:listView var="row"
value="#{bindings.contacts.collectionModel}"
fetchSize="#{bindings.contacts.rangeSize}"
dividerAttribute="key"
dividerMode="all"
id="listView1">
<amx:listItem showLinkIcon="false" id="listItem1" >
<amx:panelGroupLayout layout="horizontal"
id="panelGroupLayout1">
<amx:image source="#{row.key}" id="image1"/>
<amx:panelGroupLayout id="panelGroupLayout2">
<amx:outputText value="#{row.id}"
styleClass="adfmf-listItem-maintext"
id="outputText2"/>
<amx:outputText value="#{row.key}"
styleClass="adfmf-listItem-subtext"
id="outputText1"/>
</amx:panelGroupLayout>
</amx:panelGroupLayout>
</amx:listItem>
</amx:listView>

生成されるバインディングの詳細は、第7.3.2.4.4項「生成されるバインディングについて」を参照してください。

次にADFモバイル・リスト・ビューでサポートされるコントロールを示します。

- ADFモバイル出力テキスト

- ADFモバイル・イメージ

7.3.2.4.4 生成されるバインディングについて

表7-5は、コンポーネントがドロップされたときにADFモバイルAMXページに追加されるサンプル・バインディングを示しています。

表7-5 サンプル・データ・バインディング

コンポーネント

データ・バインディング

ボタン

actionListener="#{bindings.FindContacts.execute}"
text="FindContacts" disabled="#{!bindings.FindContacts.enabled}"

リンク

actionListener="#{bindings.FindContacts.execute}"
text="FindContacts" disabled="#{!bindings.FindContacts.enabled}"

ラベル付入力日

<amx:inputDate id="inputDate1"
value="#{bindings.timeStamp.inputValue}"
label="#{bindings.timeStamp.hints.label}"
required="#{bindings.timeStamp.hints.mandatory}">
</amx:inputDate>

入力日

<amx:inputDate id="inputDate1"
value="#{bindings.timeStamp.inputValue}"
required="#{bindings.timeStamp.hints.mandatory}">
</amx:inputDate>

ラベル付入力テキスト

value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.hints.label}"
required="#{bindings.contactData.hints.mandatory}"
maximumLength="#{bindings.contactData.hints.precision}"

入力テキスト

value="#{bindings.contactData.inputValue}"
simple="true"
required="#{bindings.contactData.hints.mandatory}"
maximumLength="#{bindings.contactData.hints.precision}"

出力テキスト

value="#{bindings.contactData.inputValue}"

ラベル付出力テキスト

<amx:panelLabelAndMessage id="panelLabelAndMessage1"
label="#{bindings.contactData.hints.label}">
<amx:outputText value="#{bindings.contactData.inputValue}"/>
</amx:panelLabelAndMessage>

ブール・チェック・ボックスの選択

value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}"

ブール・スイッチの選択

value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}"

ボタンを1つ選択

<amx:selectOneButton id="selectOneButton1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}"
required="#{bindings.contactData.hints.mandatory}">
<amx:selectItems value="#{bindings.contactData.items}"/>
</amx:selectOneButton>

選択肢を1つ選択

<amx:selectOneChoice id="selectOneChoice1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}"
required="#{bindings.contactData.hints.mandatory}">
<amx:selectItems value="#{bindings.contactData.items}"/>
</amx:selectOneChoice>

チェック・ボックスを複数選択

<amx:selectManyCheckbox id="selectManyCheckbox1"
value="#{bindings.AssetView.inputValue}"
label="#{bindings.AssetView.label}">
<amx:selectItems value="#{bindings.AssetView.items}"/>
</amx:selectManyCheckbox>

ラジオ・ボタンを1つ選択

<amx:selectOneRadio id="selectOneRadio1"
value="#{bindings.contactData.inputValue}"
label="#{bindings.contactData.label}"
required="#{bindings.contactData.hints.mandatory}">
<amx:selectItems value="#{bindings.contactData.items}"/>
</amx:selectOneRadio>

選択肢を複数選択

<amx:selectManyChoice id="selectManyChoice1"
value="#{bindings.AssetView.inputValue}"
label="#{bindings.AssetView.label}">
<amx:selectItems value="#{bindings.AssetView.items}"/>
</amx:selectManyChoice>

7.3.2.4.5 生成されるドラッグ・アンド・ドロップ・アーティファクトについて

最初のドラッグ・アンド・ドロップ・イベントにより、次のディレクトリとファイルが生成されます。

図7-48に、ドラッグ・アンド・ドロップ時に生成されるDataBindings.cpxファイル例を示します。

図7-48 DataBindings.cpxファイル

詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のDataBindings.cpxファイルの使用方法に関する項を参照してください。

図7-49に、ドラッグ・アンド・ドロップ時に生成されるPageDefファイル例を示します。

図7-49 PageDefファイル

詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のページ定義ファイルの使用方法に関する項を参照してください。

7.3.2.4.6 ADFモバイルAMXエディタの「バインディング」タブの使用方法

JDeveloperの「バインディング」タブ(図7-50を参照)は、ADFモバイルAMXエディタにあります。ここには、特定のADFモバイルAMXページに対して定義されたデータ・バインディングが表示されます。バインディングを選択すると、基盤となるデータ・コントロールへのリレーションシップが示され、PageDefファイルへのリンクが提供されます。

図7-50 「バインディング」タブ

7.3.2.4.7 使用されないバインディングの削除について

「構造」ペインからADFモバイルAMXコンポーネントを削除または切り取ると、使用されないバインディングは自動的にページから削除されます。

注意:

「ソース」エディタからコンポーネントを削除した場合には、バインディングは削除されません。

図7-51は、バインディングを参照するリスト・ビュー・コンポーネントの削除を示しています。削除すると、関連するバインディング・エントリが、対応するPageDef.xmlファイルから自動的に削除されます。

図7-51 バインドされたコンポーネントのページからの削除

図7-52では、ページからリスト・ビュー・コンポーネントを切り取ることにより、これを削除しています。

図7-52 バインドされたコンポーネントのページからの切取り

「切取り」をクリックすると、図7-53に示すような「ADFバインディングの削除の確認」ダイアログが表示され、該当するバインディングを削除するかどうかを選択するよう求められます。

図7-53 「ADFバインディングの削除の確認」ダイアログ

7.3.2.5 要素識別子とその監査について

「コンポーネント・パレット」からコンポーネントをドロップするか、データ・コントロールをドラッグ・アンド・ドロップすることにより、要素が追加されると、ADFモバイルは一意の要素識別子(id)を生成し、自動的にこれをADFモバイルAMXページに挿入します。これにより、同じページ内の類似したコンポーネントでもそれぞれを識別する、ADFモバイルAMXページ内の有効な識別子となります。

ADFモバイルは、次のことを行う識別子監査ユーティリティを提供しています。

- ADFモバイルAMXページにおける識別子の存在と一意性を確認する。

- 識別子が存在しないか、一意ではない場合:

- 要素の必須id属性に対しては、エラーが報告される。

- 要素のオプションid属性に対しては、警告が報告される。

- 自動修正により、識別子の問題が報告されると、要素の一意のidが生成される。

図7-54および図7-55は、「ソース」エディタと「構造」ペインの識別子エラー・レポートをそれぞれ示しています。

図7-54 「ソース」エディタの要素識別子監査

図7-55 「構造」ペインの要素識別子監査

idに加え、監査ユーティリティでは「ポップアップ表示動作」操作のpopupIdおよびalignId属性をチェックします(第8.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。

図7-56および図7-57は、「ソース」エディタの「ポップアップ表示動作」の「ポップアップID」と「位置合せID」のエラー・レポートをそれぞれ示しています。

図7-56 「ソース」エディタのポップアップID属性監査

図7-57 「ソース」エディタの位置合せID属性監査

詳細は、『Oracle Fusion Middleware Oracle JDeveloperユーザーズ・ガイド』のアプリケーションの監査とプロファイリングに関する項および監査に関する項を参照してください。

8 ADFモバイルAMXユーザー・インタフェースの作成

この章では、「ADFモバイルAMX」ページのユーザー・インタフェースを作成する方法について説明します。

この章では、次の項目について説明します。

- 第8.1項「「ADFモバイルAMX」ページのUIの作成の概要」

- 第8.2項「ページ・レイアウトの設計」

- 第8.3項「UIコンポーネントの作成と使用方法」

- 第8.4項「ジェスチャーの有効化」

- 第8.5項「データ視覚化の指定」

- 第8.6項「UIコンポーネントのスタイル設定」

- 第8.7項「UIコンポーネントのローカライズ」

- 第8.8項「ADFモバイルのアクセシビリティのサポートについて」

- 第8.9項「入力の検証」

- 第8.10項「イベント・リスナーの使用方法」

8.1 「ADFモバイルAMX」ページのUIの作成の概要

ADFモバイルは、iOSとAndroidのどちらのユーザー操作性に対しても適切に動作する「ADFモバイルAMX」ページの作成を可能にする一連のレイアウト・コンポーネントおよびフィールド・コンポーネントを提供します。ADFモバイルAMXでは、コンポーネントをコンポーネント・パレットまたはデータ・コントロール・パレットからエディタにドラッグできるようにすることで、ADF Facesと同じ開発操作性が維持されていますが、それらのコンポーネントはADF Facesのものと同等ではなく、ADFモバイルAMXコンポーネントでは、ADF Facesコンポーネントの各プロパティおよび動作がサポートされていません。本質的には、ADFモバイルAMX UIコンポーネントは、iOSおよびAndroidのプラットフォームでネイティブ・コンポーネントのHTML相当物をレンダリングし、それらのデザインタイムの動作は、ADF Facesコンポーネントにとてもよく似ています。さらに、これらのUIコンポーネントは、宣言ナビゲーションおよびデータ・バインディングのためにADFモバイルのコントローラおよびモデルと統合されています。

注意:

モバイル・デバイス用のインタフェースを開発する場合は、画面領域が非常に限られていることに常に注意してください。また、一部のモバイル・デバイスではタッチスクリーンが使用できません。

詳細は、次の項を参照してください。

- 第7章「ADFモバイルAMXページの作成」

- 第9章「バインディングの使用とデータ・コントロールの作成」

8.2 ページ・レイアウトの設計

ADFモバイルAMXは、ページ内へのUIコンポーネントの配置を可能にするレイアウト・コンポーネント(表8-1に記載)を提供します。通常、これらのコンポーネントを使用してページの構築を開始し、次にこれらのコンテナ内で、または子コンポーネントとして、他の機能を提供する他のコンポーネントを、レイアウト・コンポーネントに追加します。これらのコンポーネントのいくつかは、拡大するコンポーネント内に配置されたときに拡大する機能などの形状管理機能を提供します。

表8-1 ADFモバイルAMXのページ管理、レイアウトおよび間隔調整コンポーネント

コンポーネント

タイプ

説明

ビュー

コア・ページ構造コンポーネント

ADFモバイルAMXファイル内にview要素を作成します。ファイルが作成されるときにファイルに自動的に挿入されます。詳細は、第8.2.1項「表示コンポーネントの使用方法」を参照してください。

パネル・ページ

コア・ページ構造コンポーネント

ADFモバイルAMXファイル内にpanelPage要素を作成します。ページ内の中央領域(ヘッダー領域とフッター領域の間を垂直方向にスクロールする)を定義します。詳細は、第8.2.2項「パネル・ページ・コンポーネントの使用方法」を参照してください。

ADFモバイルAMXファイルの詳細は、第7.3.1.2項「ADFモバイルAMXページの作成」を参照してください。

ファセット

コア・ページ構造コンポーネント

ADFモバイルAMXファイル内にfacet要素を作成します。任意の名前のファセットを親コンポーネントに定義します。詳細は、第8.2.6項「ファセット・コンポーネントの使用方法」を参照してください。

パネル・グループ・レイアウト

ページ・レイアウト・コンテナ

ADFモバイルAMXファイル内にpanelGroupLayout要素を作成します。子コンポーネントを縦または横にグループ化します。詳細は、第8.2.3項「パネル・グループ・レイアウト・コンポーネントの使用方法」を参照してください。

パネル・フォーム・レイアウト

ページ・レイアウト・コンテナ

ADFモバイルAMXファイル内にpanelFormLayout要素を作成します。入力テキストなどのコンポーネントを、それらのラベルおよびフィールドが水平に、または各コンポーネントの上に整列するように配置します。詳細は、第8.2.4項「パネル・フォーム・レイアウト・コンポーネントの使用方法」を参照してください。

パネル・ラベルおよびメッセージ

ページ・レイアウト・コンテナ

ADFモバイルAMXファイル内にpanelLabelAndMessage要素を作成します。ラベルおよびその子をレイアウトします。詳細は、第8.2.5項「パネル・ラベルおよびメッセージ・コンポーネントの使用方法」を参照してください。

リスト・ビュー

ページ・レイアウト・コンテナ

ADFモバイルAMXファイル内にlistView要素を作成します。選択機能付きの行のリストのルック・アンド・フィールを提供する反復コンポーネントを表します。詳細は、第8.2.7項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照してください。

リスト・アイテム

ページ・レイアウト・コンポーネント

ADFモバイルAMXファイル内にlistItem要素を作成します。詳細は、第8.2.7項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照してください。

ポップアップ

セカンダリ・ウィンドウ

ADFモバイルAMXファイル内にpopup要素を作成します。詳細は、第8.2.8項「ポップアップ・コンポーネントの使用方法」を参照してください。

パネル・スプリッタ

インタラクティブ・ページ・レイアウト・コンテナ

ADFモバイルAMXファイル内にpanelSplitter要素を作成します。詳細は、第8.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照してください。

パネル・アイテム

インタラクティブ・ページ・レイアウト・コンポーネント

ADFモバイルAMXファイル内にpanelItem要素を作成します。詳細は、第8.2.9項「パネル・スプリッタ・コンポーネントの使用方法」を参照してください。

スペーサ

間隔調整コンポーネント

ADFモバイルAMXファイル内のspacer要素によって表される空白の領域を作成します。

詳細は、Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイドの空白または行を使用したコンテンツの区切りに関する項を参照してください。

表のレイアウト

ページ・レイアウト・コンテナ

ADFモバイルAMXファイル内にtableLayout要素を作成します。行で構成された表を表します。詳細は、第8.2.10項「表のレイアウト・コンポーネントの使用方法」を参照してください。

行のレイアウト

ページ・レイアウト・コンテナ

ADFモバイルAMXファイル内にrowLayout要素を作成します。表のレイアウト・コンポーネント内でセルで構成されている行を表します。詳細は、第8.2.10項「表のレイアウト・コンポーネントの使用方法」を参照してください。

セル・フォーマット

ページ・レイアウト・コンポーネント

ADFモバイルAMXファイル内にcellFormat要素を作成します。行のレイアウト・コンポーネント内のセルを表します。詳細は、第8.2.10項「表のレイアウト・コンポーネントの使用方法」を参照してください。

レイアウト・コンポーネントを追加するには、それを「コンポーネント・パレット」から「ADFモバイルAMX」ページにドラッグ・アンド・ドロップします(第7.3.2.1項「UIコンポーネントの追加」を参照)。その後で、「プロパティ・インスペクタ」を使用してそのコンポーネントの属性を設定します(第7.3.2.3項「UIコンポーネントの構成」を参照)。それぞれの特定のコンポーネントの属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

例8-1は、ADFモバイルAMXファイルで定義されているいくつかのページ・レイアウト要素を示しています。

注意:

ページ・レイアウト要素は<amx>ネームスペースの下で宣言します。

例8-1 ページ・レイアウト・コンポーネントの定義

<amx:panelPage id="pp1">
<amx:outputText id="outputText1"
value="Sub-Section Title 1"
styleClass="adfmf-text-sectiontitle"/>
<amx:panelFormLayout id="panelFormLayout1" labelPosition="start">
<amx:panelLabelAndMessage id="panelLabelAndMessage1" label="Name">
<amx:commandLink id="commandLink1" text="Jane Doe" action="editname" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="panelLabelAndMessage2" label="Street Address">
<amx:commandLink id="commandLink2"
text="123 Main Street"
action="editaddr" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage id="panelLabelAndMessage3" label="Phone">
<amx:outputText id="outputText2" value="888-555-1212" />
</amx:panelLabelAndMessage>
</amx:panelFormLayout>
<amx:outputText id="outputText3"
value="Sub-Section Title 2"
styleClass="adfmf-text-sectiontitle" />
<amx:panelFormLayout id="panelFormLayout2" labelPosition="start">
<amx:panelLabelAndMessage id="panelLabelAndMessage4" label="Type">
<amx:commandLink id="commandLink3" text="Personal" action="edittype" />
</amx:panelLabelAndMessage>
<amx:panelLabelAndMessage label="Anniversary">
<amx:outputText id="outputText4" value="November 22, 2005" />
</amx:panelLabelAndMessage>
</amx:panelFormLayout>
<amx:panelFormLayout id="panelFormLayout3" labelPosition="start">
<amx:panelLabelAndMessage id="panelLabelAndMessage5" label="Date Created">
<amx:outputText id="outputText5" value="June 20, 2011" />
</amx:panelLabelAndMessage>
</amx:panelFormLayout>
</amx:panelPage>

図8-1 デザインタイムのページ・レイアウト・コンポーネント

レイアウト・コンポーネントのビジュアル・プレゼンテーションを管理するには、標準Cascading Style Sheet (CSS)を使用します。CSSは、ViewControllerプロジェクトのWeb Content/cssディレクトリに、フレームワークによって提供されているデフォルトCSSとともに配置されています。詳細は、第8.6.1項「コンポーネント属性を使用したスタイルの定義方法」を参照してください。

LayoutDemoという名前のADFモバイル・サンプル・アプリケーションは、ボタンなどのADFモバイルAMX UIコンポーネントとともにレイアウト・コンポーネントを使用して一般的なパターンに従った一般的なレイアウトのいくつかを実現する方法を示しています。さらに、このサンプル・アプリケーションは、スタイルを使用してページ・レイアウトを特定のパターンに合せる方法を示します。LayoutDemoアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

8.2.1 表示コンポーネントの使用方法

表示(ADFモバイルAMXファイルのview要素)は、コア・ページ構造コンポーネントであり、ADFモバイルAMXファイルの作成時にそのファイルに自動的に挿入されます。このコンポーネントは、ページおよびその構造の階層表現を提供し、単一の「ADFモバイルAMX」ページを表します。

詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.2.2 パネル・ページ・コンポーネントの使用方法

パネル・ページ(ADFモバイルAMXファイルのpanelPage要素)は、他のコンポーネントをレイアウトする画面のスクロール可能領域の定義を可能にするコンポーネントです。

デフォルトでは、「ADFモバイルAMX」ページを作成するときに、JDeveloperによってパネル・ページ・コンポーネントが自動的に作成され、そのページに挿入されます。そのページにコンポーネントを追加すると、それらはパネル・ページ・コンポーネント内に挿入されます。

特定の領域(ページのヘッダーやフッターなど)をスクロールできないようにし、向きが変更されたときのストレッチを有効化するには、パネル・ページに対してファセット・コンポーネントを指定します。パネル・ページのヘッダー・ファセットには、各ページのナビゲーション・バーに配置されるタイトルが含まれています。パネル・ページに含めることができる他のタイプのファセット・コンポーネントの詳細は、第8.2.6項「ファセット・コンポーネントの使用方法」を参照してください。

例8-2は、ADFモバイルAMXファイルで定義されているpanelPage要素を示しています。このパネル・ページには、ヘッダー・ファセットが含まれています。

例8-2 パネル・ページの定義

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="ot1" value="Welcome"/>
</amx:facet>
</amx:panelPage>

詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.2.3 パネル・グループ・レイアウト・コンポーネントの使用方法

パネル・グループ・レイアウト・コンポーネントは、基本レイアウト・コンポーネントであり、その子を垂直方向または水平方向に配置します。パネル・グループ・レイアウト・コンポーネントを作成するには、「コンポーネント・パレット」を使用します。

パネル・グループ・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント・パレット」で、「パネル・グループ・レイアウト」を「ADFモバイルAMX」ページにドラッグ・アンド・ドロップします。

2. 目的の子コンポーネントをパネル・グループ・レイアウト・コンポーネントに挿入します。

3. 隣接する子コンポーネント間に間隔を追加するには、スペーサ(spacer)コンポーネントを挿入します。

4. 「プロパティ・インスペクタ」を使用して、コンポーネント属性を設定します。詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

例8-3は、ADFモバイルAMXファイルで定義されているpanelGroupLayout要素を示しています。

例8-3 パネル・グループ・レイアウトの定義

<amx:panelGroupLayout styleClass="prod" id="pgl1">
<amx:outputText styleClass="prod-label" value="Screen Size:" id="ot1"/>
</amx:panelGroupLayout>

8.2.4 パネル・フォーム・レイアウト・コンポーネントの使用方法

パネル・フォーム・レイアウト(panelFormLayout)コンポーネントは、コンポーネントをそれらのラベルおよびフィールドが水平方向に整列するように配置します。一般的に、パネル・フォーム・レイアウト・コンポーネントのメイン・コンテンツは、入力コンポーネント(入力テキストなど)および選択コンポーネント(選択肢など)で構成されています。label属性が定義されている子コンポーネントをパネル・フォーム・レイアウト・コンポーネント内に配置すると、その子コンポーネントのラベルおよびフィールドはパネル・フォーム・レイアウトの定義に基づいて整列およびサイズ設定されます。パネル・フォーム・レイアウト内では、ラベル領域は、フィールド領域の開始側上またはフィールド領域の上の独立した線上のどちらにも表示できます。独立した線は、パネル・フォーム・レイアウトのlabelPosition属性がtopStart、topCenterまたはtopEndに設定されている場合に使用されます。それ以外の場合は、ラベル領域はフィールド領域の開始側上に表示されます。ラベル領域内では、labelPosition属性によって、次のようにラベル・テキストを整列できる位置が制御されます。

- 開始側(labelPosition="start"またはlabelPosition="topStart")

- 中央(labelPosition="center"またはlabelPosition="topCenter")

- 終了側(labelPosition="end"またはlabelPosition="topEnd")

フィールド領域内では、fieldHalign属性によって、次のようにフィールド・コンテンツを整列できる位置が制御されます。

- 開始側(fieldHalign="start")

- 中央(fieldHalign="center")

- 終了側(fieldHalign="end")

パネル・フォーム・レイアウト・コンポーネントを追加するには:

1. 「コンポーネント・パレット」で、「パネル・フォーム・レイアウト」を「ADFモバイルAMX」ページにドラッグ・アンド・ドロップします。

2. 「プロパティ・インスペクタ」でコンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

例8-4は、ADFモバイルAMXファイルで定義されているpanelFormLayout要素を示しています。

例8-4 パネル・フォーム・レイアウトの定義

<amx:panelFormLayout styleClass="prod" id="pfl1">
<amx:panelLabelAndMessage label="Type" id="plm1">
<amx:commandLink text="Personal" action="edittype" id="cl1"/>
</amx:panelLabelAndMessage>
</amx:panelFormLayout>

8.2.5 パネル・ラベルおよびメッセージ・コンポーネントの使用方法

パネル・ラベルおよびメッセージ(panelLabelAndMessage)コンポーネントは、label属性が定義されていないコンポーネントを、パネル・フォーム・レイアウト内に配置するために使用します。これらのコンポーネントとしては、通常、出力テキスト、ボタンまたはリンクがあります。

パネル・ラベルおよびメッセージ・コンポーネントを追加するには:

1. 「コンポーネント・パレット」で、「パネル・ラベルおよびメッセージ」コンポーネントを「パネル・グループ・レイアウト」コンポーネントにドラッグ・アンド・ドロップします。

2. 「プロパティ」エディタでコンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

例8-4は、ADFモバイルAMXファイルで定義されているpanelLabelAndMessage要素を示しています。label属性が、子コンポーネントに対して使用されています。

例8-5 パネル・ラベルおよびメッセージの定義

<amx:panelLabelAndMessage label="Phone" id="plm1">
<amx:outputText value="888-555-1212" id="ot1"/>
</amx:panelLabelAndMessage>

8.2.6 ファセット・コンポーネントの使用方法

ファセット(facet)コンポーネントは、親レイアウト・コンポーネント上に、ヘッダーやフッターなど任意の名前のファセットを定義するために使用します。ファセットの位置およびレンダリングは、親コンポーネントによって決定されます。

「ADFモバイルAMX」ページのヘッダーは、通常、ヘッダー、プライマリおよびセカンダリ・ファセットと組み合せたパネル・ページ・コンポーネントによって表されます(第8.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)。

- ヘッダー・ファセット: ページ・タイトルが含まれています。

- プライマリ・アクション・ファセット: ヘッダー・バーの左隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

- セカンダリ・アクション・ファセット: ヘッダー・バーの右隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

「ADFモバイルAMX」ページのフッターは、通常、フッター・ファセットと組み合せたパネル・ページ・コンポーネントによって表されます(第8.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)。

- フッター・ファセット: コンテンツ領域の下に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

例8-6は、パネル・ページ・コンテナ内で宣言されているfacet要素を示しています。ファセットのタイプは、常にそのname属性で定義されます(表8-2を参照)。

例8-6 ファセットの定義

<amx:panelPage id="pp1">
<amx:facet name="footer">
<amx:commandButton id="cb2" icon="folder.png"
text="Move (#{myBean.mailcount})"
action"move"/>
</amx:facet>
</amx:panelPage>

表8-2は、特定の親コンポーネントとともに使用できるファセット・タイプを示しています。

表8-2 ファセット・タイプと親コンポーネント

親コンポーネント

ファセット・タイプ(名前)

パネル・ページ(panelPage)

header、footer、primary、secondary

リスト・ビュー(listView)

header、footer

データ視覚化コンポーネント。

詳細は、第8.5項「データ視覚化の指定」を参照してください。

dataStamp、seriesStamp

ファセット・コンポーネントを追加するには:

「構造」ペインまたは「ソース」ビューに表示されるポップアップ・メニューを使用して、ファセット・コンポーネントを別のコンポーネントの子として追加できます。ポップアップ・メニューには、選択している親コンポーネントに有効なファセットのみが表示されます。ファセットを追加するには、最初に「構造」ペインまたは「ソース」ビューで親コンポーネントを選択してから右クリックし、次のうちの1つを選択します。

- 親コンポーネントがパネル・ページである場合、図8-2に示すように、「ファセット」→「パネル・ページ」を選択し、リストからファセットのタイプを選択します。

図8-2 パネル・ページにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがリスト・ビューである場合、図8-3に示すように、「ファセット」→「リスト・ビュー」を選択し、リストからファセットのタイプを選択します。

図8-3 リスト・ビューにファセットを追加するためのポップアップ・メニューの使用方法

- 親コンポーネントがデータ視覚化コンポーネントの1つである場合、図8-4に示すように、「ファセット」→「<DVTMコンポーネント名>」を選択し、リストからファセットのタイプを選択します。

図8-4 データ視覚化コンポーネントにファセットを追加するためのポップアップ・メニューの使用方法

データ視覚化コンピュータとされらの属性の詳細は、第8.5項「データ視覚化の指定」を参照してください。

別の方法:

1. 「コンポーネント・パレット」で、「ファセット」コンポーネントを表8-2に示す別のコンポーネントにドラッグ・アンド・ドロップします。

2. 「プロパティ・インスペクタ」でコンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.2.7 リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法

リスト・ビュー(listView)コンポーネントを使用して、エンド・ユーザーが1つ以上のオプションを選択できる選択肢のリストとしてデータを表示します。

リスト・アイテム(listItem)コンポーネントは、リスト・ビュー内の1つの行を表します。通常、リスト・ビュー内にリスト・アイテム・コンポーネントを配置し、データ・アイテムのリストをレイアウトおよびスタイル設定します。リスト・アイテム・コンポーネントは、実行時にスワイプ・ジェスチャーに応答します(第8.4項「ジェスチャーの有効化」を参照).

リスト・ビューによって、次のうち1つを定義できます。

- リスト(コレクション)内のアイテム数に基づいてレプリケートされる行。

- リスト・ビューのvarおよびvalue属性を指定することなく子リスト・アイテム・コンポーネントを追加することによって生成される静的行。これらの静的アイテムは必要な数を追加できます。これは、設計時にリストのコンテンツがわかっている場合に便利です。この場合、リストはメニュー・アイテムのセットのように動作します。

次のタイプのリスト・ビュー・コンポーネントを作成できます。

- 基本リスト
例8-7は、ADFモバイルAMXファイルで定義されているlistView要素を示しています。この定義は、基本コンポーネントに対応しています。

例8-7 基本リスト・ビューの定義

<amx:listView id="listView1">
<amx:listItem id="listItem1">
<amx:outputText id="outputText1" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem2">
<amx:outputText id="outputText3" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem3">
<amx:outputText id="outputText5" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem4">
<amx:outputText id="outputText7"
value="This is really long text to test how it is handled"/>
</amx:listItem>
</amx:listView>

図8-5は、デザインタイムの基本リスト・ビュー・コンポーネントを示しています。

図8-5 デザインタイムの基本リスト・ビュー

例8-8は、ADFモバイルAMXファイル内のlistView要素のもう1つの定義を示しています。この定義も基本コンポーネントに対応していますが、このリスト・ビューの値はコレクションによって設定されます。

例8-8 基本リスト・ビューの定義

<amx:listView id="list1" value="#{myBean.listCollection}" var="row">
<amx:listItem actionListener="#{myBean.selectRow}"
showLinkIcon="false"
id="listItem1">
<amx:outputText value="#{row.name}" id="outputText1"/>
</amx:listItem>
</amx:listView>

- アイコン付きリスト
例8-9は、ADFモバイルAMXファイルで定義されているlistView要素を示しています。この定義は、アイコン付きコンポーネントに対応しています。

例8-9 アイコン付きリスト・ビューの定義

<amx:listView id="list1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItem1">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf11" width="40px" halign="center">
<amx:image id="image1" source="#{row.image}"/>
</amx:cellFormat>
<amx:cellFormat id="cf12" width="100%" height="43px">
<amx:outputText id="outputText1" value="#{row.desc}"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図8-6は、デザインタイムのアイコンおよびテキスト付きリスト・ビュー・コンポーネントを示しています。

図8-6 デザインタイムのアイコン付きリスト・ビュー

- 検索付きリスト

- 区切り付きリスト。このタイプのリストでは、データをグループ化して順序を示すことができます。リスト・ビュー・コンポーネントの属性によって、各区切りの特性が定義されます。属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。
ADFモバイルAMXでは、次のことを実行できるリスト区切りが提供されています。

- そのコンテンツを個別に閉じます。

- 各区切り内のアイテム数を表示します。

- 同時に閉じます。

例8-10は、ADFモバイルAMXファイルで定義されているlistView要素を示しています。この定義は、折りたたみ可能な区切りおよびアイテム数付きのコンポーネントに対応しています。

例8-10 区切り付きリスト・ビューの定義

<amx:listView id="list1"
value="#{bindings.data.collectionModel}"
var="row"
collapsibleDividers="true"
collapsedDividers="#{pageFlowScope.mylistDisclosedDividers}"
dividerMode="all"
dividerAttribute="type"
showDividerCount="true">
<amx:listItem>
<amx:outputText id="ot1" value="#{row.name}">
</amx:listItem>
</amx:listView>

- 凹枠リスト
例8-11は、ADFモバイルAMXファイルで定義されているlistView要素を示しています。この定義は、凹枠コンポーネントに対応しています。

例8-11 凹枠リスト・ビューの定義

<amx:listView id="listView1" styleClass="adfmf-listView-insetList">
<amx:listItem id="listItem1">
<amx:outputText id="outputText1" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem2">
<amx:outputText id="outputText3" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem3">
<amx:outputText id="outputText5" value="ListItem Text"/>
</amx:listItem>
<amx:listItem id="listItem4">
<amx:outputText id="outputText7"
value="This is really long text to test how it is handled"/>
</amx:listItem>
</amx:listView>

図8-7は、デザインタイムの凹枠リスト・ビュー・コンポーネントを示しています。

図8-7 デザインタイムの凹枠リスト・ビュー

例8-12は、ADFモバイルAMXファイル内のlistView要素のもう1つの定義を示しています。この定義も凹枠コンポーネントに対応していますが、このリスト・ビューの値はコレクションによって設定されます。

例8-12 凹枠リストの定義

<amx:listView id="list1"
value="#{CarBean.carCollection}"
var="row"
styleClass="adfmf-listView-insetList">
<amx:listItem id="li1" action="go">
<amx:outputText id="ot1" value="#{row.name}"/>
</amx:listItem>
</amx:listView>

ADFモバイルAMXにおけるリスト・アイテム・コンポーネントの子操作および属性の処理には、特定の順序があります。詳細は、第8.3.5.7項「操作と属性の処理順序について」を参照してください。

他のADFモバイルAMXコンポーネントとは異なり、リスト・ビューをADFモバイルAMXページにドラッグ・アンド・ドロップすると、「ListViewギャラリ」というダイアログが表示されます(図8-8を参照)。このダイアログでリスト・ビューに対して特定のレイアウトを選択できます。

図8-8 「ListViewギャラリ」ダイアログ

表8-3は、「ListViewギャラリ」に表示される、サポートされる「リスト・フォーマット」を示しています。

表8-3 リスト・フォーマット

フォーマット

要素行の値

シンプル

- テキスト

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

開始-終了

- 開始テキスト

- 終了テキスト

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

選択したリスト・フォーマットの「ListViewギャラリ」に表示されている「バリエーション」(図8-8を参照)は、区切りか先頭イメージのいずれかまたは両方を追加するためのオプションで構成されています。

- 先頭イメージのあるバリエーションを選択すると、イメージ行が「リスト・アイテム・コンテンツ」表(図8-9を参照)に追加されます。

- 区切りのあるバリエーションを選択すると、「区切り属性」フィールドがデフォルトの「区切りなし」ではなく、リスト内の最初の属性にデフォルトで設定され、「区切りモード」フィールドにそのデフォルト値の「すべて」が移入されます。

「ListViewギャラリ」に表示されている「スタイル」オプション(図8-8を参照)では、シェブロンを抑制することも、凹枠スタイル・リストを使用することも、その両方を行うこともできます。

- この選択によって、「リスト・ビューの編集」ダイアログ(図8-9を参照)の状態は変更されません。影響するのは、生成されるADFモバイルAMXマークアップのみです。

- 凹枠リストのあるスタイルを選択すると、生成されたADFモバイルAMXマークアップのlistView要素にadfmf-listView-insetListスタイル・クラスが設定されます。

- シェブロンのないスタイルを選択すると、生成されたADFモバイルAMXマークアップのlistItem要素のshowLinkIcon属性がfalseに設定されます。

次に、凹枠リストとシェブロンのあるシンプル・フォーマットの例を示します。

<amx:listView var="row"
value="#{bindings.employees.collectionModel}"
fetchSize="#{bindings.employees.rangeSize}"
styleClass="adfmf-listView-insetList"
id="listView2">
<amx:listItem id="li2">
<amx:outputText value="#{row.employeename}" id="ot3"/>
</amx:listItem>
</amx:listView>

「ListViewギャラリ」の「説明」ペインは、現在選択されているバリエーションに基づいて更新されます。フォーマットには、メイン・スタイルの簡単な説明が示され、その後に選択したバリエーションの詳細が続きます。4つのメイン・スタイルに、それぞれ4つのバリエーションがあり、表8-4に示す16の固有の説明が提供されています。

表8-4 リスト・ビューのバリエーションとスタイル

リスト・フォーマット

バリエーション

説明

シンプル

基本

テキスト・フィールドがリスト・アイテムの開始側に表示されます。

シンプル

区切り

テキスト・フィールドは、リスト・アイテムの開始側に、アイテムが区切りによりグループ化されて表示されます。

シンプル

イメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。

シンプル

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの開始側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

基本

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。

メイン-サブ・テキスト

区切り

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に続きます。リスト・アイテムは区切りによってグループ化されます。

メイン-サブ・テキスト

イメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。

メイン-サブ・テキスト

区切りおよびイメージ

目立つメイン・テキスト・フィールドがリスト・アイテムの開始側に表示され、従属テキストがその下に先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

開始-終了

基本

テキスト・フィールドがリスト・アイテムの両側に表示されます。

開始-終了

区切り

テキスト・フィールドは、リスト・アイテムの両側に、アイテムが区切りによりグループ化されて表示されます。

開始-終了

イメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。

開始-終了

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの両側に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

四分円

基本

テキスト・フィールドは、リスト・アイテムの四隅に表示されます。

四分円

区切り

テキスト・フィールドは、リスト・アイテムの四隅に、アイテムが区切りによりグループ化されて表示されます。

四分円

イメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。

四分円

区切りおよびイメージ

テキスト・フィールドは、リスト・アイテムの四隅に、先頭イメージに続いて表示されます。リスト・アイテムは区切りによってグループ化されます。

「ListViewギャラリ」で選択し、「OK」をクリックすると、「リスト・ビューの編集」ウィザードが起動されます。それを使用して、リスト・アイテム子コンポーネントに静的テキストを表示するバインドなしリスト・ビュー・コンポーネント(図8-9を参照)を作成するか、または動的バインディングのデータソースを選択(図8-10を参照)できます。

図8-9 バインドなしリスト・ビューの作成

図8-9に示すダイアログに入力する際は、次の点を考慮してください。

- 「リスト・データ・コレクション」および「要素タイプ」フィールドは、「データのバインド」チェック・ボックスが選択解除された状態のときは無効化されています。

- 左側にあるイメージは、選択されているリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映しています。

- 「値」列の編集可能セルには、静的テキスト文字列が移入されます(表8-5を参照)。

- 「リスト・アイテム・コンテンツ」セルにイメージが含まれている場合、「値」セルはデフォルトで<add path to your image>文字列になります。この場合、それをイメージのパスに置き換える必要があります。

- リスト・ビューに、データがバインドされているのではなく、リスト・アイテム子コンポーネントが含まれている場合、区切り属性を設定できないため、「区切り属性」と「区切りモード」の両方のフィールドは無効化されています。

表8-5 リスト・ビューの静的テキスト文字列

リスト・フォーマット

要素行の値

出力テキストの値

シンプル

- テキスト

- 'ListItem Text'

メイン-サブ・テキスト

- メイン・テキスト

- 従属テキスト

- 'Main Text'

- 'This is the subordinate text.'

開始-終了

- 開始テキスト

- 終了テキスト

- 'Start Text'

- 'End Text'

四分円

- 上部の開始テキスト

- 上部の終了テキスト

- 下部の開始テキスト

- 下部の終了テキスト

- 'Start Text'

- 'End Text'

- 'Lower Start Text'

- 'Lower End Text'

図8-10は、リスト・ビュー・コンポーネントをデータにバインドすることを選択した場合の「リスト・ビューの編集」ダイアログを示しています。

図8-10 バインド済リスト・ビューの作成

図8-10に示すダイアログに入力する際は、次の点を考慮してください。

- 「データを今すぐバインド」チェック・ボックスを選択した場合、「リスト・データ・コレクション」および「要素タイプ」フィールドが有効になります。

- データソースを選択するには、「参照」をクリックします。これによって「リスト・ビュー・データ・コレクションの選択」ダイアログが開きます。そこで、データ・コントロール定義を選択するか(図8-11を参照)、ELビルダーを使用して適切なEL式を選択できます(図8-12を参照)。

図8-11 データ・コントロール定義の選択

図8-12 EL式の選択

- 「要素タイプ」フィールドを使用してデータ・コレクションのタイプを宣言できます(図8-10を参照)。

- 有効なデータ・コレクションを選択すると、「リスト・アイテム・コンテンツ」表の「値」列が「値バインディング」に変更され、その編集可能なセルにはデータコレクションから属性のリストが移入されます。特別な場合の設定の説明は、図8-13を参照してください。

- 左側のイメージは、選択したリスト・ビュー・フォーマットのメイン・コンテンツ要素を反映し、略図から基礎となる表の名前付き要素へのマッピングを提供します。

- リスト・アイテムは、その特定要素に対してどちらが適切であるかによって、出力テキストまたはイメージ・コンポーネントのいずれかとして生成されます。

- 要素(行)数は選択したリスト・ビュー・フォーマットであらかじめ決まっているため、行を追加または削除することはできません。

- 要素の順序は変更できません。

- 「区切り属性」フィールドのデフォルト値は「区切りなし」です。この場合、「区切りモード」フィールドは無効です。デフォルト以外の値を選択する場合は、「区切りモード」パラメータを指定する必要があります。さらに、「ListViewギャラリ」で区切りを含むバリエーションを選択した場合、デフォルト値はリストの最初の属性に設定されます。

バインド済リスト・ビューを作成するときに考慮する特殊な場合は次のとおりです。

- Java Beanメソッドによって汎用性がないリストが戻される場合、図8-10に示すように「要素タイプ」フィールドを使用して、リスト・アイテム・コンテンツを作成する必要があります。

- 入力されているリスト・データ・コレクション値がコレクションベースではない場合、図8-13に示すように、「値」列が空白の値を持つ「値バインディング」列に置換されます。

図8-13 非コレクションベース値の入力

詳細は、次の項を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- 第8.2.7.3項「スタイルを使用したレイアウトの構成」

- 第7.3.2.4.3項「コレクションのドラッグ・アンド・ドロップ」

- LayoutDemo (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。このサンプルは、様々なタイプのリスト・ビュー・コンポーネントの使用方法と、スタイルを適用してページ・レイアウトを特定のパターンに合せる方法を示しています。

- 第C.5項「アプリケーションの使用方法の制限」

8.2.7.1 リスト・ビュー・ページングの構成

リスト・ビュー・コンポーネントを構成して、任意の長さのリストにデータを表示できます。これは、リストの下部にデータを追加することによって行います。

fetchSize属性によって、リスト・ビュー・コンポーネントが最初にロードする行数が決定されます。fetchSizeで定義されているよりも多くの使用可能な行がある場合は、最後にフェッチされた行の後にクリック可能領域が表示されます。この領域内をクリックすると、fetchSizeに等しい行のバッチがさらにロードされます。表示する行がなくなるとクリック可能領域は表示されなくなります。

fetchSize属性はロード済行の数を表していません。かわりに、何行ずつ増加するのかを表しています。リスト・ビュー・コンポーネントの作成時には、fetchSize属性は、デフォルトでPageDefイテレータのrangeSizeを指すEL式を使用するように設定されています。PageDefファイルの詳細は、第7.3.2.4.5項「生成されるドラッグ・アンド・ドロップ・アーティファクトについて」および図7-49「PageDefファイル」を参照してください。fetchSizeをrangeSizeと同じ値に設定するとアプリケーションのパフォーマンスが向上します。

例8-13は、データ・コントロールのtestResultsと呼ばれるコレクションから作成されたlistView要素を示しています(第7.3.2.4項「データ・コントロールのビューへの追加」を参照)。

例8-13 fetchSize属性の設定

<amx:listView var="row"
value="#{bindings.testResults.collectionModel}"
fetchSize="#{bindings.testResults.rangeSize}">

前述の例では、fetchSize属性はbindings.testResultsのrangeSizeを指しています。例8-14は、この「ADFモバイルAMX」ページのPageDefファイルからの行を示しています。このPageDefファイルには、testResultsかバインドされるtestResultsIteratorというaccessorIterator要素が含まれています。

例8-14 PageDefファイルのaccessorIterator

<accessorIterator MasterBinding="Class1Iterator"
Binds="testResults"
RangeSize="25"
DataControl="Class1"
BeanClass="mobile.Test"
id="testResultsIterator"/>

詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のページ定義ファイルの使用方法に関する項を参照してください。

fetchSize属性が-1に設定されている場合、すてのレコードが取得されます。

8.2.7.2 リスト・ビュー・アイテムの再配置

リスト・ビューのアイテムは再配置できます。この機能は、iOSとAndroidのプラットフォームで類似しており、どちらも各リスト・アイテムの右マージンに沿って整列した再配置アイコンが表示されます。再配置操作は、エンド・ユーザーがハンドルとして再配置アフォーダンスを使用してリスト・アイテムにタッチしてドラッグしたときに開始されます。この操作は、エンド・ユーザーが表示画面から指を離したときに完了します。

注意:

エンド・ユーザーがリスト・アイテム上の他の場所をタッチしてドラッグした場合は、リストが上下にスクロールします。

再配置ドラッグ操作によって、リスト・アイテムがドッキング解除され、エンド・ユーザーがリスト内でリスト・アイテムを上下に移動できるようになります。

そのアイテムを再配置可能にするには、リスト・ビューが編集モードになっており、移動を許容可能になっている必要があります。

例8-15は、ADFモバイルAMXファイルで定義されているlistView要素を示しています。この定義によって、リスト・モードを編集可能と編集不可の間で切り替えることができる「編集」および編集停止ボタンが上部に表示されたリストが提示されます。

例8-15 再配置可能なリスト・ビューの定義

<amx:panelPage id="pp1">
<amx:commandButton id="edit" text="Edit"
rendered="#{!bindings.inEditMode.inputValue}">
<amx:setPropertyListener from="true"
to="#{bindings.inEditMode.inputValue}"
type="action"/>
</amx:commandButton>
<amx:commandButton id="stop"
text="Stop Editing"
rendered="#{bindings.inEditMode.inputValue}">
<amx:setPropertyListener from="false"
to="#{bindings.inEditMode.inputValue}"
type="action"/>
</amx:commandButton>
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row"
editMode="#{bindings.inEditMode.inputValue}"
moveListener="#{MyBean.Reorder}">
<amx:listItem>
<amx:outputText id= "ot1" value="#{row.description}">
</amx:listItem>
</amx:listView>
</amx:panelPage>

詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.2.7.3 スタイルを使用したレイアウトの構成

「ADFモバイルAMX」ページ・レイアウトを特定のパターンに合せるには、一連の事前定義済スタイルを使用するstyleClass属性(第8.6項「UIコンポーネントのスタイル設定」を参照)を介して定義される様々なタイプのリスト・ビュー・コンポーネントおよびスタイルを組み合せて使用します。

図8-14は、各行の開始(左)側と終了(右)側に異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、テキストのほかに各リスト・アイテムを拡張するリンクを表す右向き矢印が配置されています。

図8-14 デザインタイムの開始および終了テキストを持つリスト・ビュー

例8-16は、ADFモバイルAMXファイルで定義されているlistView要素およびその子要素を示しています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-startTextに設定すると、出力テキスト・コンポーネントが行の開始(左)側に配置され、そのテキストに黒いフォントが適用されます。この属性をadfmf-listItem-endTextに設定すると、出力テキスト・コンポーネントが行の終了(右)側に配置され、そのテキストに青いフォントが適用されます。右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この属性のデフォルト値はtrueであるため、この例にはこの設定は含まれていません。

例8-16 開始および終了テキストを持つリスト・ビューの定義

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItema">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf1s1" width="10px"/>
<amx:cellFormat id="cf11" width="60%" height="43px">
<amx:outputText id="outputText11" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf1s2" width="10px"/>
<amx:cellFormat id="cf12" halign="end" width="40%">
<amx:outputText id="outputText12" value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図8-15は、各行の開始と終了に異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、リンクを表す右向き矢印は含まれていません。

図8-15 デザインタイムの拡張リンクのない開始および終了テキストを持つリスト・ビュー

例8-17は、ADFモバイルAMXファイルで定義されているlistView要素およびその子要素を示しています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-startTextに設定すると、出力テキスト・コンポーネントが行の開始に配置され、そのテキストに黒いフォントが適用されます。この属性をadfmf-listItem-endTextに設定すると、出力テキスト・コンポーネントが行の終了に配置され、そのテキストに青いフォントが適用されます。それぞれの特定の行に右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この例では、この属性はすべてのlistItem要素に対してfalseに設定されているため、右向き矢印は表示されません。

例8-17 拡張リンクがない開始および終了テキストを持つリスト・ビューの定義

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItema" showLinkIcon="false">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl1">
<amx:cellFormat id="cf1s1" width="10px"/>
<amx:cellFormat id="cf11" width="60%" height="43px">
<amx:outputText id="outputText11" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf1s2" width="10px"/>
<amx:cellFormat id="cf12" halign="end" width="40%">
<amx:outputText id="outputText12" value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図8-16は、各行の開始と終了に異なるスタイルのテキストが追加され、左側の終了テキストの下にサブテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図8-16 デザインタイムの開始および終了テキストとサブテキストを持つリスト・ビュー

例8-18は、ADFモバイルAMXファイルで定義されているlistView要素およびその子要素を示しています。このリスト・ビューには、各行の開始と終了に表示されるテキストに加えて、終了テキストの下に配置されるサブテキストが含まれています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-upperStartTextに設定すると、出力テキスト・コンポーネントが行の左側に配置され、そのテキストに黒いフォントが適用されます。この属性をadfmf-listItem-upperEndTextに設定すると、出力テキスト・コンポーネントが行の右側に配置され、そのテキストに小さいグレー・フォントが適用されます。この属性をadfmf-listItem-captionTextに設定すると、出力テキスト・コンポーネントが、styleClass属性がadfmf-listItem-upperStartTextに設定されている出力テキスト・コンポーネントの下に配置され、そのテキストに小さいグレー・フォントが適用されます。

例8-18 開始および終了テキストとサブテキストを持つリスト・ビューの定義

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItema">
<amx:tableLayout id="tl1" width="100%">
<amx:rowLayout id="rl11">
<amx:cellFormat id="cf1s1" width="10px" rowSpan="2"/>
<amx:cellFormat id="cf11" width="60%" height="28px">
<amx:outputText id="outputTexta1" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf1s2" width="10px"/>
<amx:cellFormat id="cf12" halign="end" width="40%">
<amx:outputText id="outputTexta2" value="#{row.status}"
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rl12">
<amx:cellFormat id="cf13" columnSpan="3" width="100%" height="12px">
<amx:outputText id="outputTexta3"
value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図8-17は、各行にメイン・テキストとサブテキストとして異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図8-17 デザインタイムのメイン・テキストとサブテキストを持つリスト・ビュー

例8-19は、ADFモバイルAMXファイルで定義されているlistView要素およびその子要素を示しています。このリスト・ビューには、メイン・テキストおよびサブテキストを含む行が移入されます。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-mainTextに設定すると、出力テキスト・コンポーネントが行の開始に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-captionTextに設定すると、出力テキスト・コンポーネントが、styleClass属性がadfmf-listItem-mainTextに設定されている出力テキスト・コンポーネントの下に配置され、そのテキストに小さいグレー・フォントが適用されます。

例8-19 メイン・テキストとサブテキストを持つリスト・ビューの定義

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItema">
<amx:tableLayout id="tla1" width="100%">
<amx:rowLayout id="rla1">
<amx:cellFormat id="cf1s1" width="10px" rowSpan="2"/>
<amx:cellFormat id="cfa1" width="100%" height="28px">
<amx:outputText id="outputTexta1" value="#{row.name}"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rla2">
<amx:cellFormat id="cfa2" width="100%" height="12px" >
<amx:outputText id="outputTexta2" value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図8-18は、各行に、アイコンおよびメイン・テキストとサブテキストとして異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図8-18 デザインタイムのアイコン、メイン・テキストおよびサブテキストを持つリスト・ビュー

例8-20は、ADFモバイルAMXファイルで定義されているlistView要素およびその子要素を示しています。このリスト・ビューには、アイコン、メイン・テキストおよびサブテキストを含むセルが移入されます。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-mainTextに設定すると、出力テキスト・コンポーネントが行の左側に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-captionTextに設定すると、出力テキスト・コンポーネントが、styleClass属性がadfmf-listItem-mainTextに設定されている出力テキスト・コンポーネントの下に配置され、そのテキストに小さいグレー・フォントが適用されます。image要素の位置は、それが囲むcellFormatによって定義されます。

例8-20 アイコン、メイン・テキストおよびサブテキストを持つリスト・ビューの定義

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItemd">
<amx:tableLayout id="tld1" width="100%">
<amx:rowLayout id="rld1">
<amx:cellFormat id="cfdi" rowSpan="2" width="40px" halign="center">
<amx:image id="imaged1" source="#{row.image}"/>
</amx:cellFormat>
<amx:cellFormat id="cfd1" width="100%" height="28px">
<amx:outputText id="outputTextd1" value="#{row.name}"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rld2">
<amx:cellFormat id="cfd2" width="100%" height="12px">
<amx:outputText id="outputTextd2" value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図8-19は、各行の開始と終了に2つのタイプの異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。行には、テキストのほかに各リスト・アイテムを拡張するリンクを表す右向き矢印が配置されています。

図8-19 デザインタイムの4つのタイプのテキストを持つリスト・ビュー

例8-21は、ADFモバイルAMXファイルで定義されているlistView要素およびその子要素を示しています。このリスト・ビューには、各行の開始と終了に表示されるテキストに加えて、各行の両側に配置されている2つの異なるタイプのテキストが含まれています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-upperStartTextに設定すると、出力テキスト・コンポーネントが行の左上隅に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-upperEndTextに設定すると、出力テキスト・コンポーネントが行の右上隅に配置され、そのテキストに大きいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerStartTextに設定すると、出力テキスト・コンポーネントが行の左下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerEndTextに設定すると、出力テキスト・コンポーネントが行の右下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この属性のデフォルト値はtrueであるため、この例にはこの設定は含まれていません。

例8-21 4つのタイプのテキストを持つリスト・ビューの定義

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItema">
<amx:tableLayout id="tla1" width="100%">
<amx:rowLayout id="rla1">
<amx:cellFormat id="cf1s1" width="10px" rowSpan="2"/>
<amx:cellFormat id="cfa1" width="60%" height="28px">
<amx:outputText id="outputTexta1" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf1s2" width="10px" rowSpan="2"/>
<amx:cellFormat id="cfa2" width="40%" halign="end">
<amx:outputText id="outputTexta2" value=#{row.status}
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rla2">
<amx:cellFormat id="cfa3" width="60%" height="12px">
<amx:outputText id="outputTexta3" value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
<amx:cellFormat id="cfa4" width="40%" halign="end">
<amx:outputText id="outputTexta4" value="#{row.priority}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

図8-20は、各行の開始と終了に2つのタイプの異なるスタイルのテキストが追加されたリスト・ビュー・コンポーネントを示しています。

図8-20 デザインタイムの拡張リンクのない4つのタイプのテキストを持つリスト・ビュー

例8-22は、ADFモバイルAMXファイルで定義されているlistView要素およびその子要素を示しています。このリスト・ビューには、各行の開始と終了に表示されるテキストに加えて、各行の両側に配置されている2つの異なるタイプのテキストが含まれています。各outputText子要素がリスト内でどのようにレイアウトされるかは、listItemのtableLayout子要素によって指定されます。かわりに、styleClass属性を使用してoutputText要素をレイアウトおよびスタイル設定できます。この属性をadfmf-listItem-upperStartTextに設定すると、出力テキスト・コンポーネントが行の左上隅に配置され、そのテキストに大きい黒いフォントが適用されます。この属性をadfmf-listItem-upperEndTextに設定すると、出力テキスト・コンポーネントが行の右上隅に配置され、そのテキストに大きいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerStartTextNoChevronに設定すると、出力テキスト・コンポーネントが行の左下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。この属性をadfmf-listItem-lowerEndTextNoChevronに設定すると、出力テキスト・コンポーネントが行の右下隅に配置され、そのテキストに小さいグレー・フォントが適用されます。それぞれの特定の行に右向き矢印が表示されるかどうかは、listItem要素のshowLinkIcon属性によって構成されます。この例では、この属性はすべてのlistItem要素に対してfalseに設定されているため、右向き矢印は表示されません。

例8-22 拡張リンクのない4つのタイプのテキストを持つリスト・ビューの定義

<amx:listView id="listView1" value="#{myBean.listCollection}" var="row">
<amx:listItem id="listItema" showLinkIcon="false">
<amx:tableLayout id="tla1" width="100%">
<amx:rowLayout id="rla1">
<amx:cellFormat id="cf1s1" width="10px" rowSpan="2"/>
<amx:cellFormat id="cfa1" width="60%" height="28px">
<amx:outputText id="outputTexta1" value="#{row.name}"/>
</amx:cellFormat>
<amx:cellFormat id="cf1s2" width="10px" rowSpan="2"/>
<amx:cellFormat id="cfa2" width="40%" halign="end">
<amx:outputText id="outputTexta2" value=#{row.status}
styleClass="adfmf-listItem-highlightText"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rla2">
<amx:cellFormat id="cfa3" width="60%" height="12px">
<amx:outputText id="outputTexta3" value="#{row.desc}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
<amx:cellFormat id="cfa4" width="40%" halign="end">
<amx:outputText id="outputTexta4" value="#{row.priority}"
styleClass="adfmf-listItem-captionText"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>
</amx:listItem>
</amx:listView>

8.2.7.4 静的リスト・ビューの使用方法について

モデルからではなくハードコード化された値によって移入されるリスト・ビュー・コンポーネントを作成する場合、このリスト・ビューは静的になり、デザインタイムに設定するそのプロパティのいくつか(たとえばdividerAttribute、dividerMode、fetchSize、moveListener)がランタイムに無視されるようになります。

8.2.8 ポップアップ・コンポーネントの使用方法

ポップアップ(popup)コンポーネントを使用して、ポップアップ・ウィンドウを表示します。このコンポーネントは、ビュー・コンポーネントの子として宣言できます。

ポップアップ・コンポーネントとともに次の操作を使用できます。

- ポップアップ表示動作(showPopupBehavior)の操作は、ポップアップ表示動作のtype属性を使用して指定されたクライアントによってトリガーされるイベントに応答してポップアップを表示する宣言的な方法です。

- ポップアップを閉じる動作(closePopupBehavior)の操作は、クライアントによってトリガーされるイベントに応答してポップアップを閉じる宣言的な方法です。

ポップアップ表示動作のPopup Id属性は、その親コンポーネントに関連するポップアップ・コンポーネントの一意の識別子を指定します。ポップアップ表示動作のAlign Id属性は、そのポップアップを整列する基準となるコンポーネントの一意の識別子を指定します。識別子を手動で設定するのは、手間がかかり、さらに無効な参照が発生する可能性もあるため、これらの2つの属性の値は標準プロパティ・インスペクタと統合されているエディタを使用して設定します(図8-21を参照)。これらの識別子を検証するために特別に定義されている監査ルールがあります(第7.3.2.5章「要素識別子とその監査について」を参照)。

例8-23は、ADFモバイルAMXファイルで定義されているpopupおよびshowPopupBehavior要素を示しています。

例8-23 ポップアップおよびポップアップ表示動作の定義

<amx:view>
<amx:panelPage id="panelPage1">
<amx:commandButton id="commandButton1">
<amx:showPopupBehavior popupId="popup1" type="action"
align="before" alignId="panelPage1" />
</amx:commandButton>
</amx:panelPage>
<amx:popup id="popup1"/>
</amx:view>

ポップアップ・コンポーネントは、ユーザー入力エラーが発生したときに検証メッセージを表示できます。詳細は、第8.9項「入力の検証」を参照してください。

ポップアップID属性を設定するには:

1. 「ソース」エディタまたは「構造」ペインのshowPopupBehavior要素を選択します。

2. 図8-21に示すように、「ポップアップID」フィールドの右側にある下向き矢印をクリックして、「ポップアップID」ダイアログを開きます。

図8-21 ポップアップID属性の設定

3. 「ポップアップID」ダイアログで「編集」を選択し、図8-22に示すプロパティの編集: プロパティIDダイアログを開きます。

図8-22 ポップアップIDのプロパティの編集ダイアログ

4. ポップアップ・コンポーネントを選択します。

位置合せID属性を設定するには:

1. 「ソース」エディタまたは「構造」ペインのshowPopupBehavior要素を選択します。

2. 図8-23に示すように、「位置合せID」フィールドの右側にある下向き矢印をクリックして、「位置合せID」ダイアログを開きます。

図8-23 位置合せID属性の設定

3. 「ポップアップID」ダイアログで「編集」を選択し、図8-24に示すプロパティの編集: ポップアップIDダイアログを開きます。

図8-24 位置合せIDのプロパティの編集ダイアログ

4. ポップアップ表示動作操作の親コンポーネントを選択します。

LayoutDemoという名前のADFモバイル・サンプル・アプリケーションは、ポップアップ・コンポーネントの使用方法と、スタイルを適用してページ・レイアウトを特定のパターンに合せる方法を示しています。LayoutDemoアプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

8.2.9 パネル・スプリッタ・コンポーネントの使用方法

パネル・スプリッタ(panelSplitter)コンポーネントは、左側にあるナビゲーション・ペインで制御可能な複数のコンテンツ領域を表示するために使用します。パネル・スプリッタ・コンポーネントは、通常、表示サイズが大きいタブレット・デバイスで使用されます。これらのコンポーネントは、通常、表示領域の左側にリストが、右側にコンテンツがある場合に使用されます。次のコンポーネントのいずれにもパネル・スプリッタ・コンポーネントを含めることができます。

- パネル・グループ・レイアウト

- パネル・ページ

- ポップアップ

- イテレータ

- ファセット

- パネル・アイテム

パネル・スプリッタには、ファセット(第8.2.6項「ファセット・コンポーネントの使用方法」を参照)およびパネル・アイテム・コンポーネントを含めることができます。パネル・アイテム(panelItem)コンポーネントは、パネル・スプリッタのコンテンツ領域を表します。各パネル・スプリッタ・コンポーネントには少なくとも1つのパネル・アイテムが必要なため、パネル・スプリッタが作成されるときにパネル・アイテムがパネル・スプリッタに自動的に追加されます。各パネル・アイテム・コンポーネントには、パネル・グループ・レイアウトに含めることができるどのようなコンポーネントも含めることができます(第8.2.3項「パネル・グループ・レイアウト・コンポーネントの使用方法」を参照)。

「パネル・スプリッタ」の左側は、ナビゲータ・ファセット(navigator)によって表されます。これは、アニメーション付きの複数のコンテンツのみが必要とされる場合(たとえば、異なるボタンを選択してコンテンツを切り替えるときにアニメーションを必要とする選択ボタン付きの複数コンテンツ領域を描画する場合)のオプションです。横モードの場合、このファセットがレンダリングされます。縦モードの場合、ボタンはコンテンツ領域の上に配置され、クリックされたときにこのファセットのコンテンツがポップアップ内で起動されます。

例8-24は、ADFモバイルAMXファイルで定義されているpanelSplitter要素を、子コンポーネントとして使用されているnavigatorファセットとともに示しています。

例8-24 ナビゲータを含むパネル・スプリッタの定義

<panelSplitter id="ps1"
selectedItem="#{bindings.display.inputValue}"
animation="flipover">
<facet name="navigator">
<listView value="#{bindings.data.collectionModel}" var="row">
<listItem>
<outputText value="#{row.description}">
<setPropertyListener from="#{row.type}"
to="#{bindings.display.inputValue}"
type="action"/>
</listItem>
</listView>
</facet>
<panelItem id="x">
<panelGroupLayout>
...
</panelGroupLayout>
</panelItem>
<panelItem id="y">
<panelGroupLayout>
...
</panelGroupLayout>
</panelItem>
</panelSplitter>

例8-25は、ADFモバイルAMXファイルで定義されているpanelSplitter要素を示しています。navigatorファセットは、このpanelSplitterに対して定義されていません。かわりに、selectOneButtonを使用してレイアウトの選択が可能になっています。

例8-25 選択ボタンを含むパネル・スプリッタの定義

<selectOneButton id="sob1" value="#{bindings.listtype.inputValue}">
<selectItem label="Contacts" value="contacts"/>
<selectItem label="Accounts" value="accounts"/>
</selectOneButton>

<panelSplitter id="ps1"
selectedItem="#{bindings.listtype.inputValue}"
position="0"
animation="flipover">
<panelItem id="contacts" animation="fade">
<panelGroupLayout>
...
</panelGroupLayout>
</panelItem>
<panelItem id="accounts">
<panelGroupLayout>
...
</panelGroupLayout>
</panelItem>
</panelSplitter>

例8-26は、ADFモバイルAMXファイルで定義されているpanelSplitter要素を、レイアウトの選択を可能にするselectOneButton付きのpanelSplitterであるnavigatorファセットとともに示しています。

例8-26 ナビゲータおよぴ選択ボタンを含むパネル・スプリッタの定義

<panelSplitter id="ps1"
selectedItem="#{bindings.display.inputValue}"
animation="flipover">
<facet name="navigator">
<selectOneButton id="sob1" value="#{bindings.listtype.inputValue}">
<selectItem label="Contacts" value="contacts"/>
<selectItem label="Accounts" value="accounts"/>
</selectOneButton>

<panelSplitter id="sv2"
selectedItem="#{bindings.listtype.inputValue}"
navigatorWidth="0"
animation="flipup">
<panelItem id="contacts">
<panelGroupLayout>
...
<commandButton ...>
<setPropertyListener from="x"
to="#{bindings.display.inputValue}"
type="action"/>
</commandButton>
</panelGroupLayout>
</panelItem>
<panelItem id="accounts">
<panelGroupLayout>
...
<commandLink ...>
<setPropertyListener from="y"
to="#{bindings.display.inputValue}"
type="action"/>
</commandLink>
</panelGroupLayout>
</panelItem>
</panelSplitter>
</facet>
<panelItem id="x">
<panelGroupLayout>
...
</panelGroupLayout>
</panelItem>
<panelItem id="y">
<panelGroupLayout>
...
</panelGroupLayout>
</panelItem>
</panelSplitter>

詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.2.10 表のレイアウト・コンポーネントの使用方法

表のレイアウト(tableLayout)コンポーネントは、セルを含む行で構成される一般的な表のフォーマットでデータを表示するために使用します。

行のレイアウト(rowLayout)コンポーネントは、表のレイアウトの単一の行を表します。表のレイアウト・コンポーネントには、1つ以上の行のレイアウト・コンポーネント、または行のレイアウト・コンポーネントを生成できるイテレータ・コンポーネントのいずれかが含まれている必要があります。

セル・フォーマット(cellFormat)コンポーネントは、行のレイアウトのセルを表します。行のレイアウト・コンポーネントには、1つ以上のセル・フォーマット・コンポーネント、またはセル・フォーマット・コンポーネントを生成できるイテレータ・コンポーネントのいずれかが含まれている必要があります。

表のレイアウト構造では、セル・コンテンツで割合による高さを使用したり、表構造全体に高さをまとめて割り当てることはできません。詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスの表のレイアウト、行のレイアウト、およびセル・フォーマット・コンポーネントのlayout、widthおよびheight属性の説明を参照してください。

表のレイアウト・コンポーネントを追加するには:

1. 「コンポーネント・パレット」で、「表のレイアウト」を「ADFモバイルAMX」ページにドラッグ・アンド・ドロップします。

2. 必要な数の行のレイアウトまたはイテレータ子コンポーネントを表のレイアウト・コンポーネントに挿入します。

3. セル・フォーマットまたはイテレータ子コンポーネントをそれぞれの行のレイアウト・コンポーネントに挿入します。

4. 「プロパティ・インスペクタ」を使用して、すべての追加したコンポーネントの属性を設定します。詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

例8-27は、ADFモバイルAMXファイルで定義されているtableLayout要素およびその子を示しています。

例8-27 表のレイアウトの定義

<amx:tableLayout id="tableLayout1"
rendered="#{pageFlowScope.pRendered}"
styleClass="#{pageFlowScope.pStyleClass}"
inlineStyle="#{pageFlowScope.pInlineStyle}"
borderWidth="#{pageFlowScope.pBorderWidth}"
cellPadding="#{pageFlowScope.pCellPadding}"
cellSpacing="#{pageFlowScope.pCellSpacing}"
halign="#{pageFlowScope.pHalign}"
layout="#{pageFlowScope.pLayoutTL}"
shortDesc="#{pageFlowScope.pShortDesc}"
summary="#{pageFlowScope.pSummary}"
width="#{pageFlowScope.pWidth}">
<amx:rowLayout id="rowLayout1">
<amx:cellFormat id="cellFormatA" rowSpan="2" halign="center">
<amx:outputText id="otA" value="Cell A"/>
</amx:cellFormat>
<amx:cellFormat id="cellFormatB" rowSpan="2" halign="center">
<amx:outputText id="otB" value="Cell B (wide content)"/>
</amx:cellFormat>
<amx:cellFormat id="cellFormatC" rowSpan="2" halign="center">
<amx:outputText id="otC" value="Cell C"/>
</amx:cellFormat>
</amx:rowLayout>
<amx:rowLayout id="rowLayout2">
<amx:cellFormat id="cellFormatD" halign="end">
<amx:outputText id="otD" value="Cell D"/>
</amx:cellFormat>
<amx:cellFormat id="cellFormatE">
<amx:outputText id="otE" value="Cell E"/>
</amx:cellFormat>
</amx:rowLayout>
</amx:tableLayout>

8.3 UIコンポーネントの作成と使用方法

ADFモバイルAMX機能を開発する際は、次のUIコンポーネントを使用できます。

- 入力テキスト(第8.3.1項「入力テキスト・コンポーネントの使用方法」を参照)

- 入力数値スライダ(第8.3.2項「入力数値スライダ・コンポーネントの使用方法」を参照)

- 入力日(第8.3.3項「入力日コンポーネントの使用方法」を参照)

- 出力テキスト(第8.3.4項「出力テキスト・コンポーネントの使用方法」を参照)

- ボタン(第8.3.5項「ボタンの使用方法」を参照)

- リンク(第8.3.6項「リンクの使用方法」を参照)

- イメージ(第8.3.7項「イメージの表示方法」を参照)

- チェックボックス(第8.3.8項「チェックボックス・コンポーネントの使用方法」を参照)

- チェックボックスを複数選択(第8.3.9項「チェックボックスを複数選択コンポーネントの使用方法」を参照)

- 選択肢を複数選択(第8.3.11項「選択肢を複数選択コンポーネントの使用方法」を参照)

- ブール・スイッチ(第8.3.12項「ブール・スイッチ・コンポーネントの使用方法」を参照)

- 選択肢(第8.3.10項「選択肢コンポーネントの使用方法」を参照)

- 選択ボタン(第8.3.13項「選択ボタン・コンポーネントの使用方法」を参照)

- ラジオ・ボタン(第8.3.14項「ラジオ・ボタン・コンポーネントの使用方法」を参照)

- カルーセル(第8.3.15項「カルーセル・コンポーネントの使用方法」を参照)

- Verbatim (第8.3.16項「Verbatimコンポーネントの使用方法」を参照)

ADFモバイルAMX機能を開発する際は、UIコンポーネントの子として、操作、リスナー・タイプ・コンポーネントおよびコンバータなど、次のその他のコンポーネントも使用できます。

- イテレータ(第8.3.17項「反復の有効化方法」を参照)

- バンドルのロード(第8.3.18項「リソース・バンドルのロード方法」を参照)

- アクション・リスナー(第8.3.19項「アクション・リスナーの使用方法」を参照)

- プロパティ・リスナーの設定(第8.3.20項「プロパティ・リスナーの設定の使用方法」を参照)

- 日時の変換(第8.3.21項「日時の変換方法」を参照)

- 数値の変換(第8.3.22項「数値の変換方法」を参照)

UIコンポーネントを追加するには、それを「コンポーネント・パレット」から「ADFモバイルAMX」ページにドラッグ・アンド・ドロップします(第7.3.2.1項「UIコンポーネントの追加」を参照)。その後で、「プロパティ・インスペクタ」を使用してそのコンポーネントの属性を設定します(第7.3.2.3項「UIコンポーネントの構成」を参照)。それぞれの特定のコンポーネントの属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

注意:

「ADFモバイルAMX」ページで、レイアウト・コンポーネント内にUIコンポーネントを配置します(第8.2項「ページ・レイアウトの設計」を参照)。UI要素は、<amx>ネームスペースの下で宣言します。

いくつかのUIコンポーネントにはイベント・リスナーを追加できます。詳細は、第8.10項「イベント・リスナーの使用方法」を参照してください。イベント・リスナーは、iOSとAndroidのどちらのデバイスでもADFモバイルAMXランタイムの記述のためにコンポーネントに適用できますが、それらのリスナーはデザインタイムでは何の効果も持ちません。

CompGalleryという名前のADFモバイル・サンプル・アプリケーションは、ADFモバイルAMX UIコンポーネントの作成および構成方法を示しています。LayoutDemoという名前のもう1つのサンプル・アプリケーションは、「ADFモバイルAMX」ページでのコンポーネントのレイアウト方法を示しています。これらのサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

8.3.1 入力テキスト・コンポーネントの使用方法

入力テキスト(inputText)コンポーネントは、編集可能テキスト・フィールドを表します。使用可能な入力テキスト・コンポーネントのタイプは次のとおりです。

- 標準単一行入力テキスト。これは、ADFモバイルAMXファイルのinputText要素で宣言されます。

<amx:inputText id="text1"
label="Text Input:"
value="#{myBean.text}" />

- パスワード入力テキスト:

<amx:inputText id="text1"
label="Password Input:"
value="#{myBean.text}"
secret="true" />

- 複数行入力テキスト(テキスト領域とも呼ばれる):

<amx:inputText id="text1"
label="Textarea:"
value="#{myBean.text}"
simple="true"
rows="4" />

図8-25は、「プレビュー」ペインに表示されている入力テキスト・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:inputText id="inputText1"
label="Input Text"
value="text"/>

図8-25 デザインタイムの入力テキスト

inputType属性によって、コンポーネントでユーザー入力がどのように(テキスト(デフォルト)、電子メール・アドレス、数値、電話銀号、URLのいずれかとして)解釈されるのかを定義できます。これらの入力タイプは、HTML5によって許容される値に基づいています。

入力テキスト・コンポーネントに入力される日時値とともに数値の変換を有効にするには、数値の変換(第8.3.22項「数値の変換方法」を参照)および日時の変換(第8.3.21項「日時の変換方法」を参照)コンポーネントを使用します。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

いくつかのモバイル・デバイスでは、エンド・ユーザーが入力テキスト・フィールドをタップすると、キーボードが表示(スライドアップ)されます。入力テキストが「ADFモバイルAMX」ページの唯一のコンポーネントである場合、ページがロードされるときに、デフォルトで入力フォーカスはこのフィールド上に配置され、キーボードが表示されます。

複数行入力テキストは、それが唯一のコンポーネントである場合、セカンダリ・ページに表示されることがあります。その場合、ページがロードされてキーボードが表示されたときに複数行入力テキストがフォーカスを受け取ります。

iOSデバイスとAndroidデバイスでは、入力テキスト・コンポーネントのレンダリングおよび動作は異なります。iPhoneおよびiPadでは、入力テキスト・コンポーネントが表示されるときに境界線がある場合とない場合があります。

入力テキスト・コンポーネントを作成する際は、次の点を考慮してください。

- 入力テキスト・コンポーネントで表されるフィールドか境界線付きで表示される場合、そのフィールドは、高さが固定され、角丸になります。

- コンテンツを入力または編集するには、エンド・ユーザーはフィールド内をタップする必要があります。それにより、タップした場所に点滅する挿入カーソルが表示され、エンド・ユーザーがコンテンツを編集できるようになります。フィールドにコンテンツが含まれていない場合、挿入カーソルはフィールドの先頭に配置されます。

- 入力テキスト・コンポーネントによって表されるフィールドには、通常、プロンプトとして使用されるデフォルト・テキストが含まれていることがあります。エンド・ユーザーがそのようなフィールド内でキーボードのキーをタップすると、編集モードになったときにそのデフォルト・テキストがクリアされます。

- 入力テキスト・コンポーネントによって表されるフィールドには、選択済の外観はありません。選択は、フィールド内の点滅する挿入カーソルによって示されます。

- エンド・ユーザーがフィールドに収まる数を超えたテキストを入力すると、タイピングの続行に従って一度に1文字ずつテキスト・コンテンツが左にシフトします。

複数行入力テキスト・コンポーネントは、任意の高さの角丸の長方形としてレンダリングされます。このコンポーネントでは、コンテンツが大きすぎてフィールドの境界内に収まらない場合のスクロールがサポートされています。テキスト領域がいっぱいになるとテキストの行が上にスクロールし、新しい行のテキストが追加されます。指定された表示領域に表示できる数よりも多くの行がある場合、エンド・ユーザーは上または下にフリックしてテキストの行をスクロールできます。コンポーネント内にスクロールバーが表示されてその領域がスクロール可能であることを示します。

パスワード・フィールドは入力された各文字を一時的にエコーし、その後、その文字をドットに変換してパスワードを保護します。

8.3.2 入力数値スライダ・コンポーネントの使用方法

入力数値スライダ(inputNumberSlider)コンポーネントは、キーを使用して値を入力するかわりにスライダを使用して値の範囲から数値を選択できるようにします。スライダの溝またはトラックの塗り潰されている部分が、現在の値を視覚的に表しています。

スライダの値を数値的に示すには、出力または入力テキスト・コンポーネントとともに入力数値スライダを使用できます。入力テキスト・コンポーネントではスライダ値を直接入力することもできます。エンド・ユーザーが入力テキスト・フィールドをタップすると、数値モードのキーボードがスライドアップします。このキーボードは、スライドダウン・ボタンを使用するか、スライダ・コンポーネントからタップすることにより消去できます。

入力数値スライダ・コンポーネントは、常に、コンポーネントの定義済範囲内の最大値および最小値を表示します。

注意:

入力数値スライダ・コンポーネントは、正確な数値入力が必要な場合や値の範囲が広い場合(たとえば、0～1000)は使用しないでください。

例8-28は、ADFモバイルAMXファイルで定義されているinputNumberSlider要素を示しています。

例8-28 入力数値スライダの定義

<amx:inputNumberSlider id="slider1" value="#{myBean.count}"/>

図8-26は、「プレビュー」ペインに表示されている入力数値スライダ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:inputNumberSlider id="inputNumberSlider1"
label="Input Number"
minimum="0"
maximum="20"
stepSize="1"
value="10"/>

図8-26 デザインタイムの入力数値スライダ

入力数値スライダ・コンポーネントに入力される数値の変換を有効にするには、数値の変換コンポーネント(第8.3.22項「数値の変換方法」を参照)を使用します。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

他のADFモバイルAMX UIコンポーネントと同様に、入力数値スライダ・コンポーネントには通常の状態と選択済状態があります。コンポーネントは、いつでもタッチされたときに選択済状態になります。エンド・ユーザーは、スライダ値を変更するには、タッチしてからスライダ・ボタンを操作します。

8.3.3 入力日コンポーネントの使用方法

入力日(inputDate)コンポーネントは、日付を入力するためのポップアップ入力フィールドを提示します。デフォルトの日付フォーマットは、現在のロケールに適切な省略の日付フォーマットです。たとえば、米語(ENU)のデフォルトの書式はmm/dd/yyです。inputType属性によって、コンポーネントが入力として日付、時刻または日時を受け入れるのかどうかが定義されます。タイムゾーンは、モバイル・デバイスに対して構成されているタイムゾーンに依存します。したがって、デバイスに関連しています。実行時、入力日コンポーネントにはそのデバイスのネイティブのルック・アンド・フィールがあります。

例8-29は、ADFモバイルAMXファイルで定義されているinputDate要素を示しています。このコンポーネントのinputType属性は、デフォルト値のdateに設定されています。

例8-29 入力日の定義

<amx:inputDate id="inputDate1" label="Input Date" value="#{myBean.date}"/>

注意:

value属性は、EL式としてのみ指定できます。

図8-27は、「プレビュー」ペインに表示されている入力日コンポーネントを示しています。

図8-27 デザインタイムの入力日

詳細は、次の項を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- W3Cによって定義されているグローバル日付と時刻

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.4 出力テキスト・コンポーネントの使用方法

ADFモバイルAMXは、テキストを表示するラベルとして使用するために出力テキスト(outputText)コンポーネントを提供しています。

例8-30は、ADFモバイルAMXファイルで定義されているoutputText要素を示しています。

例8-30 出力テキストの定義

<amx:outputText id="ot1"
value="output"
styleClass="#{pageFlowScope.pStyleClass}"/>

図8-28は、「プレビュー」ペインに表示されている出力テキスト・コンポーネントを示しています。

図8-28 デザインタイムの出力テキスト

出力テキスト・コンポーネントの数値および日時関連データの変換を容易にするには、数値の変換(第8.3.22項「数値の変換方法」を参照)および日時の変換(第8.3.21項「日時の変換方法」を参照)コンバータを使用します。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGalleryおよびLayoutDemo(開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)

8.3.5 ボタンの使用方法

ボタン(commandButton)コンポーネントは、アクション(たとえば、保存、取消し、送信)をトリガーするため、およびアプリケーション内で他のページへのナビゲーション(たとえば、戻る。第8.3.5.6項「戻るボタン・ナビゲーションの有効化」を参照)を有効化するために使用します。

ボタンは、次の方法のいずれかで使用できます。

- テキスト・ラベル付きボタン。

- テキスト・ラベルおよびイメージ・アイコン付きボタン。

注意:

アイコン・イメージと配置(テキスト・ラベルの左または右)を定義できます。

- イメージ・アイコンのみが付いたボタン(たとえば、レコードを追加または削除するための + および - ボタン)。

ADFモバイルでは、次の3つの表示領域に対して1つのデフォルト・ボタン・タイプがサポートされています。

1. 最上部ヘッダー・バーに表示されるボタン。「ADFモバイルAMX」ページでは、ヘッダーは、ヘッダー、プライマリおよびセカンダリ・ファセットと組み合せたパネル・ページ・コンポーネントによって表されます。iPhoneではこれが一般的です(第8.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)。

- ヘッダー・ファセットには、ページ・タイトルが含まれています。

- プライマリ・アクション・ファセットは、 ヘッダー・バーの左隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

- セカンダリ・アクション・ファセットは、ヘッダー・バーの右隅に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

2. ページのコンテンツ領域に表示されるボタン。

3. ページのフッター・バーに表示されるボタン。「ADFモバイルAMX」ページでは、フッターは、フッター・ファセットと組み合せたパネル・ページ・コンポーネントによって表されます(第8.2.2項「パネル・ページ・コンポーネントの使用方法」を参照)。

- フッター・ファセットは、コンテンツ領域の下に表示される領域を表します。一般的にボタンまたはリンク・コンポーネントを保持しますが、任意のコンポーネント・タイプを含めることができます。

どのタイプでも、すべてのボタン・コンポーネントには次の3つの状態があります。

1. 標準。

2. 選択済: ボタンがエンド・ユーザーによってタップまたはタッチされたときの外観を表します。ボタンがタップされた(タッチされてリリースされた)ときに、ボタン・アクションが実行されます。タッチしたときに選択済外観が表示され、リリースしたときにアクションが実行されます。エンド・ユーザーがボタンにタッチした後、指をドラッグしてボタンから離した場合、アクションは実行されません。ただし、ボタンにタッチしている間中、選択済外観が表示されます。

3. 無効。

ボタン・コンポーネントの外観は、adfmf-commandButton-<style>に設定したそのstyleClass属性によって定義されます。表8-6に示すどのスタイルでも、「ADFモバイルAMX」ページ内の有効な任意の場所に配置されているボタンに適用できます。

表8-6 ボタン・スタイル

ボタン・スタイル名

説明

デフォルト

次の場所に配置されているボタンのデフォルト・スタイル

- いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)内。詳細は、第8.3.5.1項「デフォルト・スタイル・ボタンの表示」を参照してください

- 「ADFモバイルAMX」ページのコンテンツ領域内の任意の場所。このスタイルは、ページ内のボタンの場所またはコンテキストに基づいてそのページ内で特定のアクションを実行するためのボタンに対して使用されます。

戻る

いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)に配置されるボタンの戻るスタイル。このスタイルを、デフォルト・ボタンに適用すると、ページに戻るという外観を表示できます。このボタン・スタイルは、Springboardに戻るまたはページに戻るボタンによく使用されます。

詳細は、第8.3.5.2項「戻るスタイル・ボタンの表示」を参照してください

強調表示

いずれかのパネル・ページ・ファセット(プライマリ、セカンダリ、ヘッダー、フッター)または「ADFモバイルAMX」ページのコンテンツ領域に配置されるボタンの強調表示スタイル。このスタイルをボタンに追加すると、保存(または完了)ボタンで一般的なiPhoneボタンの外観を提供できます。

詳細は、第8.3.5.3項「強調表示スタイル・ボタンの表示」を参照してください

アラート

アラート・スタイルは削除の外観をボタンに追加します。詳細は、第8.3.5.4項「アラート・スタイル・ボタンの表示」を参照してください

ほかに、ボタンに適用して太い角丸の境界線でボタンを修飾できる角丸スタイル(adfmf-commandButton-rounded)があります。このスタイルは他のどのようなスタイルとも組み合せて定義できます。

ADFモバイルAMXにおけるボタン・コンポーネントの子操作および属性の処理には、特定の順序があります。詳細は、第8.3.5.7項「操作と属性の処理順序について」を参照してください。

8.3.5.1 デフォルト・スタイル・ボタンの表示

パネル・ページ・ファセットまたはコンテンツ領域内に配置されている様々なタイプのデフォルト・スタイル・ボタンは、次のようにモバイル・デバイスに表示されます。

- テキスト・ラベルのみが付いた標準ボタン:

- テキスト・ラベルのみが付いた選択済ボタン:

- テキスト・ラベルのみが付いた無効ボタン:

- イメージ・アイコンのみが付いた標準ボタン:

- イメージ・アイコンのみが付いた選択済ボタン:

- イメージ・アイコンのみが付いた無効ボタン:

例8-31および例8-32は、ADFモバイルAMXファイルで宣言されているcommandButton要素を示しています。

例8-31 テキスト・ラベル付きデフォルト・ボタンの定義

<amx:panelPage id="pp1">
.<amx:facet name="primary">
<amx:commandButton id="cb1"
text="Cancel"
action="cancel"
actionListener="#{myBean.rollback}"/>
</amx:facet>
</amx:panelPage>

例8-32 イメージ・アイコン付きデフォルト・ボタンの定義

<amx:panelPage id="pp1">
.<amx:facet name="primary">
<amx:commandButton id="cb1"
icon="plus.png"
action="add"
actionListener="#{myBean.AddItem}"/>
</amx:facet>
</amx:panelPage>

例8-33は、パネル・ページのフッター・ファセット内で宣言されているcommandButton要素を示しています。

例8-33 フッター・ファセットのテキスト・ラベルおよびイメージ付きデフォルト・ボタンの定義

<amx:panelPage id="pp1">
<amx:facet name="footer">
<amx:commandButton id="cb2"
icon="folder.png"
text="Move (#{myBean.mailcount})"
action="move"/>
</amx:facet>
</amx:panelPage>

例8-34は、パネル・ページのコンテンツ領域の一部で宣言されているcommandButton要素を示しています。

例8-34 ページ・コンテンツ領域におけるテキスト・ラベル付きデフォルト・ボタンの定義

<amx:panelPage id="pp1">
<amx:commandButton id="cb1"
text="Reply"
actionListener="#{myBean.share}"/>
</amx:panelPage>

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.5.2 戻るスタイル・ボタンの表示

パネル・ページ・ファセットまたはコンテンツ領域内に配置されている様々なタイプの戻るスタイル・ボタンは、次のようにモバイル・デバイスに表示されます。

- テキスト・ラベルのみが付いた標準ボタン:

- テキスト・ラベルのみが付いた選択済ボタン:

- テキスト・ラベルのみが付いた無効ボタン:

- イメージ・アイコンのみが付いた標準ボタン:

- イメージ・アイコンのみが付いた選択済ボタン:

- イメージ・アイコンのみが付いた無効ボタン:

例8-35は、ADFモバイルAMXファイルで宣言されているcommandButton要素を示しています。

例8-35 テキスト・ラベル付き戻るボタンの定義

<amx:panelPage id="pp1">
<amx:facet name="primary">
<amx:commandButton id="cb1"
text="Back"
action"__back"/>
</amx:facet>
</amx:panelPage>

プライマリ・ファセット内にボタン・コンポーネント配置し、そのaction属性を__backに設定した場合は常に、ADFモバイルAMXによって戻る矢印スタイリングがそれに自動的に適用されます。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.5.3 強調表示スタイル・ボタンの表示

パネル・ページ・ファセットまたはコンテンツ領域内に配置されている様々なタイプの強調表示スタイル・ボタンは、次のようにモバイル・デバイスに表示されます。

- 標準ボタン

- 選択済ボタン

- 無効ボタン

例8-36は、ADFモバイルAMXファイルで宣言されているcommandButton要素を示しています。

例8-36 テキスト・ラベル付き強調表示ボタンの定義

<amx:panelPage id="pp1">
<amx:facet name="secondary">
<amx:commandButton id="cb2"
text="Save"
action"save"
styleClass="adfmf-commandButton-highlight"/>
</amx:facet>
</amx:panelPage>

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.5.4 アラート・スタイル・ボタンの表示

パネル・ページ・コンテンツ内に配置されている様々なタイプのアラート・スタイル・ボタンは、次のようにモバイル・デバイスに表示されます。

- テキスト・ラベルのみが付いた標準ボタン:

- テキスト・ラベルのみが付いた選択済ボタン:

- テキスト・ラベルのみが付いた無効ボタン:

例8-37は、ADFモバイルAMXファイルで宣言されているcommandButton要素を示しています。

例8-37 テキスト・ラベル付きアラート・ボタンの定義

<amx:commandButton id="cb1"
text="Delete"
actionListener="#{myBean.delete}"
styleClass="adfmf-commandButton-alert" />

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.5.5 アプリケーション内でのボタンの使用方法

ADFモバイル・アプリケーションでは、次のコンテキスト内でボタン・コンポーネントを使用できます。

- ナビゲーション・バー

- 特定のアクションを実行するためのコンテンツ領域

- アクション・シート

- ポップスタイル・アラート・メッセージ

ナビゲーション・バー

ADFモバイルでは、ナビゲーション・バーで使用する標準ボタンを作成できます。

- 編集ボタンで、エンド・ユーザーは編集またはコンテンツ操作モードに入ることができます。

- 取消ボタンで、エンド・ユーザーは、変更を保存することなく編集またはコンテンツ操作モードを終了できます。

- 保存ボタンで、エンド・ユーザーは、変更を保存して編集またはコンテンツ操作モードを終了できます。

- 完了ボタンで、エンド・ユーザーは、変更があれば保存して現在のモードを終了できます。

- 元に戻すボタンで、エンド・ユーザーは最後のアクションを元に戻すことができます。

- やり直しボタンで、エンド・ユーザーは最後の元に戻したアクションをやり直すことができます。

- 戻るボタンで、エンド・ユーザーはSpringboardに戻ることができます。

- ページに戻るボタンで、エンド・ユーザーはボタン・テキスト・ラベルによって識別されるページに戻ることができます。

- 追加ボタンで、エンド・ユーザーは新しいオブジェクトを追加または作成できます。

コンテンツ領域

ページのコンテンツ領域内に配置されたボタンは、そのページ内のボタンの場所およびコンテキストに指定されている特定のアクションを実行します。これらのボタンは、ナビゲーション・バーに配置されているボタンとは異なる外観を持っている場合があります。

アクション・シート

次に、アクション・シート内に配置されたボタンの例を示します。

アラート・メッセージ

次に、検証メッセージ内に配置されたボタンの例を示します。

8.3.5.6 戻るボタン・ナビゲーションの有効化

ADFモバイルAMXでは、前に訪問したページに戻るデフォルト動作を持つ戻るボタンを使用した移動がサポートされています。詳細は、第7.2.9項「UIコンポーネントを使用したアクション結果の指定方法」を参照してください。

__backナビゲーションを備えたパネル・ページのプライマリ・ファセットにボタン・コンポーネントを追加すると、そのボタンには、戻る矢印の視覚的スタイリングが自動的に設定されます(第8.3.5.2項「戻るスタイル・ボタンの表示」を参照)。これを無効にするには、styleClass属性をamx-commandButton-normalに設定します。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.5.7 操作と属性の処理順序について

ボタン、リンク、リスト・アイテムなどのコンポーネントがアクティブになっている場合に、ADFモバイルAMXによって操作および属性が処理される順序は、次のとおりです。

1. 次の子操作は、XMLファイルに表示される順序で処理されます。

- プロパティ・リスナーの設定

- アクション・リスナー

- ポップアップ表示動作

- ポップアップを閉じる動作

2. アクション・リスナー(actionListener)属性が処理されて関連付けられたJavaメソッドが起動されます。

3. アクション(action)属性が処理されて、ナビゲーション・ケースがあればそれに従います。

8.3.6 リンクの使用方法

リンク(commandLink)コンポーネントは、アクションをトリガーするためおよび他のビューへのナビゲーションを有効化するために使用します。

パネル・グループ・レイアウトと同様に、リンク・コンポーネントは、その子として任意のタイプのコンポーネントを定義できます。プロパティ・リスナーの設定(第8.3.20項「プロパティ・リスナーの設定の使用方法」を参照)、アクション・リスナー(第8.3.19項「アクション・リスナーの使用方法」を参照)、ポップアップ表示動作、ポップアップを閉じる動作(第8.2.8項「ポップアップ・コンポーネントの使用方法」を参照)をリンク・コンポーネントの子として使用することで、クリックおよびジェスチャーを実行できるアクション可能な領域を作成できます。

リンク内にイメージ・コンポーネントを配置することで(第8.3.7項「イメージの表示方法」を参照)、クリック可能イメージを作成できます。

例8-38は、ADFモバイルAMXファイルで宣言されているcommandLink要素を示しています。

例8-38 リンクの定義

<amx:commandLink id="cl1"
text="linked"
action="gotolink"
actionListener="#{myBean.doSomething}"/>

図8-29は、「プレビュー」ペインに表示されているリンク・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:commandLink id="commandLink1"
text="Link"
action="__back"/>

図8-29 デザインタイムのリンク

ADFモバイルAMXにおけるリンク・コンポーネントの子操作および属性の処理には、特定の順序があります。詳細は、第8.3.5.7項「操作と属性の処理順序について」を参照してください。

ADFモバイルAMXでは、リンクに類似しているが、ページ間のナビゲーションは許可されない別のコンポーネントであるリンク(実行) (goLink)コンポーネントが提供されています。このコンポーネントを使用して、外部ページへのリンクを有効化できます。図8-30は、「プレビュー」ペインに表示されているリンク(実行)コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:goLink id="goLink1"
text="Go Link"
url="http://example.com"/>

図8-30 デザインタイムのリンク(実行)

イメージは、リンク(実行)コンポーネントの子として指定できる唯一のコンポーネントです。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.7 イメージの表示方法

ADFモバイルAMXでは、ビットマップによって表されるイメージ(image)コンポーネントを使用してiOSおよびAndroidデバイス上にイメージを表示できます。

ボタンおよびリスト・ビューにイメージを配置するだけでなく、それをリンク・コンポーネント内に配置して(第8.3.6項「リンクの使用方法」を参照)クリック可能イメージを作成できます。

例8-39は、ADFモバイルAMXファイルのimage要素の定義を示しています。

例8-39 イメージの定義

<amx:image id="i1"
styleClass="prod-thumb"
source="images/img-big-#{pageFlowScope.product.uid}.png" />

Androidプラットフォームでサポートされているフォーマットは次のとおりです。

- GIF

- JPEG

- PNG

- BMP

iOSプラットフォームでサポートされているフォーマットは次のとおりです。

- PNG

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGalleryおよびLayoutDemo(開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)

8.3.8 チェックボックス・コンポーネントの使用方法

チェックボックス(selectBooleanCheckbox)コンポーネントは、trueまたはfalseの値からの単一選択(選択済状態と選択解除状態の間で切り替えできる)を可能にするために作成するチェックボックスを表します。

チェックボックス・コンポーネントのlabel属性を使用するとチェックボックスの左側にテキストを配置でき、text属性を使用すると右側にテキストを配置できます。

例8-40は、ADFモバイルAMXファイルで宣言されているselectBooleanCheckbox要素を示しています。

例8-40 チェックボックスの定義

<amx:selectBooleanCheckbox id="check1"
label="Agree to the terms:"
value="#{myBean.bool1}"/>

図8-31は、「プレビュー」ペインに表示されているチェックボックス・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanCheckbox id="selectBooleanCheckbox1"
label="Checkbox"
value="false"/>

図8-31 デザインタイムのチェックボックス

図8-32は、様々な状態にあるチェックボックス・コンポーネントの視覚的表現を示しています。

図8-32 チェックボックスの状態

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.8.1 iOSプラットフォームでのチェックボックス・コンポーネントのサポート

iOSでは、ネイティブ・チェックボックス・コンポーネントはサポートされていません。ブール・スイッチは、通常、プロパティ・ページで使用され、ブール選択を可能にします(第8.3.12項「ブール・スイッチ・コンポーネントの使用方法」を参照)。

8.3.8.2 Androidプラットフォームでのチェックボックス・コンポーネントのサポート

Androidでは、ネイティブ・チェックボックス・コンポーネントがサポートされています。このコンポーネントは、設定ページで広く使用され、個々の設定値のオンとオフを切り替えます。

8.3.9 チェックボックスを複数選択コンポーネントの使用方法

チェックボックスを複数選択(selectManyCheckbox)コンポーネントは、trueまたはfalseの値の複数選択を可能にするために使用するチェックボックスのグループを表します。これにより、グループ内の各チェックボックスの選択済と選択解除の切替えが可能になります。この選択メカニズムは、チェックボックスを複数選択コンポーネントに含まれているアイテムの選択コンポーネント(第8.3.10.3項「アイテムの選択コンポーネントの違いについて」を参照)によって提供されます。

注意:

チェックボックスを複数選択コンポーネントには、アイテムの選択(selectItems)コンポーネントを1つ、またはアイテムの選択(selectItem)コンポーネントを1つ以上含めることができます。

例8-41は、ADFモバイルAMXファイルで宣言されているselectManyCheckbox要素を示しています。

例8-41 チェックボックスを複数選択の定義

<amx:selectManyCheckbox id="selectManyCheckbox1"
label="Select shipping options"
value="#{myBean.shipping}"
<amx:selectItem label="Air" value="#{myBean.shipping.air}"/>
<amx:selectItem label="Rail" value="#{myBean.shipping.rail}"/>
<amx:selectItem label="Water" value="#{myBean.shipping.water}"/>
</amx:selectManyCheckbox>

図8-33は、「プレビュー」ペインに表示されているチェックボックスを複数選択コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectManyCheckbox id="selectManyCheckbox1"
label="Select Many Checkbox"
value="value2">
<amx:selectItem label="Selection 1" value="value1"/>
<amx:selectItem label="Selection 2" value="value2"/>
<amx:selectItem label="Selection 3" value="value3"/>
</amx:selectManyCheckbox>

図8-33 デザインタイムのチェックボックスを複数選択

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.9.1 チェックボックスを複数選択コンポーネントとユーザーとの対話について

ADFモバイルAMXでは、チェックボックスを複数選択コンポーネントを表示するための2つの代替方法が提供されています。ポップアップ・スタイル(デフォルト)とリスト・スタイル(使用可能な選択肢の数がデバイスの画面サイズを超えている場合に使用される)です。

iPhoneとiPadの両方でのポップアップスタイルのチェックボックスを複数選択コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストがポップアップに表示されます。選択を行うには、エンド・ユーザーは1つ以上の選択肢をタップします。選択内容を保存するには、エンド・ユーザーはポップアップの外をタップするか、閉じるボタン( x )を使用してポップアップを閉じます。

ポップアップを閉じるときに、コンポーネントに表示されている値が、選択済の値に更新されます。

選択肢の数がデバイスのサイズを超える場合、スクロール可能なリスト・ビュー(第8.2.7項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)を含むフルページ・ポップアップが生成されます。

iPhoneとiPadの両方でのリストスタイルのチェックボックスを複数選択コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストが表示されます。選択を行うには、エンド・ユーザーは上下にスクロールして使用可能な選択肢を参照し、1つ以上の選択肢をタップします。選択内容を保存するには、エンド・ユーザーは閉じるボタン( x )をタップします。

リストを閉じるときに、コンポーネントに表示されている値が、選択済の値に更新されます。

注意:

どちらの場合も、選択を取り消すメカニズムは提供されていません。

8.3.10 選択肢コンポーネントの使用方法

選択肢(selectOneChoice)コンポーネントは、リストからの単一の値の選択を可能にするために使用するコンボ・ボックスを表します。この選択メカニズムは、選択肢コンポーネントに含まれているアイテムの選択コンポーネント(第8.3.10.3項「アイテムの選択コンポーネントの違いについて」を参照)によって提供されます。

注意:

選択肢コンポーネントには、アイテムの選択(selectItems)コンポーネントを1つ、またはアイテムの選択(selectItem)コンポーネントを1つ以上含めることができます。

例8-42は、ADFモバイルAMXファイルのselectOneChoice要素の定義をselectItemsサブ要素とともに示しています。

例8-42 アイテムの選択コンポーネントを使用した選択肢の定義

<amx:selectOneChoice id="choice1"
label="Your state:"
value="#{myBean.myState}">
<amx:selectItem label="Alaska" value="AK"/>
<amx:selectItem label="Alabama" value="AL"/>
<amx:selectItem label="California" value="CA"/>
<amx:selectItem label="Connecticut" value="CT"/>
</amx:selectOneChoice>

例8-43 アイテムの選択コンポーネントを使用した選択肢の定義

<amx:selectOneChoice id="choice1"
label="Your state:"
value="#{myBean.myState}">
<amx:selectItems value="myBean.allStates"/>
</amx:selectOneChoice>

図8-34は、「プレビュー」ペインに表示されている選択肢コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectOneChoice id="selectOneChoice1"
label="Choice"
value="value1">
<amx:selectItem label="Value 1" value="value1"/>
<amx:selectItem label="Value 2" value="value2"/>
<amx:selectItem label="Value 3" value="value3"/>
</amx:selectOneChoice>

図8-34 デザインタイムの選択肢

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.10.1 iOSプラットフォームでの選択肢コンポーネントとユーザーとの対話について

ADFモバイルAMXでは、選択肢コンポーネントを表示するため、ポップアップ・スタイルとドロップダウン・スタイルの2つの代替方法が提供されています。

iPhoneでのネイティブ選択肢コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると選択肢のリストが、デフォルトで最初のオプションが選択された状態で表示されます。選択を行うには、エンド・ユーザーは上下にスクロールして使用可能な選択肢を参照します。選択内容を保存するには、エンド・ユーザーはツール・バーの「終了」をタップします。

iPadでは、ユーザーの対話は、以下の点を除いてiPhoneにおける対話と同様です。

- 選択のリストは、ポップアップ・ダイアログに表示されます。

- iPadのスタイリングが選択のリストの周囲に実装され、リストのソースを示すためにノッチが使用されます。

アイテムを選択しないで選択のリストを閉じるには、エンド・ユーザーはポップアップ・ダイアログの外をタップする必要があります。

注意:

選択のリストおよびツール・バーを表示するためのUIは、ブラウザにネイティブであり、CSSを使用してスタイリングすることはできません。

選択肢コンポーネント内のリスト値は、無効として表示できます。

選択肢の数がデバイスの表示サイズを超える場合、ネイティブな方法でスクロール可能なリスト・ページが生成されます。

8.3.10.2 Androidプラットフォームでの選択肢コンポーネントとユーザーとの対話について

Androidデバイスでのネイティブ選択肢コンポーネントとエンド・ユーザーとの対話では、エンド・ユーザーがコンポーネントをタップすると、ポップアップ・ダイアログ形式の選択肢のリストが表示されます。選択肢の数がデバイスのサイズ内に収まる場合は単純なポップアップが表示されます。この場合次のようになります。

- 選択リストの1つのアイテムを1回タップすると、そのアイテムが選択され、ポップアップが閉じます。選択内容は選択肢コンポーネント・ラベルに反映されます。

- ポップアップの外で1回タップするか戻るキーをクリックすると、変更が適用されることなくポップアップが閉じます。

表示される選択肢の数がデバイス・サイズ内に収まらない場合は、ポップアップにスクロール可能リストが含まれます。その場合は次のようになります。

- 選択リストの1つのアイテムを1回タップすると、そのアイテムが選択され、ポップアップが閉じます。選択内容は選択肢コンポーネント・ラベルに反映されます。

- 戻るキーをクリックすると、変更が適用されることなくポップアップが閉じます。

8.3.10.3 アイテムの選択コンポーネントの違いについて

アイテムの選択(selectItems)コンポーネントは、JSF selectItems要素を基にしており、複数選択コンポーネントで選択できるオブジェクトのリストを提供します。詳細は、http://www.jsftoolbox.comのJSF Toolbox pageを参照してください。

アイテムの選択(selectItem)コンポーネントは、ADFのselectItem要素を基にしており、選択コンポーネントの単一選択可能アイテムを表します。詳細は、Oracle Fusion Middleware Oracle ADF Facesのタグ・リファレンスの<af:selectItemページに関する項を参照してください。

8.3.11 選択肢を複数選択コンポーネントの使用方法

選択肢を複数選択(selectManyChoice)コンポーネントは、リストの複数の値の選択を可能にします。この選択メカニズムは、チェックボックスを複数選択コンポーネントに含まれているアイテムの選択コンポーネント(第8.3.10.3項「アイテムの選択コンポーネントの違いについて」を参照)によって提供されます。

注意:

チェックボックスを複数選択コンポーネントには、アイテムの選択(selectItems)コンポーネントを1つ、またはアイテムの選択(selectItem)コンポーネントを1つ以上含めることができます。

例8-44は、ADFモバイルAMXファイルで宣言されているselectManyChoice要素を示しています。

例8-44 アイテムの選択コンポーネントを使用した選択肢を複数選択の定義

<amx:selectManyChoice id="check1"
label="Select Shipping Options:"
value="#{myBean.shipping}">
<amx:selectItem label="Signature Required" value="signature" />
<amx:selectItem label="Insurance" value="insurance" />
<amx:selectItem label="Delivery Confirmation" value="deliveryconfirm"/>
</amx:selectManyChoice>

例8-45 アイテムの選択コンポーネントを使用した選択肢を複数選択の定義

<amx:selectManyChoice id="check1"
label="Select Shipping Options:"
value="#{myBean.shipping}">
<amx:selectItems value="#{myBean.shippingOptions}"/>
</amx:selectManyChoice>

デザインタイムには、選択肢を複数選択コンポーネントは選択コンポーネントと同一に見えます。詳細は、図8-34および第8.3.10項「選択肢コンポーネントの使用方法」を参照してください。

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

すべてのサポートされているデバイス上の選択肢を複数選択コンポーネントの外観と動作は、チェックボックスを複数選択コンポーネントとほとんど同一です(詳細は、第8.3.9項「チェックボックスを複数選択コンポーネントの使用方法」を参照してください)。

8.3.12 ブール・スイッチ・コンポーネントの使用方法

ブール・スイッチ(selectBooleanSwitch)コンポーネントは、チェックボックスのかわりのスイッチ・メタファーとしてのブール値の編集を可能にします。

他のADFモバイルAMX UIコンポーネントと同様に、このコンポーネントには標準および選択済の状態があります。値を切り替えるには、エンド・ユーザーはスイッチを1回タップ(タッチしてリリース)します。タップするたびにスイッチが切り替わります。

例8-46は、ADFモバイルAMXファイルで定義されているselectBooleanSwitch要素を示しています。

例8-46 ブール・スイッチの定義

<amx:selectBooleanSwitch id="switch1"
label="Flip switch:"
onLabel="On"
offLabel="Off"
value="#{myBean.bool1}"/>

図8-35は、「プレビュー」ペインに表示されているブール・スイッチ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectBooleanSwitch id="selectBooleanSwitch1"
label="Switch"
value="value1">

図8-35 デザインタイムのブール・スイッチ

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.12.1 iOSプラットフォームでのブール・スイッチ・コンポーネントのサポート

iOSでは、プール・スイッチ・コンポーネントは、属性値を有効化または無効化するために設定ページでよく使用されます。

8.3.12.2 Androidプラットフォームでのブール・スイッチ・コンポーネントのサポート

Androidプラットフォームでは、ブール・スイッチ・コンポーネントは直接サポートされていません。かわりに、Androidでは、タップすると選択済状態と選択解除状態が切り替わるトグル・ボタンが提供されています。

8.3.13 選択ボタン・コンポーネントの使用方法

選択ボタン(selectOneButton)コンポーネントは、常に1つのボタンがアクティブになっている、アクションをリストするボタン・グループを表します。この選択メカニズムは、選択ボタン・コンポーネントに含まれているアイテムの選択コンポーネント(第8.3.10.3項「アイテムの選択コンポーネントの違いについて」を参照)によって提供されます。

注意:

選択ボタン・コンポーネントには、アイテムの選択(selectItems)コンポーネントを1つ、またはアイテムの選択(selectItem)コンポーネントを1つ以上含めることができます。

例8-47は、ADFモバイルAMXファイルで定義されているselectOneButton要素を示しています。

例8-47 選択ボタンの定義

<amx:selectOneButton id="bg1" value="#{myBean.myState}">
<amx:selectItem label="Yes" value="yes"/>
<amx:selectItem label="No" value="no"/>
<amx:selectItem label="Maybe" value="maybe"/>
</amx:selectOneButton>

図8-36は、「プレビュー」ペインに表示されている選択ボタン・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectOneButton id="selectOneButton1"
label="Select Button"
value="value1">
<amx:selectItem label="Value 1" value="value1"/>
<amx:selectItem label="Value 2" value="value2"/>
<amx:selectItem label="Value 3" value="value3"/>
</amx:selectOneButton>

図8-36 デザインタイムの選択ボタン

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.14 ラジオ・ボタン・コンポーネントの使用方法

ラジオ・ボタン(selectOneRadio)コンポーネントは、使用可能な選択肢をリストするラジオ・ボタンのグループを表します。この選択メカニズムは、ラジオ・ボタン・コンポーネントに含まれているアイテムの選択コンポーネント(第8.3.10.3項「アイテムの選択コンポーネントの違いについて」を参照)によって提供されます。

注意:

ラジオ・ボタン・コンポーネントには、アイテムの選択(selectItems)コンポーネントを1つ、またはアイテムの選択(selectItem)コンポーネントを1つ以上含めることができます。

例8-48および例8-49は、ADFモバイルAMXファイルで宣言されているselectOneRadio要素を示しています。

例8-48 アイテムの選択コンポーネントを使用したラジオ・ボタンの定義

<amx:selectOneRadio id="radio1"
label="Choose a pet:"
value="#{myBean.myPet}">
<amx:selectItem label="Cat" value="cat"/>
<amx:selectItem label="Dog" value="dog"/>
<amx:selectItem label="Hamster" value="hamster"/>
<amx:selectItem label="Lizard" value="lizard"/>
</amx:selectOneRadio>

例8-49 アイテムの選択コンポーネントを使用したラジオ・ボタンの定義

<amx:selectOneRadio id="radio1"
label="Choose a pet:"
value="#{myBean.myPet}">
<amx:selectItems value="myBean.allPets"/>
</amx:selectOneRadio>

図8-37は、「プレビュー」ペインに表示されているブール・スイッチ・コンポーネントを示しています。このコンポーネントのパラメータは、次のように設定されます。

<amx:selectOneRadio id="selectOneRadio1"
label="Radio Button"
value="value1">
<amx:selectItem label="Value 1" value="value1"/>
<amx:selectItem label="Value 2" value="value2"/>
<amx:selectItem label="Value 3" value="value3"/>
</amx:selectOneRadio>

図8-37 デザインタイムのラジオ・ボタン

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.15 カルーセル・コンポーネントの使用方法

カルーセル(carousel)コンポーネントは、回転カルーセルにイメージなどの他のコンポーネントを表示するために使用します。エンド・ユーザーは、スライダを使用するか、別のイメージを正面にドラッグすることでアクティブなアイテムを変更できます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADF Facesカルーセル・コンポーネントの使用に関する項を参照してください。

カルーセル・コンポーネントにはカルーセル・アイテム(carouselItem)コンポーネントが含まれており、text属性によって表されるそのテキストは、それがそのカルーセルのアクティブなアイテムであるときに表示されます。通常、カルーセル・アイテムにはイメージ・コンポーネントが含まれていますが、他のコンポーネントを使用することもできます。たとえば、イメージを囲む子としてリンクを使用することもできます。

ヒント:

アプリケーションのパフォーマンスの低下を最小限に抑えるは、重いコンポーネントを子として使用しないようにします。複雑な構造にすると、いくつかのカルーセル・アイテム・スタンプが同時に表示されるため、その影響が倍増します。

JDeveloperでは、「カルーセル」は「コンポーネント・パレット」の「データ・ビュー」の下にあります(図8-38を参照)。

図8-38 「コンポーネント・パレット」の「カルーセル」

例8-50は、ADFモバイルAMXファイルのcarousel要素の定義を示しています。carousel要素を定義するときは、carouselコンポーネントのnodeStampファセット内にcarouselItemコンポーネントを配置する必要があります。

例8-50 カルーセルの定義

<amx:carousel id="carousel1"
value="#{bindings.products.collectionModel}"
var="item"
auxiliaryOffset="0.9"
auxiliaryPopOut="hover"
auxiliaryScale="0.8"
controlArea="full"
displayItems="circular"
halign="center"
valign="middle"
disabled="false"
shortDesc=""
orientation="horizontal"
styleClass="AMXStretchWidth"
inlineStyle="height:250px;background-color:#EFEFEF;">
<amx:facet name="nodeStamp">
<amx:carouselItem id="item1" text="#{item.name}"
shortDesc="Product: #{item.name}">
<amx:commandLink id="link1" action="goto-productDetails"
actionListener="#{someMethod()}">
<amx:image id="image1" styleClass="prod-thumb"
source="images/img-big-#{item.uid}.png"/>
<amx:setPropertyListener from="#{item}"
to="#{pageFlowScope.product}"
type="action"/>
</amx:commandLink>
</amx:carouselItem>
</amx:facet>
</amx:carousel>

図8-39は、iPhone上に表示されるカルーセル・コンポーネントを示しています。

図8-39 iPhone上のカルーセル・コンポーネント

詳細、図および例は、次を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

- CompGallery (開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているADFモバイル・サンプル・アプリケーション)。

8.3.16 Verbatimコンポーネントの使用方法

該当するコンポーネントが存在しない場合や自身でHTMLを使用してレイアウトする必要がある場合は、Verbatim (verbatim)操作を使用して独自のHTMLをページに挿入できます。

JDeveloperでは、「Verbatim」は、「コンポーネント・パレット」の「一般コントロール」の下にあります(図8-41を参照)。

図8-40 「コンポーネント・パレット」の「Verbatim」

詳細および例は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.3.17 反復の有効化方法

イテレータ(iterator)操作を使用して、同じ種類のデータを持つ任意の数のアイテムをスタンプします。これによりデータを繰り返し処理して各要素のUIを作成できます。

JDeveloperでは、「イテレータ」は「コンポーネント・パレット」の「操作」の下にあります(図8-41を参照)。

図8-41 「コンポーネント・パレット」の「イテレータ」

詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.3.18 リソース・バンドルのロード方法

バンドルのロード(loadBundle)操作により、ページ上のADFモバイルAMX UIコンポーネントのローカライズ済テキストを提供するリソース・バンドルを指定できます。詳細は、第8.7項「UIコンポーネントのローカライズ」を参照してください。

JDeveloperでは、「バンドルのロード」は「コンポーネント・パレット」の「操作」の下にあります(図8-42を参照)。

図8-42 「コンポーネント・パレット」の「バンドルのロード」

ADFモバイルAMXファイル内で、loadBundle要素をview要素の子として宣言します。

詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.3.19 アクション・リスナーの使用方法

アクション・リスナー(actionListener)コンポーネントにより、親コンポーネントが使用するタイプに基づいてELを介して宣言でコマンドを呼び出すことができます。

JDeveloperでは、「アクション・リスナー」コンポーネントは「コンポーネント・パレット」の「リスナー」の下にあります(図8-43を参照)。

図8-43 「コンポーネント・パレット」の「アクション・リスナー」

0個以上のアクション・リスナーまたはプロパティ・リスナーの設定コンポーネントを、任意のコマンド・コンポーネント(ボタン、リンク、リスト・アイテム)の子として追加できます。actionListener、valueChangeListener、moveListenerなどのリスナー属性は様々なコンポーネントに対して定義されます。アクション・リスナーまたはプロパティ・リスナーの設定コンポーネントのtype属性で、このリスナー・コンポーネントがどのインベントを処理するのかと親のリスナー属性名(action、valueChange、move)の最初の部分でどのイベントを表すのかを示すことができます。また、type属性は、swipeLeft、swipeRight、tapHoldなどのジェスチャーを表すこともできます。

詳細は、次の項を参照してください。

- 第8.10項「イベント・リスナーの使用方法」

- 第8.3.20項「プロパティ・リスナーの設定の使用方法」

- 第8.4項「ジェスチャーの有効化」

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

8.3.20 プロパティ・リスナーの設定の使用方法

プロパティ・リスナーの設定(setPropertyListener)コンポーネントにより、コードを作成することなく1つの場所(コンポーネントのfrom属性で定義)から別の場所(コンポーネントのto属性で定義)に宣言で変数値を移動できます。

JDeveloperでは、「プロパティ・リスナーの設定」コンポーネントは「コンポーネント・パレット」の「リスナー」の下にあります(図8-44を参照)。

図8-44 「コンポーネント・パレット」の「プロパティ・リスナーの設定」

例8-51は、ADFモバイルAMXファイルのsetPropertyListener要素の定義を示しています。

例8-51 プロパティ・リスナーの設定の定義

<amx:listView value="#{bindings.products.collectionModel}" var="row" id="lv1">
<amx:listItem action="details">
<amx:outputText value="#{row.name}" id="ot1" />
<amx:setPropertyListener from="#{row}"
to="#{pageFlowScope.product}"
type="action"/>
</amx:listItem>
</amx:listView>

0個以上のプロパティ・リスナーの設定またはアクション・リスナー・コンポーネントを、任意のコマンド・コンポーネント(ボタン、リンク、リスト・アイテム)の子として追加できます。actionListener、valueChangeListener、moveListenerなどのリスナー属性は様々なコンポーネントに対して定義されます。プロパティ・リスナーの設定またはアクション・リスナー・コンポーネントのtype属性で、このリスナー・コンポーネントがどのインベントを処理するのかと親のリスナー属性名(action、valueChange、move)の最初の部分でどのイベントを表すのかを示すことができます。また、type属性は、swipeLeft、swipeRight、tapHoldなどのジェスチャーを表すこともできます。

詳細は、次の項を参照してください。

- 第8.10項「イベント・リスナーの使用方法」

- 第8.3.19項「アクション・リスナーの使用方法」

- 第8.4項「ジェスチャーの有効化」

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

8.3.21 日時の変換方法

日時の変換(convertDateTime)は、独立したUIコンポーネントではありません。これは、出力テキストおよび入力テキスト・コンポーネントと組み合せて使用して、指定されたパターンに従った様々な書式で、変換された日付、時刻または日時の組合せを表示するコンバータ操作です。

JDeveloperでは、「日時の変換」は「コンポーネント・パレット」の「バリデータおよびコンバータ」の下にあります(図8-45を参照)。

図8-45 「コンポーネント・パレット」の「日時の変換」

例8-52は、ADFモバイルAMXファイルで宣言されているconvertDateTime要素を示しています。

例8-52 日時の変換の使用方法

<amx:panelPage id="pp1">
<amx:inputText styleClass="ui-text" value="Order Date" id="it1" >
<amx:convertDateTime type="both"/>
</amx:inputText>
</amx:panelPage>

日時値を変換するには:

1. 「コンポーネント・パレット」から、「日時の変換」コンポーネントをドラッグし、それを出力テキストまたは入力テキスト・コンポーネント内に挿入し、それをそのコンポーネントの子要素にします。

2. 日時の変換コンポーネントに対して「プロパティ」エディタを開き、その属性を定義します。詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

注意:

日時の変換コンポーネントは、デザインタイムには何の効果も持ちません。

日時の変換コンポーネントでは、入力値文字列を日付に変換する際に一定レベルの寛容性があります。

- 月に対して関連付けられたパターンMMMを持つコンバータは、値のホルダーに添付されると、MMまたはMの形で指定された月の値を有効な値として受け入れます。

- 関連付けられたパターンで指定されているセパレータに関係なく、ダッシュ( - )、ピリオド( . )、スラッシュ( / )などのセパレータを使用できます。

- パターン定義における寛容性は、pattern属性で設定します。

たとえば、コンバータのパターンが"MMM/d/yyyy"に設定されている場合、次の入力はコンバータにより有効なものとして許容されます。

Jan/4/2004
Jan-4-2004
Jan.4.2004
01/4/2004
01-4-2004
01.4.2004
1/4/2004
1-4-2004
1.4.2004

コンバータでは、java.text.SimpleDateFormat (dateStyle、timeStyleおよびpattern属性を使用して指定される)と同じ解析および書式設定規則がサポートされています。ただし、タイムゾーンが、timeStyle=fullなどの長い表示またはzzzzで設定されるパターンを持つように指定されている場合は例外です。タイムゾーンは太平洋標準時のような長い説明の文字列ではなく、一般的なタイムゾーン形式(GMT +/- オフセット)またはRFC-822タイムゾーンで表示されます。

変換の正確な結果は、ロケールによって異なりますが、一般的に次のルールが適用されます。

- SHORTは、12.13.52や3:30pmなど完全に数値です。

- MEDIUMはそれより長いJan 12、1952などです。

- LONGは、それよりも長いJanuary 12、1952、3:30:32pmなどです。

- FULLは、完全に指定されたTuesday, April 12, 1952 ADや3:30:42pm PSTなどです。

8.3.21.1 日時パターンについて

java.text.SimpleDateFormat定義に従って、日時書式を、日時パターン文字列で指定します。日時パターン文字列では、引用符で囲まれていないAからZおよびaからzの文字は、日付または時間の文字列のコンポーネントを表すパターン文字と認識されます。テキストは、解釈されないように一重引用符(')で囲むことができます。" ' ' "は一重引用符を表します。すべてのその他の文字は解釈されません。かわりに、それらは書式設定中に単に出力文字列にコピーされるか、解析中に入力文字列と照合されます。

表8-7は、定義済パターン文字を示しています(AからZおよびaからzのすべてのその他の文字は予約されています)。

表8-7 日時パターン文字

文字

日付または時間コンポーネント

表示内容

例

G

紀元

テキスト

- AD

y

年

年

- 1996

- 96

M

年における月

月

- July

- Jul

- 07

w

年における週

番号

- 27

W

月における週

番号

- 2

D

年における日

番号

- 189

d

月における日

番号

- 10

F

月における曜日

番号

- 2

E

曜日

テキスト

- Tuesday

- Tue

a

午前/午後

テキスト

- PM

H

1日における時間(0-23)

番号

- 0

k

1日における時間(1-24)

番号

- 24

K

午前/午後における時間(0-11)

番号

- 0

h

午前/午後における時間(1-12)

番号

- 12

m

1時間における分

番号

- 30

s

1分における秒

番号

- 55

S

ミリ秒

番号

- 978

z

タイム・ゾーン

一般的なタイムゾーン

- Pacific Standard Time

- PST

- GMT-08:00

Z

タイム・ゾーン

RFC 822タイムゾーン

- -0800

パターン文字は通常繰り返されます。これは、それらの数が正確な表示を決定するためです。

8.3.22 数値の変換方法

数値の変換(convertNumber)は、独立したUIコンポーネントではありません。これは、出力テキストおよび入力テキスト・コンポーネントと組み合せて使用して、指定されたパターンに従った様々な書式で、変換された数値または通貨値を表示するコンバータ操作です。

数値の変換コンポーネントは、次のタイプの操作を提供します。

- 値から文字列。表示目的です。

- 書式設定された文字列から値。書式設定された入力値が、基礎となっている値に解析される場合です。

数値の変換が、入力テキスト・コンポーネントの子として指定されている場合、デフォルトで、モバイル・デバイスに数字キーボードが表示されます。

JDeveloperでは、「数値の変換」は「コンポーネント・パレット」の「バリデータおよびコンバータ」の下にあります(図8-46を参照)。

図8-46 「コンポーネント・パレット」の「数値の変換」

例8-53は、ADFモバイルAMXファイルで定義されているconvertNumber要素を示しています。

例8-53 数値の変換の使用方法

<amx:panelPage id="pp1">
<amx:inputText styleClass="ui-text" value="Product Price" id="it1" >
<amx:convertNumber type="percent" groupingUsed="false" integerOnly="true"/>
</amx:inputText>
</amx:panelPage>

数値を変換するには:

1. 「コンポーネント・パレット」から、「数値の変換」コンポーネントをドラッグし、それを出力テキストまたは入力テキスト・コンポーネント内に挿入し、それをそのコンポーネントの子要素にします。

2. 数値の変換コンポーネントに対して「プロパティ」エディタを開き、その属性を定義します。詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

注意:

数値の変換コンポーネントは、デザインタイムには何の効果も持ちません。

8.4 ジェスチャーの有効化

次のジェスチャーに反応するように、ボタン、リンク、リスト・アイテム・コンポーネントを構成できます。

- 右方向にスワイプ

- 左方向にスワイプ

- 上方向にスワイプ

- 下方向にスワイプ

- タップしたまま押さえる

次の操作のtype属性に対して、swipeRight、swipeLeft、swipeUp、swipeDownおよびtapHold値を定義できます。

- プロパティ・リスナーの設定(第8.3.20項「プロパティ・リスナーの設定の使用方法」を参照)

- アクション・リスナー(第8.3.19項「アクション・リスナーの使用方法」を参照)

- ポップアップ表示動作(第8.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

- ポップアップを閉じる動作(第8.2.8項「ポップアップ・コンポーネントの使用方法」を参照)

type属性の値は親コンポーネントに基づいて制限されており、ボタン、リンクおよびリスト・アイテム・コンポーネントに対してのみサポートされています。

例8-54は、ADFモバイルAMXファイルのtype属性のtapHold値の使用を示しています。この例では、タップしたまま押さえるジェスチャーによってポップアップ・コンポーネントの表示がトリガーされます。

例8-54 タップしたまま押さえるジェスチャーの使用方法

<amx:panelPage id="pp1">
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row">
<amx:listItem action="gosomewhere">
<amx:outputText id="ot1" value="#{row.description}"/>
<amx:setPropertyListener from="#{row.rowKey}"
to="#{mybean.currentRow}"
type="tapHold"/>
<amx:showPopupBehavior type="tapHold"
alignid="pp1"
popupid="pop1"
align="startAfter"/>
</amx:listItem>
</amx:listView>>
</amx:panelPage>
<amx:popup id="pop1">
<amx:panelGroupLayout id="pgl1" layout="horizontal">
<amx:commandLink id="cm1" actionListener="#{mybean.doX}">
<amx:image id="i1" source="images/x.png"/>
<amx:closePopupBehavior type="action" popupid="pop1"/>
</amx:commandLink>
<amx:commandLink id="cm2" actionListener="#{mybean.doY}">
<amx:image id="i2" source="images/y.png"/>
<amx:closePopupBehavior type="action" popupid="pop1"/>
</amx:commandLink>
<amx:commandLink id="cm3" actionListener="#{mybean.doZ}">
<amx:image id="i3" source="images/y.png"/>
<amx:closePopupBehavior type="action" popupid="pop1"/>
</amx:commandLink>
</amx:panelGroupLayout>
</amx:popup>

例8-55は、ADFモバイルAMXファイル内のswipeRightジェスチャーの使用方法を示しています。

例8-55 右方向にスワイプ・ジェスチャーの使用方法

<amx:panelPage id="pp1">
<amx:listView id="lv1"
value="#{bindings.data.collectionModel}"
var="row">
<amx:listItem action="gosomewhere">
<amx:outputText id="ot1" value="#{row.description}"/>
<amx:setPropertyListener from="#{row.rowKey}"
to="#{mybean.currentRow}"
type="swipeRight"/>
<actionListener binding="#{mybean.DoX}" type="swipeRight"/>
</amx:listItem>
</amx:listView>>
</amx:panelPage>

詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

GestureDemoという名前のADFモバイル・サンプル・アプリケーションは、様々なADFモバイルAMX UIコンポーネントでのジェスチャーの使用方法を示しています。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

8.5 データ視覚化の指定

ADFモバイルは、一連のデータ視覚化ツールを備えており、それらを使用して様々なチャート、ゲージおよびマップを作成し、ADFモバイルAMX機能でデータを表すことができます。ADFモバイルAMXファイルの<dvtm>ネームスペースの下で次の要素を宣言できます。

- areaChart (第8.5.1項「面グラフの作成方法」を参照)

- barChart (第8.5.2項「棒グラフの作成方法」を参照)

- horizontalBarChart (第8.5.3項「横棒グラフの作成方法」を参照)

- bubbleChart (第8.5.4項「バブル・チャートの作成方法」を参照)

- comboChart (第8.5.5項「組合せグラフの作成方法」を参照)

- lineChart (第8.5.6項「折れ線グラフの作成方法」を参照)

- pieChart (第8.5.7項「円グラフの作成方法」を参照)

- scatterChart (第8.5.8項「散布図の作成方法」を参照)

- sparkChart (第8.5.9項「スパーク・チャートの作成方法」を参照)

- ledGauge (第8.5.10項「LEDゲージの作成方法」を参照)

- statusMeterGauge (第8.5.11項「ステータス・メーター・ゲージの作成方法」を参照)

- dialGauge (第8.5.12項「ダイアル・ゲージの作成方法」を参照)

- geographicMap (第8.5.14項「地理マップ・コンポーネントの作成方法」を参照)

- thematicMap (第8.5.15項「テーマ・マップ・コンポーネントの作成方法」を参照)

チャート、ゲージおよびマップ要素には、それらのすべてまたは大部分に共通するいくつかの属性があります。詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

JDeveloperでは、チャート・コンポーネントは「コンポーネント・パレット」の「DVTモバイルAMX」→「チャート」の下にあり(図8-47を参照)、ゲージ・コンポーネントは「DVTモバイルAMX」→「ゲージ」の下にあり(図8-48を参照)、マップ・コンポーネントは「DVTモバイルAMX」→「マップ」の下にあります(図8-49を参照)。

図8-47 「コンポーネント・パレット」のチャート

図8-48 「コンポーネント・パレット」のゲージ・コンポーネント

図8-49 「コンポーネント・パレット」のマップ・コンポーネント

チャート、ゲージまたはマップをトラック・アンド・ドロップすると、次のダイアログの1つが開き、作成しているコンポーネントのタイプに関する情報が表示されます。

- モバイル・チャートの作成 (図8-50を参照)

図8-50 チャートの作成コンポーネント

- モバイル・ゲージの作成 (図8-51を参照)

図8-51 ゲージの作成コンポーネント

- コンポーネント・ギャラリ (図8-52を参照)

図8-52 マップの作成コンポーネント

データ視覚化コンポーネントにはイベント・リスナーを追加できます。詳細は、第8.10項「イベント・リスナーの使用方法」を参照してください。イベント・リスナーは、iOSとAndroidのどちらのデバイスでもADFモバイルAMXランタイムの記述のためにコンポーネントに適用できますが、それらのリスナーはデザインタイムでは何の効果も持ちません。

「データ・コントロール」パネルから作成されるデータバインドされたデータ視覚化コンポーネントの詳細は、第8.5.16項「データバインドされたデータ視覚化コンポーネントの作成方法」を参照してください。

CompGalleryという名前のADFモバイル・サンプル・アプリケーションは、ADFモバイルAMXアプリケーション機能での様々なデータ視覚化コンポーネントの使用方法を示しています。このサンプル・アプリケーションは、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイル内にあります。

ADFモバイルAMXデータ視覚化コンポーネントの使用上の制約の詳細は、第C.5.2項「データ視覚化コンポーネントの制限」を参照してください。

Oracle ADFデータ視覚化コンポーネントの詳細は、Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイドのADFデータ視覚化コンポーネントの使用方法に関する項を参照してください。

8.5.1 面グラフの作成方法

面グラフ(areaChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けれされている場合に、データを視覚的に表すために使用します。系列は、いくつかの一般的なスタイル・プロパティ(たとえば、面の色やパターンなど)を持つグラフィカル要素を使用して視覚化されます。それらのプロパティは、個々のデータ・アイテムごとではなく、系列レベルで適用する必要があります。デフォルト系列スタイルを使用するかカスタム系列スタイルを使用するかを選択できます。カスタム系列スタイルの定義の詳細は、第8.5.6項「折れ線グラフの作成方法」を参照してください。

例8-56は、ADFモバイルAMXファイルで定義されているareaChart要素を示しています。デフォルト系列スタイルで基本的な面グラフを作成するには、それにコレクションを渡し、chartDataItem要素をネストしたdataStampファセットを指定します。

例8-56 デフォルト系列スタイルを持つ面グラフの定義

<dvtm:areaChart id="areaChart1"
value="#{bindings.lineData.collectionModel}"
var="row"
inlineStyle="width: 400px; height: 300px;"
title="Chart Title"
animationOnDisplay="auto"
animationDuration="1500" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
</amx:facet>
<dvtm:yAxis axisMaxValue="80.0" majorIncrement="20.0" title="yAxis Title" />
<dvtm:legend position="end" />
</dvtm:areaChart>

図8-53 デザインタイムの面グラフ

データ・アイテムはコレクション・モデルで初期化され、スタンプ・メカニズムを備えています。少なくとも、各コレクションのrowに次のプロパティが含まれている必要があります。

- series: このデータ・アイテムが属する系列の名前。

- group: このデータ・アイテムが属するグループの名前。

- value: データ・アイテムの値。

コレクションのrowには、個々のデータ・アイテムに適用可能なcolorやshapeなどの他のプロパティも含めることができます。

図8-53に示すように、属性グループ(attributeGroups要素)を使用して、なんらかのグループ化条件に基づいてデータ・アイテムのグループに対してスタイル・プロパティを設定できます。この場合、データ・アイテムのcolorおよびshape属性が、追加のグループ化式に基づいて設定されます。

例8-57 デフォルト系列スタイルおよびグループ化を含む面グラフの定義

<dvtm:areaChart id="areaChart1"
value="#{bindings.lineData.collectionModel}"
var="row"
inlineStyle="width: 400px; height: 300px;"
title="Chart Title"
animationOnDisplay="auto"
animationDuration="1500" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
<dvtm:attributeGroups id="ag_1"
type="color shape"
value="#{row.brand}" />
</amx:facet>
<dvtm:yAxis axisMaxValue="80.0" majorIncrement="20.0" title="yAxis Title" />
<dvtm:legend position="end" />
</dvtm:areaChart>

注意:

例8-56および図8-53では、カスタム・スタイルが系列レベルで設定されていないため、系列はデフォルトの色傾斜に基づいた色で表示されます。

areaChart要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

areaChartに対して次の子要素を定義できます。

- chartDataItem (第8.5.13.1項「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (第8.5.13.3項「X軸、Y軸およびY2軸の定義」を参照)

- legend (第8.5.13.2項「凡例の定義」を参照)

8.5.2 棒グラフの作成方法

棒グラフ(barChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けされている場合に、データを垂直の棒として視覚的に表すために使用します。系列は、個々のデータ・アイテムごとではなく系列レベルで適用する必要があるいくつかの一般的なスタイル・プロパティを持つグラフィカル要素を使用して視覚化されます。

例8-58は、ADFモバイルAMXファイルで定義されているbarChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。

例8-58 棒グラフの定義

<dvtm:barChart id="barChart1"
value="#{bindings.barData.collectionModel}"
var="row"
inlineStyle="width: 400px; height: 300px;"
title="Bar Chart"
animationOnDisplay="zoom"
animationDuration="3000" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
</amx:facet>
<dvtm:yAxis axisMaxValue="80.0" majorIncrement="20.0" title="yAxis Title" />
<dvtm:legend position="start" />
</dvtm:barChart>

図8-54 デザインタイムの棒グラフ

棒グラフのデータ・モデルは、個々の棒を記述するアイテム(行)のコレクションによって表されます。通常、各棒のプロパティには次のようなものがあります。

- series: この棒が属する系列の名前。

- group: この棒が属するグループの名前。

- value: データ・アイテムの値(必須)。

データには、系列ごとに同じ数のグループが含まれている必要があります。系列またはデータのペアのいずれかが欠けている場合、それはAPIにnullとして渡されます。

barChart要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

barChartに対して次の子要素を定義できます。

- chartDataItem (第8.5.13.1項「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (第8.5.13.3項「X軸、Y軸およびY2軸の定義」を参照)

- legend (第8.5.13.2項「凡例の定義」を参照)

8.5.3 横棒グラフの作成方法

横棒グラフ(barChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けれされている場合に、データを水平の棒として視覚的に表すために使用します。系列は、個々のデータ・アイテムごとではなく系列レベルで適用する必要があるいくつかの一般的なスタイル・プロパティを持つグラフィカル要素を使用して視覚化されます。

例8-58は、ADFモバイルAMXファイルで定義されているhorizontalBarChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。

例8-59 横棒グラフの定義

<dvtm:horizontalBarChart id="horizBarChart1"
value="#{bindings.barData.collectionModel}"
var="row"
inlineStyle="width: 400px; height: 300px;"
title="Horizontal Bar Chart"
dataSelection="#{pageFlowScope.dataSelection}"
hideAndShowBehavior="#{pageFlowScope.hideAndShowBehavior}"
rolloverBehavior="#{pageFlowScope.rolloverBehavior}"
stack="#{pageFlowScope.stack}" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
</amx:facet>
<dvtm:yAxis axisMaxValue="80.0" majorIncrement="20.0" title="yAxis Title" />
<dvtm:legend position="start" />
</dvtm:horizontalBarChart>

図8-55 デザインタイムの横棒グラフ

横棒グラフのデータ・モデルは、個々の棒を記述するアイテム(行)のコレクションによって表されます。通常、各棒のプロパティには次のようなものがあります。

- series: この棒が属する系列の名前。

- group: この棒が属するグループの名前。

- value: データ・アイテムの値(必須)。

データには、系列ごとに同じ数のグループが含まれている必要があります。系列またはデータのペアのいずれかが欠けている場合、それはAPIにnullとして渡されます。

horizontalBarChart要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

horizontalBarChartに対して次の子要素を定義できます。

- chartDataItem (第8.5.13.1項「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (第8.5.13.3項「X軸、Y軸およびY2軸の定義」を参照)

- legend (第8.5.13.2項「凡例の定義」を参照)

8.5.4 バブル・チャートの作成方法

バブル・チャート(bubbleChart)は、各データ・アイテムがx、y座標とサイズ(バブル)を持つ一連のデータ・アイテムを表示します。さらに、各データ・アイテムには、colorやshapeなど様々なスタイル属性を設定できます。各データ・アイテムのプロパティを個別に設定することも、様々な条件に基づいてデータ・アイテムをグループにカテゴリ分けすることもできます。複数のグループ化条件を同時に使用でき、データ・アイテムの関係を視覚化するために様々なスタイル属性を使用することもできます。ただし、折れ線グラフ(第8.5.6項「折れ線グラフの作成方法」を参照)や面グラフ(第8.5.1項「面グラフの作成方法」を参照)と異なり、バブル・チャートには系列およびグループの厳密な概念がありません。

例8-60は、ADFモバイルAMXファイルで定義されているbubbleChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。各データ・アイテムのcolorおよびshape属性は、データ・モデルで提供されている値に基づいて個別に設定されます。

例8-60 カスタム・データ・アイテム・プロパティを設定したバブル・チャートの定義

<dvtm:bubbleChart id="bubbleChart1"
value="#{bindings.bubbleData.collectionModel}"
inlineStyle="width: 400px; height: 300px;"
dataSelection="multiple"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Bubble Chart"
var="row">
<amx:facet name="dataStamp">
<dvtm:chartDataItem label="#{row.label}" x="#{row.x}" y="#{row.y}"
size="#{row.size}" color="#{row.color}"
shape="#{row.shape}" />
</amx:facet>
</dvtm:bubbleChart>

図8-56 デザインタイムのバブル・チャート

例8-61では、データ・アイテムからなる関連する1つのグループに対して一般的なスタイル属性を設定するためにattributeGroups要素が使用されています。

例8-61 属性グループを設定したバブル・チャートの定義

<dvtm:bubbleChart id="bubbleChart1"
value="#{bindings.bubbleData.collectionModel}"
dataSelection="multiple"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Bubble Chart"
var="row">
<amx:facet name="dataStamp">
<dvtm:chartDataItem label="#{row.label}" x="#{row.x}" y="#{row.y}" >
<dvtm:attributeGroups id="ag1" type="color" value="#{row.category}" />
<dvtm:attributeGroups id="ag2" type="shape" value="#{row.brand}" />
</dvtm:chartDataItem>
</amx:facet>
</dvtm:bubbleChart>

例8-62は、使用可能な子要素(chartDataItem、xAxis、yAxisおよびlegend)をすべて定義したバブル・チャートを示しています。

例8-62 すべての属性を設定したバブル・チャートの定義

<dvtm:bubbleChart id="bubbleChart1"
inlineStyle="width: 400px; height: 300px;"
value="#{bindings.bubbleData.collectionModel}"
var="row"
title="Chart Title"
animationOnDisplay="zoom"
animationDuration="3000" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem label="#{row.group}" x="#{row.data.x}"
y="#{row.data.y}" size="#{row.data.z}" >
<dvtm:attributeGroups type="color" value="#{row.series}" />
<dvtm:attributeGroups type="shape" value="#{row.group}" />
</dvtm:chartDataItem>
</amx:facet>

バブル・チャートのデータ・モデルは、個々のデータ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各棒のプロパティには次のようなものがあります。

- label: データ・アイテム・ラベル(オプション)。

- x、y: 値の座標(必須)。

- z: データ・アイテムのサイズ(必須)。

データには、系列ごとに同じ数のグループが含まれている必要があります。系列またはデータのペアのいずれかが欠けている場合、それはAPIにnullとして渡されます。

bubbleChart要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

barChartに対して次の子要素を定義できます。

- chartDataItem (第8.5.13.1項「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (第8.5.13.3項「X軸、Y軸およびY2軸の定義」を参照)

- legend (第8.5.13.2項「凡例の定義」を参照)

8.5.5 組合せグラフの作成方法

組合せグラフ(comboChart)は、折れ線と棒のグラフなど、2つ以上の異なるグラフを重ねたものを表します。

例8-63は、ADFモバイルAMXファイルで定義されているcomboChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。seriesStampファセットは、系列のデフォルト・スタイル・プロパティを上書きし、seriesStyle要素を使用してカスタム系列スタイルを設定します。

例8-63 組合せグラフの定義

<dvtm:comboChart id="comboChart1"
value="#{bindings.barData.collectionModel}"
var="row"
seriesVar="series"
inlineStyle="width: 400px; height: 300px;"
title="Combo Chart"
animationOnDisplay="auto"
animationDuration="1500" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
</amx:facet>
<amx:facet name="seriesStamp">
<dvtm:seriesStyle series="#{series.name}" type="bar"
rendered="#{(series.name eq 'Series 1') or
(series.name eq 'Series 2') or
(series.name eq 'Series 3')}" />
<dvtm:seriesStyle series="#{series.name}" type="line" lineWidth="5"
rendered="#{(series.name eq 'Series 4') or
(series.name eq 'Series 5')}" />
</amx:facet>
<dvtm:yAxis axisMaxValue="80.0" majorIncrement="20.0" title="yAxis Title" />
<dvtm:legend position="start" />
</dvtm:comboChart>

図8-57 デザインタイムの組合せグラフ

comboChart要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

comboChartに対して次の子要素を定義できます。

- chartDataItem (第8.5.13.1項「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (第8.5.13.3項「X軸、Y軸およびY2軸の定義」を参照)

- legend (第8.5.13.2項「凡例の定義」を参照)

8.5.6 折れ線グラフの作成方法

折れ線グラフ(lineChart)は、一連のデータ・アイテムが関連付けられ、グループおよび系列にカテゴリ分けれされている場合に、データを視覚的に表すために使用します。系列は、いくつかの一般的なスタイル・プロパティ(たとえば、線の色、太さ、スタイルなど)を持つグラフィカル要素を使用して視覚化されます。それらのプロパティは、個々のデータ・アイテムごとではなく、系列レベルで適用する必要があります。デフォルト系列スタイルを使用するかカスタム系列スタイルを使用するかを選択できます。

例8-64は、ADFモバイルAMXファイルで定義されているlineChart要素を示しています。デフォルト系列スタイルで基本的な折れ線グラフを作成するには、それにコレクションを渡し、chartDataItem要素をネストしたdataStampファセットを指定します。

例8-64 デフォルト系列スタイルを持つ折れ線グラフの定義

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Line Chart"
value="#{bindings.lineData1.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem series="#{row.series}"
group="#{row.group}"
value="#{row.value}"
color="#{row.color}" />
</amx:facet>
</dvtm:lineChart>

図8-58 デザインタイムの折れ線グラフ

データ・アイテムはコレクション・モデルで初期化され、スタンプ・メカニズムを備えています。少なくとも、各コレクションのrowに次のプロパティが含まれている必要があります。

- series: この線が属する系列の名前。

- group: この線が属するグループの名前。

- value: データ・アイテムの値。

コレクションのrowには、個々のデータ・アイテムに適用可能なcolorやshapeなどの他のプロパティも含めることができます。

図8-58に示すように、属性グループ(attributeGroups要素)を使用して、なんらかのグループ化条件に基づいてデータ・アイテムのグループに対してスタイル・プロパティを設定できます。この場合、データ・アイテムのcolorおよびshape属性が、追加のグループ化式に基づいて設定されます。

例8-65 デフォルト系列スタイルおよびグループ化を含む折れ線グラフの定義

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Line Chart"
titleStyle="font-size: 12px; color: black;"
value="#{bindings.lineData1.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
<dvtm:attributeGroups id="ag_1"
type="color shape"
value="#{row.brand}" />
</dvtm:chartDataItem>
</amx:facet>
</dvtm:lineChart>

注意:

例8-64および図8-58では、カスタム・スタイルが系列レベルで設定されていないため、系列はデフォルトの色傾斜に基づいた色で表示されます。

系列のデフォルト・スタイル・プロパティを上書きするには、図8-58に示すように、オプションのseriesStampファセットを定義し、seriesStyle要素を使用してカスタム系列スタイルを設定します。

例8-66 カスタム系列スタイルを持つ折れ線グラフの定義

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Line Chart"
value="#{bindings.lineData1.collectionModel}"
var="row"
seriesVar="series" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem series="#{row.series}"
group="#{row.group}"
value="#{row.value}" />
</dvtm:chartDataItem>
<amx:facet name="seriesStamp">
<dvtm:seriesStyle series="#{series.name}"
lineStyle="#{series.lineStyle}"
lineWidth="#{series.lineWidth}" />
</amx:facet>
</dvtm:lineChart>

前述の例では、seriesVar属性が、メインlineChart要素に追加されています。この属性によって、seriesStampファセット内のseriesStyle要素を処理する際に使用される変数の名前が定義されます。seriesVarは、dataStampファセットを処理する際に自動的に作成および移入される内部コレクションのアイテムを参照します。実行時、dataStampファセットに含まれているchartDataItem要素が最初に処理されます。一意のseries属性値ごとに、一般的な系列プロパティを表す新しいJavaScriptオブジェクト・インスタンスがラッパーによって作成されます。そのインスタンスには、少なくともnameプロパティが含まれています。さらに、そのオブジェクトには、同じ系列名を持つすべての行に対して同じ値を持つ、元のデータ・コレクションからのプロパティが含まれています。図8-58は、dataStampファセットが処理されると図8-58に示す内部系列コレクションになるサンプル・コレクションのデータを示しています。

例8-67 折れ線のデータ・コレクション

row[0]: { series: 'A', value: 81, lineColor: 'red', lineStyle: 'solid' }
row[1]: { series: 'A', value: 26, lineColor: 'red', lineStyle: 'solid' }
row[2]: { series: 'A', value: 53, lineColor: 'red', lineStyle: 'solid' }
row[3]: { series: 'B', value: 10, lineColor: 'blue', lineStyle: 'solid' }
row[4]: { series: 'B', value: 44, lineColor: 'blue', lineStyle: 'solid' }
row[5]: { series: 'B', value: 35, lineColor: 'blue', lineStyle: 'solid' }
row[6]: { series: 'C', value: 83, lineColor: 'green', lineStyle: 'dot' }
row[7]: { series: 'C', value: 23, lineColor: 'green', lineStyle: 'dot' }
row[8]: { series: 'C', value: 54, lineColor: 'green', lineStyle: 'dot' }

例8-68 処理済の折れ線のデータ・コレクション

series[0]: { name: 'A', lineColor: 'red', lineStyle: 'solid' }
series[1]: { name: 'B', lineColor: 'blue', lineStyle: 'solid' }
series[2]: { name: 'C', lineColor: 'green', lineStyle: 'dot' }

かわりに、図8-58に示すように、seriesStyle要素のrendered属性を使用して、「ADFモバイルAMX」ページ設計で系列スタイルを制御できます。

例8-69 フィルタ対象系列スタイルを持つ折れ線グラフの定義

<dvtm:lineChart id="lineChart1"
inlineStyle="width: 400px; height: 300px;"
rolloverBehavior="dim"
animationOnDisplay="auto"
title="Line Chart"
titleStyle="font-size: 12px; color: black;"
value="#{bindings.lineData1.collectionModel}"
var="row"
seriesVar="series" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem series="#{row.series}"
group="#{row.group}"
value="#{row.value}"
color="#{row.color}" />
</amx:facet>
<amx:facet name="seriesStamp">
<dvtm:seriesStyle series="#{series.name}"
color="red"
lineWidth="3"
lineStyle="solid"
rendered="#{series.name == 'Coke'}" />
<dvtm:seriesStyle series="#{series.name}"
color="blue"
lineWidth="2"
lineStyle="dot"
rendered="#{series.name == 'Pepsi'}" />
</amx:facet>
</dvtm:lineChart>

lineChart要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

lineChartに対して次の子要素を定義できます。

- chartDataItem (第8.5.13.1項「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (第8.5.13.3項「X軸、Y軸およびY2軸の定義」を参照)

- legend (第8.5.13.2項「凡例の定義」を参照)

8.5.7 円グラフの作成方法

円グラフ(pieChart)は、各データ・アイテムを円セグメント(区分)で表したデータの比率による区分を示すために使用します。

例8-70は、ADFモバイルAMXファイルで定義されているpieChart要素を示しています。dataStampファセットは、ネストされたpieDataItem要素とともに指定されます。

例8-70 円グラフの定義

<dvtm:pieChart id="pieChart1"
inlineStyle="width: 400px; height: 300px;"
value="#{bindings.pieData.collectionModel}"
var="row"
title="Pie Chart"
animationOnDisplay="zoom"
animationDuration="3000" >
<amx:facet name="dataStamp">
<dvtm:pieDataItem label="#{row.name}" value="#{row.data}" />
</amx:facet>
<dvtm:legend position="bottom" />
</dvtm:pieChart>

図8-59 デザインタイムの円グラフ

円グラフのデータ・モデルは、個々の円データ・アイテムを定義するアイテムのコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- label: 区分ラベル。

- value: 区分の値。

モデルは、次のようなデータ・アイテムの他のプロパティも定義している場合があります。

- borderColor: 区分の境界線の色。

- color: 区分の色。

- explode: 区分を開くときのオフセット。

pieChart要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

pieChartに対して次の子要素を定義できます。

- pieDataItem (第8.5.13.4項「円グラフのデータ・アイテムの定義」を参照)

- legend (第8.5.13.2項「凡例の定義」を参照)

8.5.8 散布図の作成方法

散布図(scatterChart)は、各アイテムがx, y座標とサイズを持つデータ・アイテムを表す連続しないドットでデータを表示します。さらに、各データ・アイテムには、colorやshapeなど様々なスタイル属性を設定できます。各データ・アイテムのプロパティを個別に設定することも、様々な条件に基づいてデータ・アイテムをグループにカテゴリ分けすることもできます。複数のグループ化条件を同時に使用でき、データ・アイテムの関係を視覚化するために様々なスタイル属性を使用することもできます。ただし、折れ線グラフ(第8.5.6項「折れ線グラフの作成方法」を参照)や面グラフ(第8.5.1項「面グラフの作成方法」を参照)と異なり、散布図には系列およびグループの厳密な概念がありません。

例8-71は、ADFモバイルAMXファイルで定義されているscatterChart要素を示しています。dataStampファセットは、ネストされたchartDataItem要素とともに指定されます。各データ・アイテムのcolorおよびshape属性は、データ・モデルで提供されている値に基づいて個別に設定されます。

例8-71 散布図の定義

<dvtm:scatterChart id="scatterChart1"
inlineStyle="width: 400px; height: 300px;"
title="Scatter Chart"
animationOnDisplay="zoom"
animationDuration="3000"
value="#{bindings.scatterData.collectionModel}"
var="row" >
<amx:facet name="dataStamp">
<dvtm:chartDataItem label="#{row.group}"
x="#{row.data.x}"
y="#{row.data.y}">
<dvtm:attributeGroups type="color shape"
value="#{row.series}" />
</dvtm:chartDataItem>
</amx:facet>
<dvtm:xAxis title="X Axis Title" />
<dvtm:yAxis title="Y Axis Title" />
<dvtm:legend position="bottom" />
</dvtm:scatterChart>

図8-60 デザインタイムの散布図

散布図のデータ・モデルは、個々のデータ・アイテムを記述するアイテム(行)のコレクションによって表されます。各データ・アイテムの属性は、スタンプ(dataStamp)によって定義され、通常、次のものがあります。

- x、y: 値の座標(必須)。

- size: マーカーのサイズ(オプション)。

モデルは、次のようなデータ・アイテムの他のプロパティも定義している場合があります。

- borderColor: データ・アイテムの境界線の色。

- color: データ・アイテムの色。

- tooltip: カスタム・ツールチップ。

scatterChart要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

scatterChartに対して次の子要素を定義できます。

- chartDataItem (第8.5.13.1項「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (第8.5.13.3項「X軸、Y軸およびY2軸の定義」を参照)

- legend (第8.5.13.2項「凡例の定義」を参照)

8.5.9 スパーク・チャートの作成方法

スパークチャート(sparkChart)は、傾向や変化を、多くの場合、表の列内で表す簡単な縮小グラフです。このチャートは、多くの場合、データ密度の濃い表示に追加のコンテキストを提供するためにダッシュボードで使用されます。

例8-72は、ADFモバイルAMXファイルで定義されているsparkChart要素を示しています。dataStampファセットは、ネストされたsparkDataItem要素とともに指定されます。

例8-72 スパーク・チャートの定義

<dvtm:sparkChart id="sparkChart1"
value="#{bindings.sparkData.collectionModel}"
var="row"
type="line"
inlineStyle="width:400px; height:300px; float:left;">
<amx:facet name="dataStamp">
<dvtm:sparkDataItem value="#{row.value}" />
</amx:facet>
</dvtm:sparkChart>

図8-61 デザインタイムのスパーク・チャート

スパーク・チャートのデータ・モデルは、個々のスパーク・データ・アイテムを記述するアイテム(行)のコレクションによって表されます。通常、各データ・アイテムのプロパティには、次のものがあります。

- value: スパーク値。

sparkChart要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

sparkChartに対して次の子要素を定義できます。

- sparkDataItem (第8.5.13.5項「スパーク・チャートのデータ・アイテムの定義」を参照)

- referenceObjects (第8.5.13.6項「参照オブジェクトの定義」を参照)

8.5.10 LEDゲージの作成方法

チャートと異なり、ゲージでは、単一のデータ・ポイントを重視し、そのポイントを最小、最大およびしきい値インジケータと比較して問題領域を識別します。LED(電光表示)ゲージ(ledGauge)は、重要業績評価指標(KPI)などの測定値をグラフィカルに表します。LEDゲージには、いくつかのスタイルがあります。矢印付きのものは、よい(上矢印)、普通(右または左矢印)および悪い(下矢印)を示すために使用されます。ゲージのしきい値はいくつでも指定できます。ただし、一部のLEDゲージ(矢印または三角形のインジケータを持つものなど)では、指し示す有効な方向の数が限られているため、サポートされるしきい値の数にかぎりがあります。矢印または三角形のインジケータの場合、しきい値の最大数は3です。

例8-73は、ADFモバイルAMXファイルで定義されているledGauge要素を示しています。

例8-73 LEDゲージの定義

<dvtm:ledGauge id="ledGauge1"
value="65"
type="circle"
labelDisplay="on"
inlineStyle="width: 100px; height: 80px; float: left;
border-color: navy; background-color: lightyellow;">
<dvtm:threshold text="Low" maxValue="40" />
<dvtm:threshold text="Medium" maxValue="60" />
<dvtm:threshold text="High" maxValue="80" />
</dvtm:ledGauge>

図8-62 デザインタイムのLEDゲージ

LEDゲージのデータ・モデルは、value属性で指定される単一のメトリック値で表されます。

ledGauge要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

ledGaugeに対して次の子要素を定義できます。

- threshold (第8.5.13.7項「しきい値の定義」を参照)

8.5.11 ステータス・メーター・ゲージの作成方法

ステータス・メーター・ゲージ(statusMeterGauge)は、矩形の水平バーに沿ってタスクの進捗状況または測定値のレベルを示します。内側の矩形は、外側の矩形に表示された範囲に対する現在の測定値のレベルを示します。

例8-74は、ADFモバイルAMXファイルで定義されているstatusMeterGauge要素を示しています。

例8-74 ステータス・メーター・ゲージの定義

<dvtm:statusMeterGauge id="meterGauge1"
value="65"
animationOnDisplay="auto"
animationDuration="1000"
inlineStyle="width: 300px; height: 30px; float: left;
border-color: black;
background-color: lightyellow;"
labelDisplay="on"
minValue="0"
maxValue="100">
<dvtm:threshold text="Low" maxValue="40" />
<dvtm:threshold text="Medium" maxValue="60" />
<dvtm:threshold text="High" maxValue="80" />
</dvtm:statusMeterGauge>

図8-63 デザインタイムのステータス・メーター・ゲージ

ステータス・メーター・ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

statusMeterGauge要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

statusMeterGaugeに対して次の子要素を定義できます。

- threshold (第8.5.13.7項「しきい値の定義」を参照)

8.5.12 ダイアル・ゲージの作成方法

ダイヤル・ゲージ(dialGauge)は、悪いからよいまで変化する値(しきい値)の範囲を指定します。ゲージのインジケータではメトリックの現在の値が示される一方、図形によってその値のステータスを評価できます。

例8-74は、ADFモバイルAMXファイルで定義されているdialGauge要素を示しています。

例8-75 ダイヤル・ケージの定義

<dvtm:dialGauge id="dialGauge1"
background="#{pageFlowScope.background}"
indicator="#{pageFlowScope.indicator}"
value="#{pageFlowScope.value}"
minValue="#{pageFlowScope.minValue}"
maxValue="#{pageFlowScope.maxValue}"
animationDuration="1000"
animationOnDataChange="auto"
animationOnDisplay="auto"
shortDesc="#{pageFlowScope.shortDesc}"
labelDisplay="on"
inlineStyle="#{pageFlowScope.inlineStyle}"
styleClass="#{pageFlowScope.styleClass}"
readOnly="true"
</dvtm:dialGauge>

図8-64 デザインタイムのダイヤル・ゲージ

ダイヤル・ゲージのデータ・モデルは、value属性で指定される単一のメトリック値です。また、最小値はminValue属性で、最大値はmaxValue属性によって指定できます。

dialGauge要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

dialGaugeに対して次の子要素を定義できます。

- threshold (第8.5.13.7項「しきい値の定義」を参照)

8.5.13 チャートおよびゲージ・コンポーネントの子要素の定義方法

チャートおよびゲージには様々な子要素を定義できます。それらの子要素のいくつかを次に示します。

- chartDataItem (第8.5.13.1項「チャートのデータ・アイテムの定義」を参照)

- xAxis、yAxisおよびy2Axis (第8.5.13.3項「X軸、Y軸およびY2軸の定義」を参照)

- legend (第8.5.13.2項「凡例の定義」を参照)

- pieDataItem (第8.5.13.4項「円グラフのデータ・アイテムの定義」を参照)

- sparkDataItem (第8.5.13.5項「スパーク・チャートのデータ・アイテムの定義」を参照)

- referenceObject (第8.5.13.6項「参照オブジェクトの定義」を参照)

- threshold (第8.5.13.7項「しきい値の定義」を参照)

詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

JDeveloperでは、チャートおよびゲージの子コンポーネントは、「コンポーネント・パレット」の「DVTモバイルAMX」→「チャートおよびゲージ子タグ」の下にあります(図8-47を参照)。

図8-65 チャートおよびゲージの子コンポーネントの作成

8.5.13.1 チャートのデータ・アイテムの定義

チャート・データ・アイテム(chartDataItem)要素は、円グラフを除くすべてのサポートされているチャートでチャート・データ・アイテムが使用するパラメータを指定します。

chartDataItem要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.5.13.2 凡例の定義

凡例(legend)要素は、凡例パラメータを指定します。

legend要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.5.13.3 X軸、Y軸およびY2軸の定義

X軸(xAxis)およびY軸(yAxis)要素は、チャートのX軸とY軸を定義します。Y2軸(y2Axis)は、オプションのY2軸を定義します。これらの要素は、ADFモバイルAMXファイルで次のように定義されます。

<dvtm:xAxis scrolling="on" axisMinValue="0.0" axisMaxValue="50.0" />

xAxis、yAxisおよびy2Axis要素の属性および子要素の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.5.13.4 円グラフのデータ・アイテムの定義

円グラフのデータ・アイテム(pieDataItem)要素は、円グラフの区分のパラメータを指定します(第8.5.7項「円グラフの作成方法」を参照)。

pieDataItem要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.5.13.5 スパーク・チャートのデータ・アイテムの定義

スパーク・チャートのデータ・アイテム(sparkDataItem)要素は、スパーク・チャート・アイテムのパラメータを指定します(第8.5.9項「スパーク・チャートの作成方法」を参照)。

sparkDataItem要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.5.13.6 参照オブジェクトの定義

参照オブジェクト(referenceObject)要素は、スパーク・チャートの軸の参照オブジェクトを指定します(第8.5.9項「スパーク・チャートの作成方法」を参照)。

referenceObjects要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.5.13.7 しきい値の定義

しきい値(threshold)要素は、ゲージのしきい値範囲を指定します(第8.5.10項「LEDゲージの作成方法」および第8.5.11項「ステータス・メーター・ゲージの作成方法」を参照)。

threshold要素の属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.5.14 地理マップ・コンポーネントの作成方法

地理マップ(geographicMap)は、1つのマップに重ね合せた1つ以上のインタラクティブな情報レイヤーでビジネス・データを表します。このコンポーネントを構成して、GoogleマップまたはOracleマップのいずれかをマップ・プロバイダとして 使用できます(第8.5.14.1項「地理プロバイダ情報を指定した地理マップ・コンポーネントの構成」を参照)。

例8-76は、ADFモバイルAMXファイルで定義されているgeographicMap要素を示しています。

例8-76 地理マップの定義

<dvtm:geographicMap id="g1" mapType="ROADMAP"
centerX="-98.57" centerY="39.82"
zoomLevel="2" initialZooming="auto">
<dvtm:pointDataLayer id="pdl1"
var="row"
value="#{bindings.locationData.collectionModel}"
dataSelection="multiple"
selectionListener="#{myBean.doSomeGood}">
<dvtm:pointLocation id="pl1" type="address" address="#{row.address}">
<dvtm:marker shortDesc="#{row.shortDesc}" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:geographicMap>

geographicMapに対してpointDataLayer子要素を定義できます。pointDataLayerによって、マップ上の点と関連付けられたデータを表示できます。pointDataLayerは子要素としてpointLocationを持つことができます。pointLocationは、データ・ポイントの位置を決定するデータ・レイヤーのモデル内の列を指定します。これらの位置は、住所またはX座標とY座標で表すことができます。

pointLocationは、子要素としてmarkerを持つことができます。markerは、マップ上のデータ・ポイントに関連付けられた組込み形状またはカスタム形状をスタンプ・アウトするために使用します。markerでは、マーカーとしてレンダリングされるイメージのURIを指定するための一連のプロパティがサポートされています。マーカーは子要素としてconvertNumberを持つことができます(第8.3.22項「数値の変換方法」を参照)。

geographicMap要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.5.14.1 地理プロバイダ情報を指定した地理マップ・コンポーネントの構成

基礎となるマップに特定のプロバイダ(GoogleまたはOracle)を使用するように地理マップ・コンポーネントを構成するには、アプリケーションのadf-config.xmlファイルに名前と値のペアとして次のプロパティを設定します。

- mapProvider: oraclemapsまたはgooglemapsを指定します。

- geoMapKey: mapProviderがgooglemapsに設定されている場合は、ライセンス・キーを指定します。

- geoMapClientId: mapProviderがgooglemapsに設定されている場合は、Googleマップ・ビジネス・ライセンスのクライアントIDを指定します。

- mapViewerUrl: mapProviderがoraclemapsに設定されている場合は、Oracleマップのマップ・ビューアURLを指定します。

- baseMap: mapProviderがoraclemapsに設定されている場合は、Oracleマップとともに使用するベース・マップを指定します。

注意:

Googleマップを使用するように地理マップ・コンポーネントを構成するには、Googleから該当するライセンスを取得する必要があります。

例8-77は、Googleマップ用の構成を示しています。

例8-77 Googleマップの構成

<adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="mapProvider" value="googlemaps"/>
<adf-property name="geoMapKey" value="your key"/>
</adf-properties-child>

例8-78は、Oracleマップの構成を示しています。

例8-78 Oracleマップの構成

<adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="mapProvider" value="oraclemaps"/>
<adf-property name="mapViewerUrl"
value="http://elocation.oracle.com/mapviewer"/>
<adf-property name="baseMap" value="ELOCATION_MERCATOR.WORLD_MAP"/>
</adf-properties-child>

マップ・プロバイダ情報を指定しない場合、ADFモバイルAMX地理マップ・コンポーネントは、そのマップとしてGoogleマップを使用しますがライセンス・キーはありません。

adf-config.xmlファイルの詳細は、次を参照してください。

- 第4.2.2.1項「アプリケーション・レベルのリソースについて」

- 表4-1「アプリケーション・リソースを介してアクセスされるモバイル・アプリケーション・レベルのアーティファクト」

8.5.15 テーマ・マップ・コンポーネントの作成方法

テーマ・マップ(thematicMap)では、ビジネス・データをスタイル設定された領域内のパターンまたは関連付けられたマーカーとして表します。テーマ・マップでは、地理的な詳細なしで、データに焦点を合せます。

ADFモバイルAMXでは、Oracle ADF Thematic Mapコンポーネントのほとんどの機能、子要素およびプロパティがサポートされています。詳細は、Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイドのマップコンポーネントの使用方法に関する章を参照してください。次のものはサポートされていません。

- ドラック・アンド・ドロップ機能。

- コントロール・パネル。

- ポップアップ・メニュー。

- カスタム・リージョン(customAreaLayer)。

- ドリル。

- 閉じることが可能な凡例グループのセクション。

- 閉じることが可能な凡例。

- 領域およびマーカー上のパターン(pattern)。

- イメージ(ADFモバイルAMXイメージ(image)コンポーネント)。かわりに、マーカー(marker)子コンポーネントを指定してイメージを使用できます。詳細は、第8.5.15.1項「カスタム・マーカーの定義方法」を参照してください。

- markerのactionListener属性。かわりに、同じ機能を、selectionListenerを使用するかactionとsetPropertyListenerの組合せを使用して実現できます(第8.10項「イベント・リスナーの使用方法」を参照)。

ADFモバイルAMXテーマ・マップには、Oracle ADFでは使用できない次の機能があります。

- カスタム・マーカー(第8.5.15.1項「カスタム・マーカーの定義方法」を参照)

- 領域の分離(第8.5.15.2項「分離領域の定義方法」を参照)

- 初期ズーム(第8.5.15.3項「初期ズームの有効化」を参照)

- カスタム・ベース・マップ(第8.5.15.4項「カスタム・ベース・マップの定義方法」を参照)

例8-79は、ADFモバイルAMXファイルで定義されているthematicMap要素およびその子を示しています。

例8-79 テーマ・マップの定義

<dvtm:thematicMap id="tm1"
animationOnDisplay="#{pageFlowScope.animationOnDisplay}"
animationOnMapChange="#{pageFlowScope.animationOnMapChange}"
animationDuration="#{pageFlowScope.animationDuration}"
basemap="#{pageFlowScope.basemap}"
tooltipDisplay="#{pageFlowScope.tooltipDisplay}"
inlineStyle="#{pageFlowScope.inlineStyle}"
zooming="#{pageFlowScope.zooming}"
panning="#{pageFlowScope.panning}"
initialZooming="#{pageFlowScope.initialZooming}">
<dvtm:areaLayer id="areaLayer1"
layer="#{pageFlowScope.layer}"
animationOnLayerChange=
"#{pageFlowScope.animationOnLayerChange}"
areaLabelDisplay="#{pageFlowScope.areaLabelDisplay}"
labelType="#{pageFlowScope.labelType}"
rendered="#{pageFlowScope.rendered}">
<dvtm:areaDataLayer id="areaDataLayer1"
animationOnDataChange=
"#{pageFlowScope.dataAnimationOnDataChange}"
animationDuration=
"#{pageFlowScope.dataAnimationDuration}"
dataSelection="#{pageFlowScope.dataSelection}"
var="row"
value="#{bindings.thematicMapData.collectionModel}">
<dvtm:areaLocation id="areaLoc1" name="#{row.name}">
<dvtm:area action="sales" id="area1" shortDesc="#{row.name}">
<amx:setPropertyListener to=
"#{DvtProperties.areaChartProperties.dataSelection}"
from="#{row.name}"
type="action"/>
<dvtm:attributeGroups id="ag1" type="color" value="#{row.cat1}" />
</dvtm:area>
</dvtm:areaLocation>
</dvtm:areaDataLayer>
</dvtm:areaLayer>
<dvtm:legend position="end">
<dvtm:legendSection source="ag1"/>
</dvtm:legend>
</dvtm:thematicMap>

thematicMap要素の属性およびその子要素の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.5.15.1 カスタム・マーカーの定義方法

ADFモバイルAMXテーマ・マップでは、ADFモバイルAMXイメージ・コンポーネントはサポートされていません。マップのpointLocation内でイメージを使用するには、pointLocationのmarker子要素で、そのsource属性を使用してイメージを指定します。source属性がマーカーに対して設定されている場合、そのshape属性はADFモバイルAMXによって無視されます。

sourceHover、sourceSelectedおよびsourceHoverSelected属性で、ホバーおよび選択効果のイメージを指定できます。これらの1つが指定されていない場合、その特定のマーカー状態に対してはsource属性によって指定されているイメージが使用されます。sourceSelectedが指定されている場合、sourceHoverSelectedが指定されていないときはその値が使用されます。イメージは、PNG、JPG、SVGなどモバイル・デバイスのブラウザでサポートされている任意のフォーマットで構いません。

8.5.15.2 分離領域の定義方法

ADFモバイルAMXテーマ・マップ・コンポーネントを構成し、areaDataLayerのisolatedRowKey属性を使用してマップの単一の分離領域に収まるようにレンダリングおよびズームできます。この場合、その領域または領域データ・レイヤーの残りの領域はレンダリングされません。

注意:

分離できるのは、1つのマップで1つの領域のみです。

8.5.15.3 初期ズームの有効化

初期ズームでは、マップ・コンポーネントを通常どおりレンダリングし、その後、マーカーと領域の両方を含むデータ・オブジェクトにズームして合せることができます。この機能を有効にするには、テーマ・マップのinitialZooming属性を使用します。

8.5.15.4 カスタム・ベース・マップの定義方法

カスタム・ベース・マップ・サポートの一部として、ADFモバイルAMXでは、テーマ・マップ・コンポーネントに対して次のものを指定できます。

- 様々な解像度のイメージを持つレイヤー。

- 点の位置(pointLocation)から参照できる名前付きの点を持つ点レイヤー。

- カスタム・ベース・マップ・メタデータXMLファイルを指すテーマ・マップのsource属性。

注意:

ADFモバイルAMXでは、カスタム・ベース・マップのリソース・バンドルはサポートされていません。ロケール固有のツール・チップを追加する場合は、マーカー(marker)のshortDesc属性でELを使用できます。

カスタム・ベース・マップを作成するには、メタデータ・ファイルの定義を指す領域レイヤーを指定します(例8-80を参照)。基本的なカスタム・ベース・マップを定義するには、背景レイヤーおよびポインタ・データ・レイヤーを指定します。ADFモバイルAMXゲージ・コンポーネントと同様に、メタデータ・ファイルで、画面解像度および双方向画面(BiDi)ごとに異なるイメージを指定できます。ゲージタイプ・コンポーネントと同様に、テーマ・マップでは、画面解像度およびロケールに基づいてレイヤーに適切なイメージが選択されます。

例8-80 イメージのリストを含むメタデータ・ファイル

<basemap id="car" >
<layer id="exterior" >
<image source="/maps/car-800x800.png"
width="2560"
height="1920" />
<image source="/maps/car-800x800-bidi.png"
width="2560"
height="1920"
bidi="true" />
<image source="/maps/car-200x200.png"
width="640"
height="480" />
<image source="/maps/car-200x200-bidi.png"
width="640"
height="480"
bidi="true" />
</layer>
</basemap>

例8-81は、点によってカスタム領域レイヤーを宣言するADFモバイルAMXファイルを示しています。このADFモバイルAMXファイルは、使用可能なイメージのリストを含む例8-80に示すメタデータ・ファイルを指しています。

例8-81 点によるカスタム領域レイヤーの宣言

<dvtm:thematicMap id="tm1" basemap="car" source="customBasemaps/map1.xml" >
<dvtm:areaLayer id="al1" layer="exterior" >
<dvtm:pointDataLayer id="pdl1"
var="row"
value="{bindings.thematicMapData.collectionModel}" >
<dvtm:pointLocation id="pl1"
type="pointXY"
pointX="#{row.x}"
pointY="#{row.y}" >
<dvtm:marker id="m1" fillColor="#FFFFFF" shape="circle" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:areaLayer>
</dvtm:thematicMap>

前述の例では、ベース・マップIDはthematicMapのbasemap属性と照合され、レイヤーIDはareaLayerのlayer属性と照合されます。点は(前述のベース・マップの場合と同様に)X座標とY座標で定義され、データが更新されたときに変更される可能性がある動的な点に対応します。

例8-82は、点によってカスタム領域レイヤーを宣言するもう1つの方法を示しています。この例では、pointDataLayerは、thematicMapの直接の子です。方法は異なりますが、例8-82では、例8-81で示した宣言と同じ結果がレンダリングされます。

例8-82 直接の子要素を使用した点によるカスタム領域レイヤーの宣言

<dvtm:thematicMap id="demo1" basemap="car" source="customBasemaps/map1.xml" >
<dvtm:areaLayer id="al1" layer="exterior" />
<dvtm:pointDataLayer id="pdl1"
var="row"
value="{bindings.thematicMapData.collectionModel}" >
<dvtm:pointLocation id="pl1"
type="pointXY"
pointX="#{row.x}"
pointY="#{row.y}" >
<dvtm:marker id="m1" fillColor="#FFFFFF" shape="circle" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:thematicMap>

静的な点を含むカスタム・ベース・マップを作成するには、例8-83に示すメタデータ・ファイルで名前で点を指定します。このプロセスは、事前定義済ベース・マップに市区町村のマーカーを追加する場合に類似しています。

例8-83 名前付きの点のリストを含むメタデータ・ファイル

<basemap id="car" >
<layer id="exterior" >
<image source="/maps/car-800x800.png"
width="2560"
height="1920" />
<image source="/maps/car-800x800-bidi.png"
width="2560"
height="1920"
bidi="true" />
<image source="/maps/car-200x200.png"
width="640"
height="480" />
<image source="/maps/car-200x200-bidi.png"
width="640"
height="480"
bidi="true" />
</layer>
<points >
<point name="hood" x="219.911" y="329.663" />
<point name="frontLeftTire" x="32.975" y="32.456" />
<point name="frontRightTire" x="10.334" y="97.982" />
</points>
</basemap>

例8-84は、名前付きの点によってカスタム領域レイヤーを宣言するADFモバイルAMXファイルを示しています。このADFモバイルAMXファイルは、点とそれらの名前のリストを含む例8-80に示すメタデータ・ファイルを指しています。

例8-84 名前付きの点によるカスタム領域レイヤーの宣言

<dvtm:thematicMap id="demo1" basemap="car" source="customBasemaps/map1.xml" >
<dvtm:areaLayer id="al1" layer="exterior" />
<dvtm:pointDataLayer id="pdl1"
var="row"
value="#{bindings.thematicMapData.collectionModel}" >
<dvtm:pointLocation id="pl1" type="pointName" pointName="#{row.name}" >
<dvtm:marker id="m1" fillColor="#FFFFFF" shape="circle" />
</dvtm:pointLocation>
</dvtm:pointDataLayer>
</dvtm:thematicMap>

8.5.15.5 テーマ・マップ・コンポーネントへのカスタム・スタイリングの適用方法

デフォルトCSS設定を上書きするか、カスタムJavaScriptファイルを使用することで、テーマ・マップ・コンポーネントをスタイル設定できます。これらのファイルの拡張方法の詳細は、第8.6.3項「データ視覚化コンポーネントのスタイル設定方法」を参照してください。

例8-85は、テーマ・マップ・コンポーネントのデフォルトCSSスタイルを示しています。

例8-85 CSSのスタイル設定

.dvtm-thematicMap {
background-color: #FFFFFF;
-webkit-user-select: none;
-webkit-touch-callout: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
}

.dvtm-areaLayer {
background-color: #B8CDEC;
border-color: #FFFFFF;
border-width: 0.5px;
/* border style and color must be set when setting border width */
border-style: solid;
color: #000000;
font-family: tahoma, sans-serif;
font-size: 13px;
font-weight: bold;
font-style: normal;
}

.dvtm-area {
border-color: #FFFFFF;
border-width: 0.5px;
/* border style and color must be set when setting border width */
border-style: solid;
}

.dvtm-marker {
background-color: #61719F;
opacity: 0.7;
color: #FFFFFF;
font-family: tahoma, sans-serif;
font-size: 13px;
font-weight: bold;
font-style: normal;
}

スタイル設定のいくつかは、CSSを使用して指定できません。それらは、かわりにカスタムJavaScriptファイルを使用して定義する必要があります。例8-86は、CSSを使用しないでテーマ・マップ・コンポーネントにカスタム・スタイルを適用する方法を示しています。

例8-86 非CSSカスタム・スタイル設定

my-custom.js:

CustomThematicMapStyle = {
// selected area properties
'areaSelected': {
// selected area border color
'borderColor': "#000000",
// selected area border width
'borderWidth': '1.5px'
},

// area properties on mouse hover
'areaHover': {
// area border color on hover
'borderColor': "#FFFFFF",
// area border width on hover
'borderWidth': '2.0px'
},

// marker properties
'marker': {
// separator upper color
'scaleX': 1.0,
// separator lower color
'scaleY': 1.0,
// should display title separator
'type': 'circle'
},

// thematic map legend properties
'legend': {
// legend position, such as none, auto, start, end, top, bottom
'position': "auto"
}
};

})();

CustomThematicMapStyleオブジェクトの名前およびプロパティ名は変更できません。かわりに、特定のプロパティ値を、アプリケーションのニーズに合わせて変更できます。カスタムCSSおよびJavaScriptファイルをアプリケーションに追加する方法の詳細は、第5.9章「アプリケーション機能のコンテンツ・タイプの定義」を参照してください。

8.5.16 データバインドされたデータ視覚化コンポーネントの作成方法

「データ・コントロール」パネルから挿入されたデータ・コレクションを使用してデータバインドされたチャート、ゲージまたはマップを宣言で作成できます(第7章「ADFモバイルAMXページの作成」を参照)。図8-69に示す「コンポーネント・ギャラリ」ダイアログで、いくつかのデータ視覚化コンポーネント・カテゴリ、タイプおよびレイアウトのオプションの中から選択できます。

図8-66 コンポーネント・ギャラリ

注意:

いくつかのデータ視覚化コンポーネント・タイプには、特別な種類のデータが必要です。選択したコンポーネントのタイプの表示に十分なデータが含まれていないデータ・コレクションにコンポーネントをバインドすると、コンポーネントは表示されず、データが不十分であることを示すメッセージが表示されます。

「コンポーネント・ギャラリ」の表示をトリガーするには、「データ・コントロール」パネルから「ADFモバイルAMX」ページにコレクションをドラッグ・アンド・ドロップし、「ADFモバイル・チャート」、「ADFモバイル・ゲージ」、「ADFモバイル地理マップ」または「ADFモバイル・テーマ・マップ」のいずれかを選択します。(図8-67を参照)。

図8-67 データバインドされたDVTコンポーネントの作成

「コンポーネント・ギャラリ」から新しいデータバインド・コンポーネントのカテゴリ、タイプおよびレイアウトを選択し、「OK」をクリックすると、データ・バインディング・ダイアログを使用してDVTコンポーネントのデータ・コレクション属性のバインディングを開始できます。ダイアログの名前と、入力フィールド・ラベルは、選択したDVTコンポーネントのカテゴリおよびタイプによって異なります。図8-68に示すように、たとえば、カテゴリとして「横棒」を、タイプとして「棒」を選択した場合、表示されるダイアログの名前は「モバイル横棒チャートの作成」で、入力フィールドには「棒」というラベルがつけられます。

図8-68 データバインドされたチャートのデータ値の指定

データ・コレクション内の属性には、データ値またはデータ値のカテゴリを指定できます。データ値は、棒の高さなどのマーカーまたは散布図のポイントで示される数字です。データ値のカテゴリは、軸ラベルとして表されるメンバーです。バインディング内で属性が担うロール(データ値またはID)は、データ型(グラフには数値データ値が必要)およびマップされる場所(棒やX軸など)の両方によって決まります。

データ・バインディング・ダイアログの完了後は、プロパティ・インスペクタを使用してコンポーネント属性の設定を指定できます。コンポーネントと関連付けられた子要素を使用して、さらにカスタマイズすることもできます(第8.5.13項「チャートおよびゲージ・コンポーネントの子要素の定義方法」を参照)。

詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の次の項を参照してください。

- データバインドされたグラフの作成に関する項

- "データバインドされたゲージの作成に関する項

- データバインドされた地理マップおよびテーマ・マップに関する章

8.6 UIコンポーネントのスタイル設定

ADFモバイルでは、CSSを使用してUIコンポーネントにスタイルを適用できます。

8.6.1 コンポーネント属性を使用したスタイルの定義方法

次の属性を設定することで、UIコンポーネントをスタイル設定できます。

- styleClass属性は、レイアウト・コンポーネントに対して使用するCSSスタイル・クラスを定義します。

<amx:panelPage styleClass="#{pageFlowScope.pStyleClass}">

「ADFモバイルAMX」ページまたはスキニングCSSファイルでレイアウト、コマンドおよび入力コンポーネントのスタイル・クラスを定義できます。その場合、特定のスタイルがADFモバイルAMXアプリケーション機能内のすべてのコンポーネントに適用されます(第8.6.2項「スキニングについて」を参照)。かわりに、ADFモバイルによって提供されるパブリック・スタイル・クラスを使用できます。

注意:

CSSファイルは、JDeveloperからアクセスできません。かわりに、ADFモバイルによって、ビルドまたはデプロイ時に、このファイルがパッケージに注入され、そのときにCSSファイルがWeb Contentルート・ディレクトリの下のcssディレクトリに表示されます。

- inlineStyle属性は、任意のUIコンポーネントに使用するCSSスタイルを定義し、コンポーネントのルートDOM要素に適用される一連のCSSスタイルを表します。

<amx:outputText inlineStyle="color:red;">

この属性は、基本スタイルの変更が必要な場合に使用してください。

注意:

いくつかのUIコンポーネントは、HTML div要素やさらに複雑なマークアップなどのサブ要素でレンダリングされます。その結果、親コンポーネントにinlineStyle属性を設定しても、目的の効果が得られないことがあります。そのような場合、生成されたマークアップを調べ、inlineStyle属性を定義するかわりに、サブ要素にスタイルを伝播するCSSクラスを適用します。

JavaScriptのデバッグ方法の詳細は、第18.3.4項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

図8-69に示すように、これらの属性は、「プロパティ・インスペクタ」の「スタイル」セクションに表示されます。

図8-69 「プロパティ・インスペクタ」の「スタイル」セクション

ADFモバイルAMXでは、inlineStyle属性の様々なプロパティを設定するために使用できるドロップダウン・エディタが提供されています(図8-70を参照)。

図8-70 「インライン・スタイル」エディタ

詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

8.6.2 スキニングについて

スキニングによって、ADFモバイルAMXアプリケーション機能内のUIコンポーネントに均一なスタイルを定義および適用し、機能全体に対するテーマを作成できます。詳細は、第5.11項「ADFモバイル・アプリケーションのスキニング」を参照してください。

8.6.3 データ視覚化コンポーネントのスタイル設定方法

ADFモバイルAMXデータ視覚化コンポーネントのスタイル・プロパティの大部分は、cssディレクトリにあるdvtm.cssファイルで定義されます。アプリケーション機能レベルでのカスタム・スタイル定義を持つカスタムCSSファイルを追加することでデフォルト値を上書きできます(第5.11.4章「デフォルト・スキン・スタイルのオーバーライド」を参照)。

スタイル・プロパティのいくつかは、CSSにマップできないため、カスタムJavaScriptファイルで定義する必要があります。それらのプロパティは、次のとおりです。

- ダイヤル・ゲージ・コンポーネントの背景および針のイメージ(第8.5.12章「ダイアル・ゲージの作成方法」を参照)。

- テーマ・マップ・コンポーネントのベース・マップ(第8.5.15.4項「カスタム・ベース・マップの定義方法」を参照)。

- 地理マップ・コンポーネントのスタイル・プロパティ(第8.5.14項「地理マップ・コンポーネントの作成方法」を参照)。

「包含」セクションでこれらのカスタムJavaScriptファイルをアプリケーション機能レベルで指定する必要があります(第5.9.1章「アプリケーション・コンテンツの定義方法」を参照)。それによって、XMLスタイル・テンプレートで定義したデフォルト・スタイル値をオーバーライドします。例8-87は、CSSを使用してスタイル設定できないプロパティのカスタム・スタイル設定を必要とするデータ視覚化コンポーネントを持つADFモバイルAMXアプリケーション機能を含むADFモバイル・プロジェクトに追加する場合のようなJavaScriptファイルを示しています。

例8-87 カスタム・スタイル・プロパティの定義

my-custom.js:

CustomChartStyle = {

// common chart properties
'chart': {
// text to be displayed, if no data is provided
'emptyText': null,
// animation effect when the data changes
'animationOnDataChange': "none",
// animation effect when the chart is displayed
'animationOnDisplay': "none",
// time axis type - disabled / enabled / mixedFrequency
'timeAxisType': "disabled"
},

// chart title separator properties
'titleSeparator': {
// separator upper color
'upperColor': "#74779A",
// separator lower color
'lowerColor': "#FFFFFF",
// should display title separator
'rendered': false
},

// chart legend properties
'legend': {
// legend position none / auto / start / end / top / bottom
'position': "auto"
},

// default style values
'styleDefaults': {
// default color palette
'colors': ["#003366", "#CC3300", "#666699", "#006666", "#FF9900",
"#993366", "#99CC33", "#624390", "#669933", "#FFCC33",
"#006699", "#EBEA79"],
// default shapes palette
'shapes': ["circle", "square", "plus", "diamond",
"triangleUp", "triangleDown", "human"],
// series effect
'seriesEffect': "gradient",
// animation duration in ms
'animationDuration': 1000,
// animation indicators - all / none
'animationIndicators': "all",
// animation up color
'animationUpColor': "#0099FF",
// animation down color
'animationDownColor': "#FF3300",
// default line width (appllicable to line chart)
'lineWidth': 3,
// default line style (appllicable to line chart)
// solid / dotted / dashed
'lineStyle': "solid",
// should markers be displayed (appllicable to line and area charts)
'markerDisplayed': false,
// default marker color
'markerColor': null,
// default marker shape
'markerShape': "auto",
// default marker size
'markerSize': 8,
// pie feeler color (appllicable to pie chart only)
'pieFeelerColor': "#BAC5D6",
// slice label position and text type (appllicable to pie chart only)
'sliceLabel': {
'position': "outside",
'textType': "percent" }
}
};

CustomGaugeStyle = {
// default animation duration in milliseconds
'animationDuration': 1000,
// default animation effect on data change
'animationOnDataChange': "none",
// default animation effect on gauge display
'animationOnDisplay': "none",
// default visual effect
'visualEffects': "auto"
};
...
}

JavaScriptファイルを定義した後、任意の値をコメント解除および変更できます。例8-88が示すように、adfmf-feature.xmlファイルに含める機能としてこのファイルを追加します。

例8-88 アプリケーション機能でのカスタム・スタイル・ファイルのインクルード

<?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="feature1" name="feature1">
<adfmf:content id="feature1.1">
<adfmf:amx file="feature1/untitled1.amx">
<adfmf:includes>
<adfmf:include type="StyleSheet" file="css/custom.css"/>
<adfmf:include type="JavaScript" file="feature1/js/my-custom.js"/>
</adfmf:includes>
</adfmf:amx>
</adfmf:content>
</adfmf:feature>
</adfmf:features>

8.7 UIコンポーネントのローカライズ

「ADFモバイルAMX」ページで、JDeveloperによって提供される標準リソース・バンドルを使用することで、UIコンポーネントによって表示されるテキストをローカライズできます。これを行うには、コンポーネントおよびローカライズする値を持つテキスト表示プロパティの1つを選択し、「プロパティ・インスペクタ」の「値」ボックスの「テキスト・リソースの選択」を選択します(図8-71を参照)。

図8-71 テキスト・リソースの選択

これによって図8-72に示す標準ADF 「テキスト・リソースの選択」ダイアログが表示されます。このダイアログを使用して、変更するプロパティの文字列参照を入力または検索します。

図8-72 「テキスト・リソースの選択」ダイアログ

ローカライズ済文字列リソースを定義すると、その参照のELが「テキスト・リソースの選択」ダイアログの起動元のプロパティに自動的に入力されます。

図8-73は、ADFモバイルAMXファイルでの変更示しています。

図8-73 ADFモバイルAMXファイル内のローカライズ済文字列

詳細は、5.10項「リソース・バンドルの使用」を参照してください。

8.8 ADFモバイルのアクセシビリティのサポートについて

ADFモバイル・アプリケーションを開発する際は、アクセシビリティの問題に対処することで視覚的および身体的に障害があるユーザーに対応する必要があります。非視覚的なメディアへのレンダリングを行うWebブラウザなどのユーザー・エージェント(スクリーン・リーダーなど)により、UIコンポーネントのテキスト説明が読み上げられ、障害を持つユーザーに有益な情報が提供されます。ADFモバイルAMX UIは．次のアクセシビリティ標準に準拠するように設計されています。

- Accessible Rich Internet Applications (WAI-ARIA) 1.0仕様。
詳細は、次の項を参照してください。

- WAI-ARIA 1.0仕様の「Introduction」(http://www.w3.org/TR/wai-aria/introduction)

- 「Using WAI-ARIA」(http://www.w3.org/TR/wai-aria/usage)

- 第8.8.2項「基本的なWAI-ARIA用語について」

- Oracle Global HTML Accessibility Guidelines (OGHAG)。
詳細は、第8.8.3項「Oracle Global HTML Accessibility Guidelinesについて」を参照してください。

- iOSのアクセシビリティ・ガイドライン。
詳細は、『Accessibility Programming Guide for iOS』(http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/iPhoneAccessibility/Introduction/Introduction.html)を参照してください。

そのようなコンポーネントの導入によって、アクセス可能なコンポーネントの外観の変更されたり、アプリケーション・ロジックが影響受けることがありません。

ADFモバイルAMXアプリケーション機能のアクセシビリティが適切に機能するようにするには、次のガイドラインに従ってください。

- ナビゲーションの深さは3レベル以内にして、ユーザーが簡単にホーム画面に戻れるようにする必要があります。

- スクリプトを最小限に維持します。

- DOMとの直接対話を提供しないでください。

- JavaScriptのタイムアウトは使用しないでください。

- フォーカスの不要な変更は回避します。

- ポップアップ・トリガーを明示的に指定すること

- 必要に応じて、WAI-ARIAライブ・リージョンを利用します(第8.8.2項「基本的なWAI-ARIA用語について」を参照)。

- CSSの使用を最小限に維持します。

- デフォルト・コンポーネントの外観をオーバーライドしないようにしてください。

- 拡大縮小が可能なサイズ単位を選択します。

- CSSの位置設定は使用しないでください。

詳細は、『Web Content Accessibility and Mobile Web: Making a Web Site Accessible Both for People with Disabilities and for Mobile Devices』(http://www.w3.org/WAI/mobile)を参照してください。

8.8.1 アクセシビリティのためのUIコンポーネントの構成方法

ADFモバイルAMX UIコンポーネントには、組込みのアクセシビリティ・サポートが備えられており、ほとんどのコンポーネントがアクセシビリティ監査の対象となっています(図8-75を参照)。

表8-8は、「プロパティ・インスペクタ」の「アクセシビリティ」セクションで設定できるUIコンポーネントとそれらの属性を示しています。

表8-8 構成可能なアクセシビリティ属性を持つUIコンポーネント

コンポーネント

アクセシビリティ属性

アクセシビリティ監査メッセージ

ボタン(commandButton)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

選択ボタン(selectOneButton)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

リンク(commandLink)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

リンク(実行) (goLink)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

カルーセル(carousel)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

カルーセル・アイテム(carouselItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

リスト・アイテム(listItem)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

ポップアップ(popup)

短い説明(shortDesc)

shortDesc属性が存在し、実行されるアクションを説明する必要があります。

イメージ(image)

短い説明(shortDesc)

shortDesc属性を指定する必要があります。イメージが装飾目的で使用されている場合、それを空にすることができます。

入力テキスト(inputText)

ヒント・テキスト(hintText)

hintText属性が存在し、フィールドに何が含まれているのかを説明する必要があります。

パネル・グループ・レイアウト(panelGroupLayout)

ランドマーク(landmark)

NA 脚注 1

脚注 1 ランドマーク属性にはデフォルト値(none)があり、アクセシビリティ監査の対象ではありません。

shortDesc属性は、コンポーネントごとに異なる目的で使用します。たとえば、イメージ・コンポーネントにshortDesc属性を設定すると、ADFモバイルAMXファイルでそれはimage要素のalt属性の値として表示されます。

shortDesc属性の値はローカライズできます。

パネル・グループ・レイアウト・コンポーネントの場合、ページのコンテキストに従って適用可能なランドマーク・ロール・タイプ(表8-13「ランドマーク・ロール」を参照)を定義します。landmark属性に次の値の1つを設定できます。

- デフォルト(なし)

- application

- banner

- complementary

- contentinfo

- form

- main

- navigation

- search

表8-9は、WAI-ARIA仕様によって定義されるそのアクセシビリティ属性が実行時に自動的に適用され、変更できないUIコンポーネントを示しています。

表8-9 静的アクセシビリティ属性を持つUIコンポーネント

コンポーネント

アクセシビリティ属性

アクセシビリティ監査メッセージ

入力日(inputDate)

ラベル(label)

inputDateはラベルが付きません。inputDateのラベル属性は指定する必要があります

入力数値スライダ(inputNumberSlider)

ラベル(label)

inputNumberSliderはラベルが付きません。inputNumberSliderのラベル属性は指定する必要があります

パネル・ラベルおよびメッセージ(panelLabelAndMessage)

ラベル(label)

panelLabelAndMessageはラベルが付きません。panelLabelAndMessageのラベル属性は指定する必要があります

アイテムの選択(selectItem)

ラベル(label)

selectItemはラベルが付きません。selectItemのラベル属性は指定する必要があります

チェックボックス(selectBooleanCheckbox)

ラベル(label)

selectBooleanCheckboxはラベルが付きません。selectBooleanCheckboxのラベル属性は指定する必要があります

ブール・スイッチ(selectBooleanSwitch)

ラベル(label)

selectBooleanSwitchはラベルが付きません。selectBooleanSwitchのラベル属性は指定する必要があります

ラジオ・ボタン(selectOneRadio)

ラベル(label)

selectOneRadioはラベルが付きません。selectOneRadioのラベル属性は指定する必要があります

チェックボックスを複数選択(selectManyCheckbox)

ラベル(label)

selectManyCheckboxはラベルが付きません。selectManyCheckboxのラベル属性は指定する必要があります

選択肢(selectOneChoice)

ラベル(label)

selectOneChoiceはラベルが付きません。selectOneChoiceのラベル属性は指定する必要があります

出力テキスト(outputText)

値(value)

NA 脚注 1

脚注 1 値属性はアクセシビリティ監査の対象外です。

JDeveloperの「プリファレンス」ダイアログを使用して次のようにアクセシビリティ監査ルールを構成できます。

1. JDeveloperでメイン・メニューから「ツール」→「プリファレンス」を選択します。

2. プリファレンスのリストから、「監査」→「プロファイル」を選択します。

3. 監査: プロファイルペインで、ルールのツリーから「Application Development Framework (ADF)」ノードを開き、「ADFモバイル・フレームワーク」→「アクセシビリティ」を選択します。

4. 図8-74に示すように、アクセシビリティ監査ルールを選択し、アプリケーションに適用します。

図8-74 アクセシビリティ監査ルールの設定

図8-75は、JDeveloperに表示されるアクセシビリティ監査警告を示しています。

図8-75 アクセシビリティ監査警告

アクセス可能なADFモバイルAMXアプリケーション機能をテストする方法の詳細は、第18.2.1項「iOSデバイス上でアクセシビリティのテストを実行する方法」を参照してください。

8.8.2 基本的なWAI-ARIA用語について

WAI-ARIA 1.0仕様に述べられているように、複雑なWebアプリケーションは、支援テクノロジがドキュメントの部分の背後にあるセマンティクスを判別できない場合や、ユーザーが、使用可能な方法で実際にそのすべての部分を移動できない場合に、アクセス不可能になります。WAI-ARIAでは、セマンティクスがロール(ユーザー・インタフェース要素を定義するタイプ)と、ロールによってサポートされている状態およびプロパティに分割されています。次のセマンティクス・アソシエーションによって、WAI-ARIA用語の基礎が形成されています。

- ロール

- ランドマーク

- ライブ・リージョン

詳細は、http://www.w3.org/TR/wai-aria/termsを参照してください。

次の表は、ADFモバイルに適用可能なロールのカテゴリ(WAI-ARIA 1.0仕様での定義)を示しています。

表8-10は、全般的なロール概念を定義する目的でWAI-ARIAのロールの分類をサポートするために使用される抽象ロールを示しています。

表8-10 抽象ロール

抽象ロール

説明

input

ユーザー入力を可能にする一般的なタイプのウィジェット。

landmark

ナビゲーショナル・ランドマークを意図したページのリージョン。

select

ユーザーが一連の選択肢から選択を行えるフォーム・ウィジェット。

widget

グラフィカル・ユーザー・インタフェースのインタラクティブ・コンポーネント。

表8-11は、スタンドアロン・ユーザー・インタフェース・ウィジェットまたは大きい複合ウィジェットの一部として機能するウィジェット・ロールを示しています。

表8-11 ウィジェット・ロール

ウィジェット・ロール

説明

ウィジェットで必要とされる状態

alertdialog

アラート・メッセージを含むダイアログのタイプ。最初のフォーカスはそのダイアログ内の要素に移動します。

aria-labelledby、aria-describedby

ボタン

クリックまたは押されたときにユーザーによってトリガーされるアクションを可能にする入力。

aria-expanded (ステート)、aria-pressed (ステート)

checkbox

true、falseまたはmixedの3つの使用可能な値を持つチェック可能な入力。

aria-checked (ステート)

dialog

応答を要求するためにアプリケーションの現在の処理を中断するように設計されているアプリケーション・ウィンドウによって表されるダイアログ。

aria-labelledby、aria-describedby

link

内部または外部リソースへのインタラクティブな参照。アクティブ化されるとユーザー・エージェントがそのリソースにナビゲートします。

aria-disabled (ステート)、aria-describedby

option

選択リスト内の選択可能アイテム。

aria-labelledby、aria-checked (ステート)、aria-selected (ステート)

radio

ラジオ・ロールのグループ内のチェック可能入力。同時にチェックできるのはそれらのうち1つのみです。

aria-checked (ステート)、aria-disabled (ステート)

slider

指定された範囲内からユーザーが値を選択するユーザー入力。

aria-valuemax、aria-valuemin、aria-valuenow、aria-disabled (ステート)

listbox

選択肢のリストからユーザーが1つ以上のアイテムを選択できるウィジェット。

aria-live

radiogroup

ラジオ・ボタンのグループ。

aria-disabled (ステート)

listitem

リストまたはディレクトリ内の単一アイテム。

aria-describedby

textbox

その値として自由形式のテキストを使用できる入力。

aria-labelledby、aria-readonly、aria-required、aria-multiline、aria-disabled (ステート)

表8-12は、ページ内のコンテンツを編成する構造を記述するドキュメント構造ロールを示しています。通常、ドキュメント構造はインタラクティブではありません。

表8-12 ドキュメント構造ロール

ドキュメント構造ロール

説明

img

イメージを形成する要素のコレクションのコンテナ。

list

非インタラクティブ・リスト・アイテムのグループ。

listitem

リストまたはディレクトリ内の単一アイテム。

表8-13は、ナビゲーショナル・ランドマークを意図したページのリージョンを表すランドマーク・ロールを示しています。

表8-13 ランドマーク・ロール

ランドマーク・ロール

説明

application

Webアプリケーション(Webドキュメントではなく)として宣言されるリージョン.

banner

ほとんどサイト指向のコンテンツ(ページ固有のコンテンツではなく)を含むリージョン。

complementary

DOM階層の類似したレベルにあるメイン・コンテンツを補足するように設計ているが、メイン・コンテンツから切り離しても意味を持つドキュメントのサポート・セクション。

contentinfo

親ドキュメントに関する情報が含まれている大きな認識可能なリージョン。

form

全体として結合されてフォームを作成するアイテムおよびオブジェクトのコレクションが含まれているリージョン。

main

ドキュメントのメイン・コンテンツ。

navigation

ドキュメントまたは関連ドキュメントをナビゲートするためのナビゲーショナル要素(通常はリンク)のコレクション。

search

全体として結合されて検索機能を作成するアイテムおよびオブジェクトのコレクションが含まれているリージョン。

ADFモバイルUIコンポーネントの大部分では、アクセス可能なWAI-ARIA属性は変更できません。いくつかのコンポーネントでは、設計時に特別なアクセス可能な属性を設定できます。また、パネル・グループ・レイアウトには、WAI-ARIAランドマーク・ロール・タイプを使用できます。詳細は、第8.8.1項「アクセシビリティのためのUIコンポーネントの構成方法」を参照してください。

8.8.3 Oracle Global HTML Accessibility Guidelinesについて

Oracle Global HTML Accessibility Guidelines (OGHAG)は、オラクル社が準拠しているHTMLの一連のスクリプト標準です。これらの標準は、Section 508 (http://www.section508.govを参照)とWeb Content Accessibility Guidelines (WCAG) 1.0 level AA (http://www.w3.org/TR/WCAG10を参照)を組み合せ、言い回しとチェックポイントの測定を改善したものです。

詳細は、http://www.oracle.com/us/corporate/accessibility/policies/index.htmlのOracleのアクセシビリティについての考え方とポリシーを参照してください。

8.9 入力の検証

ADFモバイルでは、データ入力エラーおよびデータ入力中に発生するその他の状態に関してエンド・ユーザーに通知できます。それらのタイプ(エラーまたは警告)に応じて、検証メッセージのルック・アンド・フィールが異なります。

ユーザー入力の検証は、入力が送信されたときにトリガーされます。入力テキスト・コンポーネントは、エンド・ユーザーがフィールドから離れたときに自動的に検証されます。チェックボックスや選択肢などの選択コンポーネントの場合は、エンド・ユーザー選択を行ったときに検証が行われます。検証のために、「ADFモバイルAMX」ページのUIコンポーネントは、検証グループ操作(validationGroup)内にまとめられ、送信操作が実行されたときに入力が検証されるコンポーネントが定義されます。検証動作(validationBehavior)コンポーネントは、コマンド・コンポーネントのアクションが実行される前にどの検証グループが検証されるのかを定義します。1つのコマンド・コンポーネントが、複数の子検証動作コンポーネントを持つことができます。コンポーネントに検証動作が定義されていない場合、検証は行われません。

注意:

ネストされた検証グループ操作を定義することはできません。

検証グループの無効な定義は次のとおりです。

<amx:view>
<amx:panelPage>
<amx:validationGroup>
<amx:panelGroupLayout>
<amx:validationGroup/>
<amx:panelGroupLayout/>
</amx:validationGroup>
</amx:panelPage>
</amx:view>

有効な定義は次のとおりです。

<amx:view>
<amx:panelPage>
<amx:validationGroup>
</amx:panelPage>
<amx:popup>
<amx:validationGroup>
</amx:popup>
</amx:view>

「ADFモバイルAMX」ページに検証エラーメッセージが含まれている場合、エンド・ユーザーは、リスト・アイテム、リスト、ボタンなどのコマンド・コンポーネントでimmediate属性がtrueに設定されていないかぎり、それらのコンポーネントを使用してそのページから離れることはできません。警告を含むメッセージでは、ナビゲーションが停止されることはありません。

例8-89は、ADFモバイルAMXファイルでの複数の検証グループおよび検証動作操作など検証要素の定義方法を示しています。

例8-89 入力の検証の定義

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="outputText1" value="Validate"/>
</amx:facet>
<amx:facet name="secondary">
<amx:commandButton id="commandButton2" action="go" text="Save">
<amx:validationBehavior disabled="#{pageFlowScope.myPanel ne 'panel1'}"
group="group1"/>
<amx:validationBehavior disabled="#{pageFlowScope.myPanel ne 'panel2'}"
group="group2"/>
<!-- invalid, should be caught by audit rule but for any reason
if group not found at run time, this validate is ignored -->
<amx:validationBehavior disabled="false" group="groupxxx"/>
<!-- group is not found at run time, this validate is ignored -->
<amx:validationBehavior disabled="false" group="group3"/>
</amx:commandButton>
</amx:facet>
<amx:panelSplitter selectedItem="#{pageFlowScope.myPanel}">
<amx:panel id="panel1">
<amx:validationGroup id="group1">
<amx:panelFormLayout id="pfl1">
<amx:inputText value="#{bindings.first.inputValue}"
required="true"
label="#{bindings.first.hints.label}"
id="inputText1"/>
<amx:inputText value="#{bindings.last.inputValue}"
label="#{bindings.last.hints.label}"
id="inputText2"/>
</amx:panelFormLayout>
</amx:validationGroup>
</amx:panel>
<amx:panel id="panel2">
<amx:validationGroup id="group2">
<amx:panelFormLayout id="pfl2">
<amx:inputText value="#{bindings.salary.inputValue}"
label="#{bindings.first.hints.label}"
id="inputText3"/>
<amx:inputText value="#{bindings.last.inputValue}"
label="#{bindings.last.hints.label}"
id="inputText4"/>
</amx:panelFormLayout>
</amx:validationGroup>
</amx:panel>
</amx:panelSplitter>
<amx:panelGroupLayout id="pgl1" rendered="false">
<amx:validationGroup id="group3">
<amx:panelFormLayout id="pfl4">
<amx:inputText value="#{bindings.salary.inputValue}"
label="#{bindings.first.hints.label}"
id="inputText5"/>
<amx:inputText value="#{bindings.last.inputValue}"
label="#{bindings.last.hints.label}"
id="inputText6"/>
</amx:panelFormLayout>
</amx:validationGroup>
</amx:panelGroupLayout>
</amx:panelPage>

例8-90は、ADFモバイルAMXファイルでのポップアップに表示される検証メッセージの定義方法を示しています。

例8-90 ポップアップ・メッセージを含む入力の検証の定義

<amx:panelPage id="pp1">
<amx:facet name="header">
<amx:outputText id="outputText1" value="Login Demo"/>
</amx:facet>
<amx:facet name="secondary">
<amx:commandButton id="btnBack" action="__back" text="Back"/>
</amx:facet>
<amx:panelGroupLayout id="panelGroupLayout1">
<amx:validationGroup id="group1">
<amx:panelGroupLayout id="panelGroupLayout2">
<amx:inputText value="#{bindings.userName.inputValue}"
label="#{bindings.userName.hints.label}"
id="inputText1"
showRequired="true"
required="true"/>
<amx:inputText value="#{bindings.password.inputValue}"
label="#{bindings.password.hints.label}"
id="inputText2"
required="true"
showRequired="true"
secret="true"/>
<amx:outputText id="outputText2"
value="#{bindings.timeToStayLoggedIn.hints.label}:
#{bindings.timeToStayLoggedIn.inputValue} minutes"/>
</amx:panelGroupLayout>
</amx:validationGroup>
<amx:commandButton id="commandButton2"
text="Login"
action="navigationSuccess">
<amx:validationBehavior group="group1"/>
</amx:commandButton>
</amx:panelGroupLayout>
</amx:panelPage>

検証メッセージはポップアップ・コンポーネントに表示されます(第8.2.8項「ポップアップ・コンポーネントの使用方法」を参照)。検証ポップアップのタイトルを構成することはできません。それは、相対的なメッセージ重大度によって自動的に決定されます。現在のメッセージのうちの最も重大なものが検証ポップアップのタイトルになります。つまり、すべての検証メッセージがWARNINGタイプである場合は、そのタイトルは「警告」になります。メッセージのいくつかがWARNINGタイプで、その他はERRORタイプの場合はタイトルは「エラー」に設定されます。

図8-76は、実行時に生成されるポップアップ検証メッセージを示しています。

図8-76 iPhoneでの検証メッセージ

8.10 イベント・リスナーの使用方法

「ADFモバイルAMX」ページからJavaコードを呼び出し、アプリケーション・ロジックを実行するには、次のいずれかの方法でUIコンポーネントの属性としてリスナーを定義します。

- ADFモバイルAMXファイルのソースでの手動による方法。

- 選択したコンポーネントの「プロパティ」エディタから行う方法。詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

次のリスナーを使用して、「ADFモバイルAMX」ページにUIトリガー・イベントの検出機能を追加できます。

- valueChangeListener: 次のパラメータで作成されるValueChangeEventをリスニングします。

- 古い値を表すjava.lang.Object

- 新しい変更済の値を表すjava.lang.Object

- actionListener: パラメータなしで作成されるActionEventをリスニングします。

- selectionListener: 次のパラメータで作成されるSelectionEventをリスニングします。

- 古い行キーを表すjava.lang.Object

- 選択済行キーを表すjava.lang.String[]

- moveListener: 古い行キーを表すRowKeyタイプの次のパラメータで作成されるMoveEventをリスニングします。

- 移動済行キーを表すjava.lang.Object

- 移動済行キーがその前に挿入された行キーを表すjava.lang.String[]

- rangeChangeListener: 次のパラメータで作成されるRangeChangeEventをリスニングします。

- 古い開始範囲を表すint

- 古い終了範囲を表すint

- 新しい開始範囲を表すint

- 新しい終了範囲を表すint

リスナーの値は、パターン#{*}に一致している必要があり、次の要件を満たしている必要があります。

- タイプ名: EL式

- ベース・タイプ: 文字列

- プリミティブ・タイプ: 文字列

ELイベントの詳細は、第9.2.3項「ELイベント」を参照してください。

大部分のADFモバイルAMXイベント・クラスは、oracle.adfmf.amx.event.AMXEventクラスの拡張です。Javaコードでイベント・リスナーを定義するときは、oracle.adfmf.amx.event.AMXEventクラスを渡す必要があります。

詳細は、次の項を参照してください。

- Oracle Fusion Middleware Oracle ADFモバイルJava APIリファレンス

- Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンス

ADFモバイルでは、マネージドBeanメソッドがADFモバイルAMX固有のイベント・クラスを使用するように、リスナーに対してマネージドBeanメソッドを作成できます。例8-91、例8-92および例8-93は、同じマネージドBeanメソッドをコールするボタンおよびリンク・コンポーネントを示しています。AMXEventのソース値は、コンポーネントのIDを含むメッセージ・ボックスを表示することでどのオブジェクトがイベントを起動したのかを判別します。

例8-91 ADFモバイルAMXファイルからのBeanメソッドのコール

<amx:commandButton text="commandButton1" id="commandButton1"
actionListener="#{applicationScope.Bean.actionListenerMethod}">
</amx:commandButton>
<amx:commandLink text="commandLink1" id="commandLink1"
actionListener="#{applicationScope.Bean.actionListenerMethod}">
</amx:commandLink>

例8-92 AMXEventの使用方法

private void actionListenerMethod(AMXEvent amxEvent) {
Component source = (Component) amxEvent.getSource();
MessageBox.show("actionListener called for " + source.getId());
}

例8-93 イベント・メソッドの呼出し

public Object invokeMethod(String methodName, Object[] params) {
if (methodName.equals("actionListenerMethod")) {
actionListenerMethod((AMXEvent) params[0]);
}
return null;
}

追加の例は、開発コンピュータ上のjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のPublicSamples.zipファイルに配置されているJavaDemoというADFモバイル・サンプル・アプリケーションを参照してください。このサンプルは、Java Beanからリスナーをコールする方法を示しています。

8.10.1 イベント・リスナーの制約付きタイプ属性について

イベント・リスナーは、いくつかのADFモバイルAMX UIコンポーネントの子として定義できます。リスナーのtype属性によって、それらがどのイベントを処理するために登録されるのかが識別されます。各親UIコンポーネントでは(親コンポーネントに適した)イベントのサブセットのみがサポートされているため、これらのサポートされているイベントは、リスナーに対して選択できる限られたタイプのリストに提示されます。

表8-14は、親UIコンポーネント、それが子として持つことができるイベント・リスナー、およびそれらがサポートしているイベント・タイプを示しています。

表8-14 サポートされているイベント・リスナーとイベント・タイプ

UIコンポーネント(親)

アクション・リスナー(子)

プロパティ・リスナーの設定(子)

ポップアップ表示動作(子)

ポップアップを閉じる動作(子)

actionListener属性

valueChangeListener属性

moveListener属性

selectionListener属性

ボタン

サポート

サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

リンク

サポート

サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

リスト・アイテム

サポート

サポート

サポート

サポート

サポート

未サポート

未サポート

未サポート

入力日

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

入力数値スライダ

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

入力テキスト

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

リスト・ビュー

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

チェックボックス

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

スイッチ

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

チェックボックス(複数選択)

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

選択肢(複数選択)

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

選択肢

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

選択ボタン

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

ラジオ・ボタン

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

リンク(実行)

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

カルーセル

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

カルーセル・アイテム

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

イメージ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

面グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

棒グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

バブル・チャート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

組合せグラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

横棒グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

LEDゲージ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

ダイヤル・ゲージ

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

折れ線グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

円グラフ

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

散布図

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

スパーク・チャート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

未サポート

ステータス・メーター・ゲージ

未サポート

未サポート

未サポート

未サポート

未サポート

サポート

未サポート

未サポート

地理マップ

未サポート

サポート済脚注 1

未サポート

未サポート

未サポート

未サポート

未サポート

サポート済脚注 2

テーマ・マップ

未サポート

サポート済脚注 3

未サポート

未サポート

未サポート

未サポート

未サポート

サポート済脚注 4

脚注 1 プロパティ・リスナーの設定は、地理マップの領域のマーカーの子として指定できます。

脚注 2 selectionListener属性は、地理マップの面データ・レイヤーまたは点データ・レイヤーに設定できます。

脚注 3 プロパティ・リスナーの設定は、テーマ・マップの領域のマーカーの子として指定できます。

脚注 4 selectionListener属性は、テーマ・マップの面データ・レイヤーまたは点データ・レイヤーに設定できます。

子イベント・リスナーそれぞれのtype属性(図8-77を参照)には、リスナー・イベントと一致する値の基本セットがあります。これらの値は表8-14に示す情報に基づいてフィルタ処理され、それによって、子イベント・リスナーが、識別された親UIコンポーネントのコンテキスト内にある場合に、その親によってサポートされているイベントのみが表示されるようになります。たとえば、ボタン・コンポーネントの下にあるアクション・リスナーまたはプロパティ・リスナーの設定の子では、actionタイプの値およびジェスチャーのみか表示されます。

図8-77は、親リスト・アイテム・コンポーネントのプロパティ・リスナーの設定のかぎられたタイプ・リストにおいて使用可能な値を示しています。

図8-77 イベント・タイプの選択

9 バインディングの使用とデータ・コントロールの作成

この章では、ADFモバイル・アプリケーションでデータ・バインディング、データ・コントロールおよびADFデータ・バインディング式言語(EL)を使用する方法について説明します。またこの章では、検証およびデータ変更イベントについても説明します。

この章では、次の項目について説明します。

- 第9.1項「バインディング・レイヤー・コンポーネントとデータ・コントロールの概要」

- 第9.2項「ELサポートの理解」

- 第9.3項「バインディング・レイヤー・コンポーネントの理解」

- 第9.4項「Beanデータ・コントロールの作成と使用」

- 第9.5項「DeviceFeaturesデータ・コントロールの使用方法」

- 第9.6項「検証の実行」

- 第9.7項「データ変更イベント」

9.1 バインディング・レイヤー・コンポーネントとデータ・コントロールの概要

ADFモデルによって、ユーザー・インタフェース・テクノロジとビジネス・サービス実装の分離を可能にする2つの概念(データ・コントロールと宣言的バインディング)が実装されています。データ・コントロールでは、関連するプロパティ、メソッド、タイプの情報を含め、サービスの操作とデータ・コレクションを表す標準のメタデータ・インタフェースを使用してビジネス・サービスの実装技術を抽象化します。JDeveloperを使用すると、その情報をアイコンとして表示し、ページ上にドラッグ・アンド・ドロップできます。宣言的なバインディングによって、データ・コントロール内のデータ・コレクションからのデータ・アクセスとその操作の実行の詳細が抽象化されます。実行時に、ADFモデル・レイヤーによって、適切なXMLファイルからデータ・コントロールおよびバインディングを記述した情報が読み取られ、ユーザー・インタフェースとビジネス・サービスの双方向の結合が実装されます。

ページのUIコンポーネントをサポートするバインディングのグループは、ページ定義ファイルというページ固有のXMLファイルに記述されます。ADF Modelレイヤーでは実行時にこのファイルが使用され、ページのバインディングがインスタンス化されます。これらのバインディングは、バインディング・コンテナと呼ばれるリクエスト・スコープ・マップに保持され、EL式#{bindings}を使用して各ページ・リクエスト中にアクセスできます。この式により、現在のページのバインディング・コンテナが常に評価されます。「データ・コントロール」パネルから項目をドラッグし、それを特定のUIコンポーネントとしてページ上にドロップすることで、データバインドされたユーザー・インタフェースを設計できます。データ・コントロールを使用してUIコンポーネントを作成すると、そのコンポーネントを選択したデータ・コントロールにバインドするために必要なコードおよびオブジェクトがJDeveloperによって自動的に作成されます。

ADFモバイルにおけるデータ・コントロールの動作は、Oracle ADFにおける動作と似ています。JDeveloperの「データ・コントロール」パネル内に表示されるDeviceFeaturesデータ・コントロールを使用すると、データ・コントロールの主なデータ属性を(テキスト)フィールドとしてまたデータ・コントロールの操作をコマンド・オブジェクト(ボタン)として、アプリケーションにドラッグ・アンド・ドロップできます。これらのドラッグ・アンド・ドロップ・アクションによって、アプリケーション内のELバインディングが、作成されるコントロールに適したプロパティ内に生成されます。そのようなアクションに対応する通常のADFバインディング(データ・コントロール・ソースを指す汎用的なDataControls.dcxファイルや特定のページの参照をデータ・コントロールにリンクするページ・バインディングによって表されます)が提供され、ランタイムはアプリケーションの実行時にそれらのバインディングを処理できます。

データ・バインディングとデータ・コントロールの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』と『Oracle Fusion Middleware Oracle Application Development Framework Java EE開発者ガイド』を参照してください。

9.2 ELサポートの理解

ADFモバイルでは、そのADFモバイルAMXアプリケーション機能での式言語(EL)の使用がサポートされます。

ELは、データ・バインディングを有効化するために使用します。ELとOracle ADFの併用の概要については、次の資料を参照してください。

- 『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のFusion WebアプリケーションでのADFモデルの使用方法に関する項

- 『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFデータ・バインディングのEL式の作成に関する項

ADFオブジェクトは、アプリケーション・スコープ、セッション・スコープ、ページ・フロー・スコープなど、様々なスコープ内に存在します(『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のオブジェクト・スコープのライフサイクルに関する項を参照)。一方、ADFモバイルでは、次のスコープがサポートされます。

- アプリケーション・スコープ

- ページ・フロー・スコープ

- プリファレンス・スコープ

- ビュー・スコープ

- デバイス・スコープ

アプリケーション・スコープの名前空間で定義されたEL式は、アプリケーションが存続するかぎり使用できます。ADFモバイルを使用すると、アプリケーションの一方のビューでアプリケーション・スコープを定義し、そのスコープをもう一方のビューで参照できます。

9.2.1 ADFモバイルAMX ELの実装

ADFモバイルAMX ELの実装は、Java Unified Expression Language (JUEL)プロジェクトに基づき、Expression Language Specification Version 2.1 (http://juel.sourceforge.net/にあるJUELプロジェクトのページで確認できます。今後これを「仕様」と呼びます)に従って行いますが、次のような例外があります。

- 即時および遅延評価

- 列挙型

9.2.1.1 即時および遅延評価

仕様の「1.2.1: Eval-expression」に記載されているとおり、式は即時に評価される場合と遅れて評価される場合があります。ADFモバイルAMX ELの実装では、ページのメタデータをロードするときに式を解析し、ここで解析されたオブジェクトへの参照を所有コンポーネントが保持します。式の評価は、実際にはコンポーネントで値のレンダリングのために式が必要になるまで行われません。ADFモバイルAMXでは遅延セマンティクのみがサポートされるため、即時構成式(${})を使用する式は解析を行いますが、その動作は遅延式(#{})と同じになります。

9.2.1.2 列挙型

仕様の「1.17: Enums」に記載されているとおり、リテラル文字列を使用して列挙型の値に強制することはできません。その理由は、基礎となる必要な列挙操作がJ2MEでサポートされないためです。

9.2.2 バインディング・コンテナを参照する方法

アクティブな画面のバインディング・コンテナは、ルートEL式#{bindings}から参照できます。別の画面のバインディング・コンテナは、式#{data.PageDefName}から参照できます。ADFモバイルAMXバインディング・オブジェクトは、バインディング・コンテナ#{bindings.Name}から名前で参照されます。

表9-1は、実行時にADFモバイルAMXバインディング・オブジェクトの値にアクセスするためのEL式で使用できるプロパティをリストしています。表では、これらのプロパティをアルファベット順にリストしています。

表9-1 実行時プロパティ

実行時プロパティ

説明

イテレータ

アクション

属性

ツリー

class

実行時バインディング用のJavaクラス・オブジェクトを戻します。

あり

あり

あり

あり

collectionModel

データのコレクションを公開します。collectionModelにバインドされているコンポーネント内で使用するEL式は、コレクションの各要素の式を解決するrow変数脚注 1 を使用して参照できます。

なし

なし

なし

あり

currentRow

イテレータが指している現在の行へのアクセスを提供します。

あり

なし

なし

なし

dataControl

イテレータの関連データ・プロバイダを戻します。

あり

なし

なし

なし

dataProvider

currentRowの子として使用できます。イテレータ内で使用されるデータ構造へのアクセスを提供します。

あり

なし

なし

なし

enabled

アクション・バインディングの状態に応じて、trueまたはfalseを戻します。たとえば、アクション・バインディングは、ユーザーが「先頭へ」、「次へ」、「前へ」、「最後へ」などのナビゲーション・ボタンをクリックした場合に決定される現在位置に基づいて、有効化(true)または無効化(false)されます。

なし

あり

なし

なし

execute

解決されたときに、名前付きアクションまたはmethodActionバインディングを起動します。

なし

あり

なし

なし

hints

バインディングが関連付けられているすべての表示属性について、UIヒントの名前/値ペアのリストを戻します。次の名前の付いた値がサポートされています。

- format: 現在の属性に使用される書式

- label: 現在の属性に表示されるラベル

- updateable: 現在の属性を書き込むことができる場合、trueを戻します。

なし

なし

あり

あり

inputValue

現在の属性の値を戻すか設定します。

なし

なし

あり

なし

items

現在のリストの有効な属性に関連付けられた値のリストを戻します。

あり

なし

なし

なし

label

hintsの子または属性の直接の子として使用できます。バインディングの最初の属性のラベルを戻します(コントロール・ヒントで指定されている場合)。

なし

なし

あり

あり

rangeSize

イテレータ・バインディングの行セットの範囲サイズを戻します。

あり

なし

なし

あり

rangeStart

レンジに含まれる最初の行のコレクションの絶対索引を戻します。

あり

なし

なし

なし

rowCount

コレクションに含まれる行の合計数を戻します。

あり

なし

なし

なし

updateable

hintsの子または属性の直接の子として使用できます。現在の属性が更新可能である場合、trueを戻します。

なし

なし

あり

あり

viewable

ツリーの子として使用できます。このバインディングおよび関連コンポーネントをレンダリングするかどうかを実行時に解決します。

なし

なし

なし

あり

脚注 1  EL語句のrowは、コレクション・コンポーネントのコンテキスト内で使用されます。rowは単に、コレクションをレンダリングするときに、ADFモバイルAMXバインディング・オブジェクトからアクセスできる属性を含むコレクションの各要素に対する反復変数として機能します。属性とリスト・バインディングには、row変数を使用してアクセスできます。そのような式の構文は、コレクションに含まれないバインディング・オブジェクトへのアクセスに使用される構文と同じで、#{row.bindings.Name.property}のようにrow変数を先頭の語句として追加します。

9.2.3 ELイベント

ELイベントは、共通語句を含む式が相互に同期して更新できるようにするため、ADFモバイルAMX UIの動作において重要な役割を果たします。

EL式は、様々なコンテキストで値を参照できます。例9-1は、2つの入力数値スライダ・コンポーネントの作成を示しており、各コンポーネントがapplicationScopeの値に関連付けられています。出力テキストでは、ELを使用して単純な追加式を計算結果とともに表示します。フレームワークでは、出力テキスト・ラベル内のEL式を解析するときに、その式に2つの値への参照が含まれていることを確認し、それら2つの値に基づく出力テキストのイベント・リスナー(第8.10項「イベント・リスナーの使用方法」を参照)を作成します。基礎となる式の値が変化すると、イベントがその値のすべてのリスナーに対して生成されます。

注意:

(スコープ・オブジェクトではなく)マネージドBeanのプロパティを参照している場合、リスナーを追加する必要があります。詳細は、第9.2.4.2項「ADFマネージドBean」を参照してください。

例9-1 2つのコンポーネントを含むELイベントの生成

<amx:inputNumberSlider id="slider1" label="X" value="#{applicationScope.X}"/>
<amx:inputNumberSlider id="slider2" label="Y" value="#{applicationScope.Y}"/>
<amx:outputText id="ot1" value="#{applicationScope.X} +
#{applicationScope.Y} = #{applicationScope.X + applicationScope.Y}"/>

例9-1では、2つのコンポーネントがそれぞれ1つの値を更新し、1つのコンポーネントが両方の値を使用します。例9-2は、いずれかの既存の値を参照する3つ目の入力数値スライダ・コンポーネントが追加された場合、動作は同じになることを示しています。

例9-2 3つのコンポーネントを含むELイベントの生成

<amx:inputNumberSlider id="slider1" label="X" value="#{applicationScope.X}"/>
<amx:inputNumberSlider id="slider2" label="Y" value="#{applicationScope.Y}"/>
<amx:outputText id="ot1" value="#{applicationScope.X} +
#{applicationScope.Y} = #{applicationScope.X + applicationScope.Y}"/>
<amx:inputNumberSlider id="slider3" label="X" value="#{applicationScope.X}"/>

例9-2では、いずれかの入力数値スライダ・コンポーネントが#{applicationScope.X}を更新すると、もう一方が出力テキストとともに自動的に更新されます。

9.2.3.1 構成プロパティ

アプリケーションのadf-config.xmlファイル内にあるすべての<adf-property>要素は、ELを通じて#{applicationScope.configuration}ノードの子として公開されます。このため、たとえばadf-config.xmlが次の例のようになっている場合、#{applicationScope.configuration.key1}の評価によってvalue1が生成され、#{applicationScope.configuration.key2}の評価によってvaue2が生成されます。

<?xml version="1.0" encoding="windows-1252" ?>
<adf-config xmlns="http://xmlns.oracle.com/adf/config" xmlns:config="http://xmlns.oracle.com/bc4j/configuration"
xmlns:sec="http://xmlns.oracle.com/adf/security/config">
<adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="key1" value="value1"/>
<adf-property name="key2" value="value2"/>
</adf-properties-child>
</adf-config>

また、デバイスでアクセシビリティ・モードが有効になっている場合、#{applicationScope.configuration.accessibilityEnabled}はtrueと評価されます。iOSデバイスでは、これはVoiceOverがアクティブ化されることを意味します。Androidデバイスでは、これはTalkBackがアクティブ化されることを意味します。

9.2.4 EL式ビルダー

EL式は、JDeveloper式ビルダーで変数と演算子から値を選択することによって作成できます。この式ビルダーは、ELに対応した任意のプロパティの「プロパティ・インスペクタ」から起動できます。式ビルダーの使用の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFデータ・バインディングEL式の作成方法に関する項を参照してください。

Oracle ADFには、次の2つのELタイプがあります。

- 動的EL: ${EL expression}

- 遅延EL: #{EL expression}

ADFモバイルでは動的ELタイプがサポートされず、${EL expression}が#{EL expression}として処理されるため、式を定義するときにハッシュ記号( # )接頭辞を使用する必要があります。詳細は、第9.2.1.1項「即時および遅延評価」を参照してください。

ADFモバイルAMXページの式ビルダーでは、次のカテゴリを使用できます。

- ADFバインディング

- ADFマネージドBean

- ADFモバイル・オブジェクト

9.2.4.1 ADFバインディング

この項では、「ADFバインディング」カテゴリで使用できるオプションをリストします。バインディングとデータ・ノードは、同じ一連のサポートされているバインディングとプロパティを表示します。表9-2に、使用できるバインディング・タイプと、各バインディング・タイプでサポートされるプロパティをリストします。

- bindings
表9-2に、使用できるバインディング・タイプと、各バインディング・タイプでサポートされるプロパティをリストします。

- data
表9-2に、使用できるバインディング・タイプと、各バインディング・タイプでサポートされるプロパティをリストします。

- securityContext
サポートされるプロパティは、次のとおりです。

- authenticated

- userGrantedPrivilege

- userInRole

- userName

表9-2 サポートされるバインディング・タイプ

バインディング・タイプ

プロパティ

accessorIterator

class

currentRow: dataProvider

name

rangeSize

action

classenabled

execute

name

attributeValues

class

format

hints: format, label, updateable

inputValue

items

iteratorBinding

label

name

updateable

button

class

format

hints: format, label, updateable

inputValue

items

label

name

updateable

invokeAction

always

deferred

iterator

class

currentRow: dataProvider

name

rangeSize

list

class

format

hints: format, label, updateable

inputValue

items

label

name

updateable

methodAction

class

enabled

execute

name

operationInfo

paramsMap

result

methodIterator

class

currentRow: dataProvider

name

rangeSize

tree

class

collectionModel: <AttrName>

hints: format, label, updateable, <AttrName>

iteratorBinding

name

rangeSize

viewable

variableIterator

class

currentRow: dataProvider

name

9.2.4.2 ADFマネージドBean

ADFモバイル・アプリケーションでマネージドBeanを作成および使用し、追加のデータを格納したり、カスタム・コードを実行できます。ADFモバイル・アプリケーションへのマネージドBeanの追加は、Fusion WebアプリケーションにマネージドBeanを追加する場合と同じ方法で行います。

詳細は、次の項を参照してください。

- 『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のFusion WebアプリケーションでのマネージドBeanの使用方法に関する項。

- JavaDemo。これはjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内のADFモバイルのサンプル・アプリケーションです。このサンプル・アプリケーションでは、Java Beanの使用方法とコンテナ・ユーティリティ・メソッドの起動方法を示します。詳細は、付録E「サンプルのADFモバイル・アプリケーション」を参照してください。

注意:

コンポーネントを構成するときは、使用するバインディング・スタイルを十分に考慮してください。より具体的に言うと、標準的なバインディングをマネージドBeanバインディングと組み合せると、解釈を誤った動作が発生することがよくあります。これは、バインディング・インフラストラクチャとマネージドBeanインフラストラクチャとの間でクラス・インスタンスが一致する可能性が低いためです。バインディングが混在すると、UIに直接リンクされていないインスタンスの動作がコールされる場合があります。

サポートされるADFモバイル・マネージドBeanのスコープは、次のとおりです。

- applicationScope: 「ADFマネージドBean」のapplicationScopeノードには、アプリケーション・レベルで定義されたものがすべて含まれます(アプリケーション・スコープのマネージドBeanなど)。

- pageFlowScope: 「ADFマネージドBean」のpageFlowScopeノードには、ページ・フロー・レベルで定義されたものがすべて含まれます(ページ・フロー・スコープのマネージドBeanなど)。

- viewScope: 「ADFマネージドBean」のviewScopeノードには、ビュー・レベルで定義されたものがすべて含まれます(ビュー・スコープのマネージドBeanなど)。

式ビルダーで「ADFマネージドBean」カテゴリを選択すると、「マネージドBeanの作成」ボタンが表示されます。式ビルダーから直接マネージドBeanを作成するには、このボタンをクリックします。

図9-1は、ADFモバイル・マネージドBeanの内容と「マネージドBeanの作成」ボタンの例を示しています。

図9-1 ADFマネージドBeanの内容

ADFモバイル・ランタイムでは、自身をマネージドBeanプロパティの変更通知のリスナーとして登録することによって、Beanプロパティを参照するUIコンポーネントにバインドされたEL式が、プロパティの値が変更されたときに自動的に更新されるようにします。これらの通知をソースとして参照するには、Beanのプロパティ・アクセッサにコードを追加する必要があります。Beanのプロパティ・アクセッサから、通知をソースとして参照するために必要なコードを自動的に生成するには、「アクセッサの生成」ダイアログの「プロパティの変更時にリスナーに通知」チェック・ボックスを選択します(図9-2を参照)。

図9-2 プロパティの変更時にリスナーに通知

ELを通じて単にBeanメソッドまたはプロパティを参照する場合、このコードを追加する必要はありませんが、Beanに格納された値が変化する場合や、特にその変更が、1つ以上のプロパティ値を変更するBeanメソッドの実行による二次的な影響など、間接的なものである場合、それらの値に依存するEL式のアクティブ・フォームへのレンダリングを最新の状態に保つ必要があります。プロパティの変更とPropertyChangeSupportクラスについては、第9.7項「データ変更イベント」を参照してください。

注意:

機能のapplicationScope内でマネージドBeanを宣言し、デザインタイムで別の機能のELを通じてそのBeanを参照しようとすると、そのデザインタイムで無効なELに関する警告が表示されます。この警告は、デザインタイムがそのBeanの現在のプロジェクトで参照を検出できないことが原因で表示されます。そのBeanを実行時に参照できるのは、Beanが宣言されている最初の機能に初めてアクセスし、さらに別の機能のELを通じてアクセスする前にそのBeanをインスタンス化した場合のみです。これは、Name属性の値をノード・ラベルとして使用するPreferenceValue要素には当てはまりません。

9.2.4.3 ADFモバイル・オブジェクト

「ADFモバイル・オブジェクト」カテゴリでは、次のオプションを使用できます。

- applicationScope: applicationScopeノードには、アプリケーション・レベルで定義されたものがすべて含まれます(アプリケーション・スコープのマネージドBeanなど)。

- deviceScope: deviceScopeノードには、デバイス・レベルで定義されたものがすべて含まれます(デバイス・スコープのマネージドBeanなど)。ADFモバイルでは、次のdeviceScopeプロパティがサポートされます。

- device

- model

- name

- os

- phonegap

- platform

- version

- hardware

- hasAccelerometer

- hasCamera

- hasCompass

- hasContacts

- hasFileAccess

- hasGeolocation

- hasLocalStorage

- hasMediaPlayer

- hasMediaRecorder

- hasTouchScreen

- networkStatus

- screen (availableHeight、availableWidth、height、width)

- pageFlowScope: pageFlowScopeノードには、ページ・フロー・レベルで定義されたものがすべて含まれます(ページ・フロー・スコープのマネージドBeanなど)。

- preferenceScope: preferenceScopeノードには、アプリケーションと機能のすべてのプリファレンスが含まれます。

- アプリケーションのプリファレンスは、「ADFモバイル・オブジェクト」→「preferenceScope」→「application」で提供されます。

- 機能のプリファレンスは、「ADFモバイル・オブジェクト」→「preferenceScope」→「feature」→「featureId」で提供されます。

図9-3は、preferenceScopeノードにあるプリファレンス要素の例を示しています。

図9-3 preferenceScopeノードのプリファレンス要素

プリファレンス要素では、PreferenceValue要素を除き、Id属性の値を式ビルダーのノード・ラベルとして使用します。PreferenceValue要素では、Name属性の値を式ビルダーのノード・ラベルとして使用します。

注意:

EL式の文字列トークンにドット(.)や特殊文字またはdefaultなどの予約語が含まれている場合、式ビルダーではそのような文字列トークンを一重引用符と大カッコで囲みます。機能IDやプリファレンス・コンポーネントIDにドットが含まれている場合、式ビルダーでは、ドットによって区切られたIDの各部分を別のプロパティとしてpreferenceScope階層に表示します。生成された式でも、ドットによって区切られたIDの各部分を別のプロパティとして認識します。

preferenceScopeのいくつかのサンプルEL式を次に示します。

例9-3 ドットを含む機能ID

"#{preferenceScope.feature.oracle.hello.SampleGroup1.label}"

例9-4 属性名が予約語である場合

"#{preferenceScope.application.OracleMobileApp.Edition['default']}"

- viewScope: このノードには、ビュー・レベルで定義されたものがすべて含まれます(ビュー・スコープのマネージドBeanなど)。

- row: row変数ノードは、collectionModelへのショートカットです。その名前は、親のイテレータ、リスト・ビューまたはカルーセル・コンポーネントのvar属性の値です。このノードでは、次のディレクトリ構造がサポートされます。

- バインディング

- AttrName

- class

- format

- hints

- inputValue

- items

- iteratorBinding

- label

- name

- updateable

- AttrName

- class

- format

- hints

- inputValue

- items

- iteratorBinding

- label

- name

- updateable

- rowKey

図9-4は、row変数ノードの内容の例を示しています。

図9-4 row変数の内容

- viewControllerBundle
これはプロジェクト・レベルで定義されたリソース・バンドルを指すリソース・バンドル変数の名前です。このノードは、amx:loadBundle要素がドロップされ、リソース・バンドルが作成された後にのみ表示されます。このノードの名前は、amx:loadBundleの変数名によって異なります。このノードには、バンドル内で宣言されたすべての文字列が表示されます。

図9-5は、viewControllerBundleノードの内容の例を示しています。例9-5は、viewControllerBundleのAMXコードの例を示しています。

図9-5 viewControllerBundleノードの内容

例9-5 loadBundle要素のAMXコード・サンプル

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

9.2.4.4 メソッド式ビルダー

表9-3は、「プロパティ・インスペクタ」で「式ビルダー」オプションではなく「メソッド式ビルダー」オプションが提供されるプロパティを示しています。これらの唯一の違いは、メソッド式ビルダーが、選択されたプロパティに応じてマネージドBeanをフィルタして除外することです。

表9-3 編集可能な属性

プロパティ

要素

binding

actionListener

action

commandButton

actionListener

commandButton

action

commandLink

actionListener

commandLink

action

listItem

actionListener

listItem

valueChangeListener

inputDate

valueChangeListener

inputNumberSlider

valueChangeListener

inputText

valueChangeListener

selectBooleanCheckbox

valueChangeListener

selectBooleanSwitch

valueChangeListener

selectManyCheckbox

valueChangeListener

selectManyChoice

valueChangeListener

selectOneButton

valueChangeListener

selectOneChoice

valueChangeListener

selectOneRadio

moveListener

listView

9.2.4.5 非ELプロパティ

表9-4は、ELに対応していないため「プロパティ・インスペクタ」でEL式ビルダーオプションが提供されないプロパティを示しています。

表9-4 非ELプロパティ

プロパティ

要素

name

facet

var

iterator

var

listView

var

loadBundle

group

validationBehavior

9.3 バインディング・レイヤー・コンポーネントの理解

ADFモバイル・ランタイムでは、default動作(例9-6を参照)を使用して特定の操作のアクションを起動します。これは、ページがロードされた後(最初のロードのみではありません)、そのページを繰り返し表示するときに、アクションをコールする必要があるためです。

例9-6 ADFモバイルAMXのinvokeAction

<invokeAction id="callSetCurrentRowWithKeyValue"
Binds="setCurrentRowWithKeyValue"
Refresh="default"
RefreshCondition="#{requestScope.partyId != null}"/>

認識されるRefresh属性の値とそれらの意味については、表9-5「Refreshの値と対応する起動条件」を参照してください。

ADFモバイル・ランタイムでは、実行可能ファイルを起動するための通知の発行に関する次の条件を検出できます。

- A: 毎回のページの表示

- B: モデルの状態を変更するアクションの発生(属性値の設定や新しい行へのナビゲートなど)

ランタイムでは、invokeActionを、前述の条件に基づき、そのRefreshおよびRefreshCondition属性の値(表9-5「Refreshの値と対応する起動条件」にリストされています)に従って実行します。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のRefreshプロパティの正しい使用方法に関する項を参照してください。

表9-5 Refreshの値と対応する起動条件

Refreshの値

起動条件

always: バインディング・コンテナの状態にかかわらず、ページがナビゲートされるたびにinvokeActionを起動します。ランタイムのライフサイクルの観点から言えば、これはsetContextメッセージが毎回送信されるときになります。

AおよびB

deferred: ページにナビゲートし、そのバインディングがロードおよび初期化されたときにinvokeActionを起動します。ランタイムのライフサイクルの観点から言えば、これはバインディング・コンテナを初期化するsetContextメッセージが毎回送信されるときになります。その後のページへのナビゲーションでバインディングがリロードされない場合、アクションは起動しません。デフォルトの動作です。

A

default: デフォルトでは常にdeferredに設定されます。

A

RefreshCondition式が提供された場合、その式はinvokeActionが実行される可能性が生じるたびに評価されます。falseと評価された場合、その発生に対する実行はスキップされます。

注意:

イテレータ実行可能ファイルの場合は、deferredが標準の動作です。イテレータでは、依存するEL式が評価されるまで最初のRefreshを実行しません。ページ定義ファイルのinvokeAction実行可能ファイルのrefresh属性の値はデフォルト(deferred)以外である必要があります。デフォルト値では、リフレッシュおよび起動されません。

ADFモバイルにおけるバインディングの使用の詳細は、次の項を参照してください。

- 第7.3.2.4.4項「生成されるバインディングについて」

- 第7.3.2.4.6項「ADFモバイルAMXエディタの「バインディング」タブの使用」

- 第7.3.2.4.7項「未使用のバインディングの削除について」

9.3.1 順序付け

デフォルトで、同じRefreshの値を使用して宣言されたinvokeActionは、pagedefで宣言された順序で実行されます。

注意:

先行者が実行されるかどうかは、それぞれのRefreshおよびRefreshConditionの値に基づいて決まります。

9.3.2 ADFモバイルAMXページのELバインディングの検証

ADFモバイルで、ADFモバイルAMXページのELバインディングの検証は、Oracle ADFと同じように動作するJSFページのELの検証と同じメカニズムを使用します。ELの構成はページ・バインディングに対して検証され、メソッドの参照はマネージドBeanに対して検証されます。

検証の詳細は、第9.6項「検証の実行」を参照してください。

9.4 Beanデータ・コントロールの作成と使用

Java Beanデータ・コントロールでは、POJO (Plain Old Java Object)から自身のデータ構造を取得します。Java Beanデータ・コントロールを作成するには、(「アプリケーション」ウィンドウで)Javaクラス・ファイルを右クリックし、「データ・コントロールの作成」を選択します。Beanデータ・コントロールの作成は、EJBデータ・コントロールの作成と非常によく似ています。

注意:

Java Beanがバックグラウンド・スレッドを使用してUI内のデータを更新する場合、手動でoracle.adfmf.framework.api.AdfmfJavaUtilities.flushDataChangeEventをコールする必要があります。flushDataChangeEventメソッドの詳細は、第9.7項「データ変更イベント」を参照してください。

詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のFusion Webアプリケーションのデータ・コントロールに関する項と『Oracle Fusion Middleware Oracle Application Development Framework Java EE開発者ガイド』のADFデータ・コントロールを使用したビジネス・サービスの公開に関する項を参照してください。

9.4.1 Beanクラス変数のシリアライズについて

ADFモバイルでは、一時変数として宣言されたJavaScript Object Notation (JSON)データBeanクラス変数にはシリアライズしません。一連のネストされたオブジェクトをシリアライズしないようにするには、それらを一時オブジェクトとして定義する必要があります。この方法を使用すると、オブジェクトのネストが原因で循環オブジェクトが作成されるのを防ぐこともできます。

次のシナリオを考えてみましょう。Employeeオブジェクトが、その子として従業員の上司を表すEmployeeオブジェクトを保持しているとします。その子を一時オブジェクトとして宣言しなかった場合、実行時に子のEmployeeオブジェクトを計算しようとすると、一連のネストされたシリアライズ・オブジェクトが作成されます。

ADFモバイルでは、GregorianCalendarクラスのオブジェクトのシリアライズがサポートされません。JSONBeanSerializationHelperクラスでは、GregorianCalendarクラスのオブジェクトをシリアライズできません。これは、GregorianCalendarクラスに循環参照が含まれるためです。かわりに、java.util.Dateまたはjava.sql.Dateをデータ操作に使用します。次の例は、java.util.Dateを使用してGregorianCalendarオブジェクトを変換する方法を示しています。

Calendar calDate = new GregorianCalendar();
calDate.set(1985, 12, 1); // "January 1, 1986"
Date date = calDate.getTime();

9.5 DeviceFeaturesデータ・コントロールの使用方法

ADFモバイルでは、アプリケーション内でDeviceFeaturersデータ・コントロールを通じて使用できるデバイス固有の機能が公開されます。DeviceFeaturersデータ・コントロールは、新しいADFモバイル・アプリケーションを作成するときに「データ・コントロール」パネルに表示されるコンポーネントです。PhoneGap Java APIは、このデータ・コントロールを通じて抽象化されます。これにより、ADFモバイルAMXとして実装されたアプリケーション機能から、デバイスに埋め込まれた様々なサービスにアクセスできるようになります。DeviceFeaturesデータ・コントロールから提供される操作をADFモバイルAMXページ内にドラッグ・アンド・ドロップすることによって、デバイスに格納されたユーザーのコンタクト先を管理する機能の追加、電子メール・メッセージとSMSテキスト・メッセージの両方の作成と送信、デバイスの位置の確認、デバイスのカメラの使用およびデバイスのファイル・システムに格納されたイメージの取得を行うことができます。次の項では、これらの操作を宣言的に使用する方法や、JavaコードとJavaScriptを使用して実装する方法など、各操作について詳しく説明します。

図9-6 「概要」エディタでのADFモバイルのDeviceFeaturesデータ・コントロール

ADFモバイル・アプリケーション・テンプレートを使用してアプリケーションを作成すると、自動的にDeviceFeaturesデータ・コントロールが「データ・コントロール」パネルに表示されます。図9-6は、「概要」エディタに表示されたDeviceFeaturesデータ・コントロールを示しています。次のメソッドを使用できます。

- createContact

- findContacts

- getPicture

- removeContact

- sendEmail

- sendSMS

- startLocationMonitor

- updateContact

ページを作成したら、DeviceFeaturesデータ・コントロールのメソッド(またはそれらのメソッド内にネストされたその他のオブジェクト)を「データ・コントロール」パネルから「ADFモバイルAMX」ビューにドラッグして、関連する機能にバインドされたコマンド・ボタンやその他のコンポーネントを作成できます。デフォルトのバインディングを受け入れるか、ELを使用してそれらのバインディングを変更できます。また、JavaScriptやJavaを使用して、機能を実装または構成することもできます。

DeviceManagerは、デバイスの機能へのアクセスを可能にするオブジェクトです。このオブジェクトのハンドルは、DeviceManagerFactory.getDeviceManagerをコールすることによって取得できます。次の項では、DeviceManagerオブジェクトを使用してgetPictureやcreateContactなどのメソッドを起動する方法について説明します。

データ・コントロールをADFモバイル・アプリケーションに含める方法については、第7.3.2.4項「データ・コントロールのビューへの追加」を参照してください。

9.5.1 getPictureメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるgetPictureメソッドをADFモバイル・アプリケーションで使用すると、デバイスのカメラとフォト・ライブラリを活用し、エンド・ユーザーが写真を撮影したり、既存のイメージを取得できるようにすることが可能です。例9-7は、エンド・ユーザーがデバイスのカメラを使用して写真を撮影することを可能にするJavaScriptコードを示しています。例9-8と例9-9は、エンド・ユーザーが写真を撮影したり、保存済イメージを取得することを可能にするJavaコードを示しています。getPictureメソッドについては、ADFモバイルJavadocのDeviceDataControlクラスおよびPhoneGapのドキュメント(http://www.phonegap.com/home)を参照してください。

次のパラメータによって、イメージの取得元と、そのイメージを戻す方法が制御されます。

- quality: 保存済イメージの質を設定します。範囲は1から100(100を含む)です。大きい数値を指定すると質は高くなりますが、ファイル・サイズも増大します。JPEGイメージ(encodingTypeで指定します)にのみ適用されます。

- destinationType: 戻り値の形式を次から選択します。

- DeviceManager.CAMERA_DESTINATIONTYPE_DATA_URL (0): Base64でエンコードされた文字列としてイメージを戻します。この値は、プログラムで使用される場合、DeviceManager.CAMERA_DESTINATION_DATA_URLを使用する列挙としても指定されます。

- DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URI (1): イメージ・ファイルのパスを戻します。この値は、プログラムで使用される場合、DeviceManager.CAMERA_DESTINATION_FILE_URIを使用する列挙としても指定されます。

- sourceType: 写真のソースを次から選択して設定します。

- DeviceManager.CAMERA_SOURCETYPE_PHOTOLIBRARY (0): ユーザーは保存済のイメージから選択できます。この値は、プログラムで使用される場合、DeviceManager.CAMERA_SOURCETYPE_PHOTOLIBRARYを使用する列挙としても指定されます。

- DeviceManager.CAMERA_SOURCETYPE_CAMERA (1): ユーザーはデバイスのカメラを使用して写真を撮影できます。この値は、プログラムで使用される場合、DeviceManager.CAMERA_SOURCETYPE_CAMERAを使用する列挙としても指定されます。

- DeviceManager.CAMERA_SOURCETYPE_SAVEDPHOTOALBUM (2): ユーザーは既存のフォト・アルバムから選択できます。この値は、プログラムで使用される場合、DeviceManager.CAMERA_SOURCETYPE_SAVEDPHOTOALBUMを使用する列挙としても指定されます。

- allowEdit: 選択する前にイメージの単純な編集を許可するかどうかを選択します(ブール)。

- encodingType: 戻されるイメージ・ファイルのエンコーディングを次から選択します。

- DeviceManager.CAMERA_ENCODINGTYPE_JPEG (0): 戻されるイメージをJPEGファイルとしてエンコードします。この値は、プログラムで使用される場合、DeviceManager.CAMERA_ENCODINGTYPE_JPEGを使用する列挙としても指定されます。

- DeviceManager.CAMERA_ENCODINGTYPE_PNG (1): 戻されるイメージをPNGファイルとしてエンコードします。この値は、プログラムで使用される場合、DeviceManager.CAMERA_ENCODINGTYPE_PNGを使用する列挙としても指定されます。

- targetWidth: 幅をピクセル単位で設定してイメージのスケールを変更します。アスペクト比は維持されます。負の値または0の場合、イメージの元のディメンションが使用されます。

- targetHeight: 高さをピクセル単位で設定してイメージのスケールを変更します。アスペクト比は維持されます。負の値または0の場合、イメージの元のディメンションが使用されます。

DeviceFeaturesデータ・コントロールを使用してgetPicture操作をカスタマイズするには:

1. 「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからgetPicture操作をドラッグし、ADFモバイルのボタンとしてページにドロップします。
ユーザーがよりきめ細かく制御できるようにするには、getPicture操作をADFモバイルのパラメータ・フォームとしてドロップします。これにより、エンド・ユーザーは写真を撮影したり既存のイメージを選択する前に、設定を指定できるようになります。

2. アクションの編集ダイアログで、前述のすべてのパラメータの値を設定します。イメージがファイル名として戻されるように、destinationType = 1を指定するようにします。

3. getPictureの戻り値をドラッグし、それを出力テキストとしてページ上にドロップします。

4. 「共通コンポーネント」パネルで、「コンポーネント・パレット」から「イメージ」をドラッグし、ページ上にドロップします。

5. イメージのsource属性を、getPicture操作の戻り値に設定します。バインディングの式は、#{bindings.Return.inputValue}である必要があります。

図9-7は、エンド・ユーザーのフォト・ライブラリからイメージを表示するためのバインディングを示しています。

図9-7 デザインタイムでフォト・ライブラリからイメージを表示するためのバインディング

このアプリケーションを実行すると、イメージ・チューザが自動的に表示され、エンド・ユーザーは表示するイメージを選択できます。イメージ・チューザが自動的に表示される理由は、イメージ・コントロールがgetPicture操作の戻り値にバインドされており、それによってgetPicture操作が起動するためです。

次に示すプラットフォーム固有の問題に留意してください。

- iOS

- いくつかのデバイスでメモリー・エラーが発生しないようにするには、qualityを50未満に設定します。

- destinationType FILE_URIを使用すると、写真はアプリケーションの一時ディレクトリに保存されます。

- アプリケーションの一時ディレクトリの内容は、アプリケーションの終了時に削除されます。記憶域の空き領域が問題になる場合は、navigator.fileMgr APIを使用してこのディレクトリの内容を削除することもできます。

- targetWidthとtargetHeightを使用するには、これらを両方とも指定する必要があります。一方または両方の値が負の値または0の場合、イメージの元のディメンションが使用されます。

- Android

- allowEditパラメータを無視します。

- Camera.PictureSourceType.PHOTOLIBRARYとCamera.PictureSourceType.SAVEDPHOTOALBUMでは、どちらも同じフォト・アルバムが表示されます。

- Camera.EncodingTypeはサポートされていません。パラメータは無視され、常にJPEGイメージが生成されます。

- targetWidthとtargetHeightは、個別に指定できます。一方のパラメータが正の値で、もう一方が負の値またはゼロを使用して元のサイズを表す場合、正の値がそのディメンションに使用され、もう一方のディメンションは元のアスペクト比を維持するようにスケール変更されます。

- destinationType DATA_URLを使用すると、イメージが大きい場合は使用可能なメモリーがすべて使用され、メモリー不足のエラーが発生する場合があります。通常は、デフォルトのイメージ・サイズを使用すると、この動作が発生します。targetWidthとtargetHeightを設定してイメージ・サイズを制限します。

例9-7は、ユーザーがデバイスのカメラを使用して写真を撮影することを可能にするJavaScriptコードを示しています。結果は、保存済イメージへのフルパスになります。

例9-7 getPictureのJavaScriptコード例

// The camera, like many other device-specific features, is accessed
// from the global 'navigator' object in JavaScript.
// Note that in the PhoneGap JavaScript APIs, the parameters are passed
// in as a dictionary, so it is only necessary to provide key-value pairs
// for the parameters you want to specify.

navigator.camera.getPicture(onSuccess, onFail, { quality: 50,

function onSuccess(imageURI) {
var image = document.getElementById('myImage');
image.src = imageURI;
}
function onFail(message) {
alert('Failed because: ' + message);
}

例9-8は、ユーザーがデバイスのカメラを使用して写真を撮影することを可能にするJavaコードを示しています。結果は、保存済イメージへのフルパスになります。

例9-8 getPictureを使用して写真を撮影するためのJavaコード例

import oracle.adf.model.datacontrols.device;

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Take a picture with the device's camera.
// The result will be the full path to the saved PNG image.
String imageFilename = DeviceManagerFactory.getDeviceManager().getPicture(100,
DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URI,
DeviceManager.CAMERA_SOURCETYPE_CAMERA, false,
DeviceManager.CAMERA_ENCODINGTYPE_PNG, 0, 0);

例9-9は、ユーザーが保存済イメージを取得することを可能にするJavaコードを示しています。結果は、Base64でエンコードされたJPEGになります。

例9-9 getPictureを使用してイメージを取得するためのJavaコード例

import oracle.adf.model.datacontrols.device;

// Retrieve a previously-saved image. The result will be a base64-encoded JPEG.
String imageData = DeviceManagerFactory.getDeviceManager().getPicture(100,
DeviceManager.CAMERA_DESTINATIONTYPE_FILE_URL,
DeviceManager.CAMERA_SOURCETYPE__PHOTOLIBRARY, false,
DeviceManager.CAMERA_ENCODINGTYPE_JPEG, 0, 0);

9.5.2 SendSMSメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるsendSMSメソッドをADFモバイル・アプリケーションで使用すると、デバイスのショート・メッセージ・サービス(SMS)テキスト・メッセージング・インタフェースを活用し、エンド・ユーザーがSMSメッセージを送受信できるようにすることが可能です。ADFモバイルでは、デバイスのSMSインタフェースを表示し、必要に応じて次のフィールドに事前にデータを移入できます。

- to: 受信者をリストします(カンマ区切り)。

- body: メッセージの本文を追加します。

SMSテキスト・メッセージング・インタフェースが表示されたら、エンド・ユーザーはSMSを送信するか、それを取り消すことができます。デバイスとキャリアの制限により、SMSは自動的に送信できません。実際にSMSを送信できるのは、エンド・ユーザーのみです。

DeviceFeaturesデータ・コントロールを使用してsendSMS操作をカスタマイズするには:

SMSの送信のためページに対話型フォームを表示するには、sendSMS操作を「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからドラッグし、ページ・デザイナ上にADFモバイルのパラメータ・フォームとしてドロップします。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。実行時に、アプリケーション・ユーザーが前述の様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンを使用すると、デバイスのSMSインタフェースを表示できます。このインタフェースには、指定したすべてのフィールドに事前に値が移入され、送信準備が整ったSMSが表示されます。

図9-8は、ページ上の編集可能なフォームを使用してSMSを送信するためのバインディングを示しています。

図9-8 デザインタイムで編集可能なフォームを使用してSMSを送信するためのバインディング

例9-10と例9-11は、エンド・ユーザーがデバイスのテキスト・メッセージング・インタフェースを使用してSMSメッセージを送信することを可能にするコード例を示しています。

sendSMSメソッドについては、ADFモバイルJavadocのDeviceDataControlクラスおよびPhoneGapのドキュメント(http://www.phonegap.com/home)を参照してください。

例9-10 sendSMSのJavaScriptコード例

adf.mf.api.sendSMS({to: "5551234567", body: "This is a test message"});

例9-11 sendSMSのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Send an SMS to the phone number "5551234567"
DeviceManagerFactory.getDeviceManager().sendSMS("5551234567", "This is a test message");

9.5.3 sendEmailメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるsendEmailメソッドをADFモバイル・アプリケーションで使用すると、デバイスの電子メール・メッセージング・インタフェースを活用し、エンド・ユーザーが電子メール・メッセージを送受信できるようにすることが可能です。ADFモバイルでは、デバイスの電子メール・インタフェースを表示し、必要に応じて次のフィールドに事前にデータを移入できます。

- to: 受信者をリストします(カンマ区切り)。

- cc: CC受信者をリストします(カンマ区切り)。

- subject: メッセージの件名を追加します。

- body: メッセージの本文を追加します。

- bcc: BCC受信者をリストします(カンマ区切り)。

- attachments: 電子メールに添付するファイルの名前をリストします(カンマ区切り)。

- mimeTypes: 添付ファイルに使用するMIMEタイプをリストします(カンマ区切り)。ADFモバイルで自動的にMIMEタイプを決定するには、nullを指定します。例9-12と例9-13のように、選択した添付ファイルのMIMEタイプのみを指定することもできます。

デバイスの電子メール・インタフェースが表示されたら、ユーザーは電子メールを送信するか、それを取り消すことができます。デバイスとキャリアの制限により、電子メールは自動的に送信できません。実際に電子メールを送信できるのは、エンド・ユーザーのみです。また、電子メールを送信するには、1つ以上の電子メール・アカウントを構成する必要があります。アカウントが構成されていない場合、電子メール・アカウントが見つからないことを示すエラーが表示されます。

DeviceFeaturesデータ・コントロールを使用してsendEmail操作をカスタマイズするには:

JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからsendEmail操作をページ・デザイナ上にドラッグし、ADFモバイルのパラメータ・フォームとしてドロップします。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。実行時に、アプリケーション・ユーザーが前述の様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンを使用すると、デバイスの電子メール・インタフェースを表示できます。このインタフェースには、指定したすべてのフィールドに事前に値が移入され、送信準備が整った電子メールが表示されます。

図9-9は、ページ上の編集可能なフォームを使用して電子メールを送信するためのバインディングを示しています。

図9-9 デザインタイムで編集可能なフォームを使用して電子メールを送信するためのバインディング

例9-12と例9-13は、エンド・ユーザーがデバイスの電子メール・インタフェースを使用して電子メール・メッセージを送信することを可能にするコード例を示しています。

sendEmailメソッドについては、ADFモバイルJavadocのDeviceDataControlクラスおよびPhoneGapのドキュメント(http://www.phonegap.com/home)を参照してください。

例9-12 sendEmailのJavaScriptコード例

// Populate an email to 'ann.li@corp.example.com',
// copy 'joe.jones@corp.example.com', with the
// subject 'Test message', and the body 'This is a test message'
// No BCC recipients or attachments
adf.mf.api.sendEmail({to: "ann.li@corp.example.com",
cc: "joe.jones@corp.example.com",
subject: "Test message",
body: "This is a test message"});

// Populate the same email as before, but this time, also BCC
// 'john.smith@corp.example.com' & 'jane.smith@corp.example.com' and attach two files.
// By not specifying a value for the mimeTypes parameter, you are telling
// ADFMobile to automatically determine the MIME type for each of the attachments.
adf.mf.api.sendEmail({to: "ann.li@corp.example.com",
cc: "joe.jones@corp.example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@corp.example.com,jane.smith@corp.example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});

// For iOS only: Same as previous email, but this time, explicitly specify
// all the MIME types.
adf.mf.api.sendEmail({to: "ann.li@corp.example.com",
cc: "joe.jones@corp.example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@corp.example.com,jane.smith@corp.example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});
mimeTypes: "text/plain,image/png"});

// For iOS only: Same as previous email, but this time, only specify
// the MIME type for the second attachment and let the system determine
// the MIME type for the first one.
adf.mf.api.sendEmail({to: "ann.li@corp.example.com",
cc: "joe.jones@corp.example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@corp.example.com,jane.smith@corp.example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});
mimeTypes: ",image/png"});

// For Android only: Same as previous e-mail, but this time, explicitly specify
// the MIME type.
adf.mf.api.sendEmail({to: "ann.li@corp.example.com",
cc: "joe.jones@corp.example.com",
subject: "Test message",
body: "This is a test message"});
bcc: "john.smith@corp.example.com,jane.smith@corp.example.com",
attachments: "path/to/file1.txt,path/to/file2.png"});
mimeTypes: "image/*"});
// You can also use "plain/text" as the MIME type as it just determines the type
// of applications to be filtered in the application chooser dialog.

例9-13 sendEmailのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Populate an email to 'ann.li@corp.example.com', copy 'joe.jones@corp.example.com', with the
// subject 'Test message', and the body 'This is a test message'.
// No BCC recipients or attachments.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@corp.example.com",
"joe.jones@corp.example.com",
"Test message",
"This is a test message",
null,
null,
null);

// Populate the same email as before, but this time, also BCC
// 'john.smith@corp.example.com' & 'jane.smith@corp.example.com' and attach two files.
// By specifying null for the mimeTypes parameter, you are telling
// ADFMobile to automatically determine the MIME type for each of the attachments.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@corp.example.com",
"joe.jones@corp.example.com",
"Test message",
"This is a test message",
"john.smith@corp.example.com,jane.smith@corp.example.com",
"path/to/file1.txt,path/to/file2.png",
null);

// Same as previous email, but this time, explicitly specify all the MIME types.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@corp.example.com",
"joe.jones@corp.example.com",
"Test message",
"This is a test message",
"john.smith@corp.example.com,jane.smith@corp.example.com",
"path/to/file1.txt,path/to/file2.png",
"text/plain,image/png");

// Same as previous email, but this time, only specify the MIME type for the
// second attachment and let the system determine the MIME type for the first one.
DeviceManagerFactory.getDeviceManager().sendEmail(
"ann.li@corp.example.com",
"joe.jones@corp.example.com",
"Test message",
"This is a test message",
"john.smith@corp.example.com,jane.smith@corp.example.com",
"path/to/file1.txt,path/to/file2.png",
",image/png");

9.5.4 createContactメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるcreateContactメソッドをADFモバイル・アプリケーションで使用すると、デバイスのコンタクト先を管理するためのインタフェースとファイル・システムを活用し、エンド・ユーザーが新しいコンタクト先を作成してデバイスのアドレス帳に保存できるようにすることが可能です。ADFモバイルでは、デバイスのインタフェースを表示し、必要に応じてContactのフィールドに事前にデータを移入できます。例9-14のように、createContactメソッドはContactオブジェクトをパラメータとして使用し、作成されたContactオブジェクトを戻します。createContactメソッドとContactオブジェクトについては、ADFモバイルJavadocのDeviceDataControlクラスおよびPhoneGapのドキュメント(http://www.phonegap.com/home)を参照してください。Contactのフィールドについては、第9.5.5項「findContactsメソッドの使用方法」も参照してください。

DeviceFeaturesデータ・コントロールを使用してcreateContact操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからcreateContact操作をドラッグし、ADFモバイルのリンク、ボタンまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、createContact操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してcreateContact操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが様々なContactのフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してcreateContact操作を実行できます。

2. 戻されたContactオブジェクトを「データ・コントロール」パネルにあるcreateContact操作の下からドラッグし、ADFフォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。createContact操作を実行すると、結果がこのフォームに表示されます。

例9-14と例9-15は、エンド・ユーザーがデバイスにコンタクト先を作成することを可能にするコード例を示しています。

例9-14 createContactのJavaScriptコード例

// Contacts, like many other device-specific features, are accessed from the global 'navigator' object in JavaScript.
var contact = navigator.contacts.create();

var name = new ContactName();
name.givenName = "GivenName";
name.familyName = "FamilyName";

contact.name = name;

// Store contact phone numbers in ContactField[]
var phoneNumbers = [1];
phoneNumbers[0] = new ContactField('home', '650-111-2222', true);

contact.phoneNumbers = phoneNumbers;

// Store contact phone numbers in ContactField[]
var emails = [1];
emails[0] = new ContactField('work', 'first.given@oracle.com');

contact.emails = emails;

// Save
contact.save(onSuccess, onFailure);

function onSuccess()
{
alert("Create Contact successful.");
}

function onFailure(Error)
{
alert("Create Contact failed: " + Error.code);
}

例9-15 createContactのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

import oracle.adfmf.framework.contract.adf.ContactAddresses;
import oracle.adfmf.framework.contract.adf.ContactField;
import oracle.adfmf.framework.contract.adf.ContactName;

String givenName = "GivenName";
String familyName = "FamilyName";
String note = "Just a Note";
String phoneNumberType = "mobile";
String phoneNumberValue = "650-000-1234";
String phoneNumberNewValue = "650-111-1234";
String emailType = "home";
String emailTypeNew = "work";
String emailValue = "first.given@oracle.com";
String addressType = "home";
String addressStreet = "500 Oracle Pkwy";
String addressLocality = "Redwood Shores";
String addressCountry = "USA";
String addressPostalCode = "94065";
ContactField[] phoneNumbers = null;
ContactField[] emails = null;
ContactAddresses[] addresses = null;
ContactField[] emails = null;

/*
* Create contact
*/
Contact aContact = new Contact();

ContactName name = new ContactName();
name.setFamilyName(familyName);
name.setGivenName(givenName);
aContact.setName(name);

ContactField phoneNumber = new ContactField();
phoneNumber.setType(phoneNumberType);
phoneNumber.setValue(phoneNumberValue);

phoneNumbers = new ContactField[] { phoneNumber };

ContactField email = new ContactField();
email.setType(emailType);
email.setValue(emailValue);

emails = new ContactField[] { email };

ContactAddresses address = new ContactAddresses();
address.setType(addressType);
address.setStreetAddress(addressStreet);
address.setLocality(addressLocality);
address.setCountry(addressCountry);

addresses = new ContactAddresses[] { address };

aContact.setNote(note);
aContact.setPhoneNumbers(phoneNumbers);
aContact.setEmails(emails);
aContact.setAddresses(addresses);

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
// Invoking the createContact method, using the DeviceDataControl object.
Contact createdContact = DeviceManagerFactory.getDeviceManager()
.findContacts.createContact(aContact);

9.5.5 findContactsメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるfindContactsメソッドをADFモバイル・アプリケーションで使用すると、デバイスのコンタクト先を管理するためのインタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳から1つ以上のコンタクト先を検索できるようにすることが可能です。ADFモバイルでは、デバイスのインタフェースを表示し、必要に応じてfindContactsのフィールドに事前にデータを移入できます。findContactsメソッドでは、フィルタ文字列と検索する(そして、見つかったコンタクト先の一部として戻す)フィールド名のリストを使用します。フィルタ文字列には、コンタクト先内の検索する任意の項目を指定できます。findContactsメソッドの詳細は、ADFモバイルJavadocのDeviceDataControlクラスおよびPhoneGapのドキュメント(http://www.phonegap.com/home)を参照してください。

findContacts操作では、次の引数を使用します。

- contactFields: 必須パラメータ。このパラメータは、findContacts操作によって生成されるContactオブジェクトに含めるフィールドを指定するために使用します。フィールドはカンマで区切ります(スペースの有無は関係ありません)。

- filter: コンタクト先をフィルタするために使用する検索文字列。(文字列) (デフォルト: "")

- multiple: findContacts操作から複数のコンタクト先を戻すかどうかを決定します。(ブール) (デフォルト: false)

注意:

次のリストに含まれていないフィールド名を渡すと、findContacts操作の戻り値がnullになる場合があります。また、Contactのフィールドの引数に指定したフィールドのみが、Contactオブジェクトの一部として戻されます。

次のリストに示すContactのフィールドを渡して、検索に使用し、見つかったコンタクト先の一部として戻すことができます。

- id: グローバルに一意な識別子

- displayName: エンド・ユーザーへの表示に適した、このコンタクト先の名前

- name: 人物名のすべてのコンポーネントを含むオブジェクト

- nickname: コンタクト先のカジュアルな名前

- phoneNumbers: コンタクト先のすべての電話番号の配列

- emails: コンタクト先のすべての電子メール・アドレスの配列

- addresses: コンタクト先のすべての住所の配列

- ims: すべてのインスタント・メッセージング(IM)アドレスの配列

- organizations: コンタクト先のすべての組織の配列

- revision: コンタクト先が最後に訂正された日付

- birthday: コンタクト先の誕生日

- gender: コンタクト先の性別

- note: コンタクト先に関するメモ

- photos: コンタクト先の写真の配列

- urls: コンタクト先に関連付けられたWebページの配列

DeviceFeaturesデータ・コントロールを使用してfindContacts操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからfindContacts操作をドラッグし、ADFモバイルのリンク、ボタンまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、findContacts操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してfindContacts操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが前述のContactの様々なフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してfindContacts操作を実行できます。

2. 戻されたContactオブジェクトを「データ・コントロール」パネルにあるfindContacts操作の下からドラッグし、ADFフォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。findContacts操作を実行すると、結果がこのフォームに表示されます。

例9-16は、findContactsメソッドに指定できる引数値を示しています。例9-17と例9-18は、姓でコンタクト先を検索し、コンタクト先の名前、電話番号、電子メール、住所およびメモを取得する方法を示しています。

例9-16 findContactsに指定できる引数値

// This will return just one contact with only the ID field:
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts("", "", false);

// This will return all contacts with only ID fields:
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts("", "", true);

// This will return just one contact with all fields:
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts("*", "", false);

// This will return all contacts with all fields:
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts("*", "", true);

// These will throw an exception as contactFields is a required argument and cannot be null:
DeviceManagerFactory.getDeviceManager().findContacts(null, "", false);
DeviceManagerFactory.getDeviceManager().findContacts(null, "", true);

// These will throw an exception as the filter argument cannot be null:
DeviceManagerFactory.getDeviceManager().findContacts("", null, false);
DeviceManagerFactory.getDeviceManager().findContacts("", null, true);

注意:

渡されるContactのフィールドは、文字列(カンマで区切られたフィールドを含む)です。いずれかの引数がnullとしてメソッドに渡された場合、ADFの例外がスローされます。

例9-17 findContactsのJavaScriptコード例

var filter = ["name", "phoneNumbers", "emails", "addresses", "note"];

var options = new ContactFindOptions();
options.filter="FamilyName";

// Contacts, like many other device-specific features, are accessed from
// the global 'navigator' object in JavaScript.
navigator.contacts.find(filter, onSuccess, onFail, options);

function onSuccess(contacts)
{
alert ("Find Contact call succeeded! Number of contacts found = " + contacts.length);
}

function onFail(Error)
{
alert("Find Contact failed: " + Error.code);
}

例9-18 findContactsのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

/*
* Find Contact - Find contact by family name.
*
* See if we can find the contact that we just created.
*/

String familyName = "FamilyName"

// Access device features in Java code by acquiring an instance of the
// DeviceManager from the DeviceManagerFactory.
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts(
"name,phoneNumbers,emails,addresses,note", familyName, true);

9.5.6 updateContactメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるupdateContactメソッドをADFモバイル・アプリケーションで使用すると、コンタクト先を管理するためにデバイスのインタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳に含まれるコンタクト先を更新できるようにすることが可能です。ADFモバイルでは、デバイスのインタフェースを表示し、必要に応じてupdateContactのフィールドに事前にデータを移入できます。例9-19のように、updateContactメソッドはContactオブジェクトをパラメータとして使用し、更新されたContactオブジェクトを戻します。

注意:

入力パラメータとして必要なContactオブジェクトは、第9.5.5項「findContactsメソッドの使用方法」の説明に従ってfindContactsメソッドを使用することによって検索できます。nullのContactオブジェクトがメソッドに渡された場合、ADFの例外がスローされます。

DeviceFeaturesデータ・コントロールを使用してupdateContact操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからupdateContact操作をドラッグし、ADFモバイルのリンク、ボタンまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、updateContact操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してupdateContact操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが様々なContactのフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してupdateContact操作を実行できます。

2. 戻されたContactオブジェクトを「データ・コントロール」パネルにあるupdateContact操作の下からドラッグし、ADFフォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。updateContact操作を実行すると、結果がこのフォームに表示されます。

例9-19と例9-21は、コンタクト先の電話番号を更新する方法を示しています。例9-20と例9-22は、コンタクト先に別の電話番号を追加する方法を示しています。

updateContactメソッドとContactオブジェクトについては、ADFモバイルJavadocのDeviceDataControlクラスおよびPhoneGapのドキュメント(http://www.phonegap.com/home)を参照してください。Contactのフィールドについては、第9.5.5項「findContactsメソッドの使用方法」も参照してください。

例9-19 updateContactのJavaScriptコード例

function updateContact(contact)
{
try
{
if (null != contact.phoneNumbers)
{
alert("Number of phone numbers = " + contact.phoneNumbers.length);
var numPhoneNumbers = contact.phoneNumbers.length;
for (var j = 0; j < numPhoneNumbers; j++)
{
alert("Type: " + contact.phoneNumbers[j].type + "\n" +
"Value: "  + contact.phoneNumbers[j].value + "\n" +
"Preferred: "  + contact.phoneNumbers[j].pref);

contact.phoneNumbers[j].type = "mobile";
contact.phoneNumbers[j].value = "408-123-4567";
}

// save
contact.save(onSuccess, onFailure);
}
else
{
//alert ("No phone numbers found in the contact.");
}
}
catch(e)
{
alert("updateContact - ERROR: " + e.description);
}
}

function onSuccess()
{
alert("Update Contact successful.");
}

function onFailure(Error)
{
alert("Update Contact failed: " + Error.code);

例9-20は、既存の電話番号に別の電話番号を追加する方法を示しています。

例9-20 updateContactを使用して電話番号を追加するためのJavaScriptコード例

function updateContact(contact)
{
try
{
var phoneNumbers = [1];
phoneNumbers[0] = new ContactField('home', '650-111-2222', true);
contact.phoneNumbers = phoneNumbers;

// save
contact.save(onSuccess, onFailure);
}
catch(e)
{
alert("updateContact - ERROR: " + e.description);
}
}

function onSuccess()
{
alert("Update Contact successful.");
}

function onFailure(Error)
{
alert("Update Contact failed: " + Error.code);
}

例9-21は、コンタクト先の電話番号、電子メール・タイプおよび郵便番号を更新する方法を示しています。

例9-21 updateContactのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

/*
* Update Contact - Updating phone number, email type, and adding address postal code
*/
String familyName = "FamilyName";
String phoneNumberNewValue = "650-111-1234";
String emailTypeNew = "work";
String addressPostalCode = "94065";

Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts(
"name,phoneNumbers,emails,addresses,note", familyName, true);

// Assuming there was only one contact returned, we can use the first contact in the array.
// If more than one contact is returned then we have to filter more to find the exact contact
// we need to update.

foundContacts[0].getPhoneNumbers()[0].setValue(phoneNumberNewValue);
foundContacts[0].getEmails()[0].setType(emailTypeNew);
foundContacts[0].getAddresses()[0].setPostalCode(addressPostalCode);

Contact updatedContact = DeviceManagerFactory.getDeviceManager().updateContact(foundContacts[0]);

例9-22は、既存の電話番号に別の電話番号を追加する方法を示しています。

例9-22 updateContactを使用して電話番号を追加するためのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

String additionalPhoneNumberValue = "999-888-0000";
String additionalPhoneNumberType = "mobile";
// Create a new phoneNumber that will be appended to the previous one.
ContactField additionalPhoneNumber = new ContactField();
additionalPhoneNumber.setType(additionalPhoneNumberType);
additionalPhoneNumber.setValue(additionalPhoneNumberValue);

foundContacts[0].setPhoneNumbers(new ContactField[] { additionalPhoneNumber });

// Access device features in Java code by acquiring an instance of the DeviceManager
// from the DeviceManagerFactory.
Contact updatedContact = DeviceManagerFactory.getDeviceManager().updateContact(foundContacts[0]);

9.5.7 removeContactメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるremoveContactメソッドをADFモバイル・アプリケーションで使用すると、コンタクト先を管理するためのデバイスの・インタフェースとファイル・システムを活用し、エンド・ユーザーがデバイスのアドレス帳からコンタクト先を削除できるようにすることが可能です。ADFモバイルでは、デバイスのインタフェースを表示し、必要に応じてremoveContactのフィールドに事前にデータを移入できます。例9-23のように、removeContactメソッドはContactオブジェクトをパラメータとして使用します。

注意:

入力パラメータとして必要なContactオブジェクトは、第9.5.5項「findContactsメソッドの使用方法」の説明に従ってfindContactsメソッドを使用することによって検索できます。

DeviceFeaturesデータ・コントロールを使用してremoveContact操作をカスタマイズするには:

1. JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからremoveContact操作をドラッグし、ADFモバイルのリンク、ボタンまたはパラメータ・フォームとしてページ・デザイナ上にドロップします。
リンクまたはボタン: 「アクション・バインディングの編集」ダイアログが表示され、removeContact操作の引数の値を入力するよう求められます。実行時にページに表示されるボタンまたはリンクをクリックすると、入力した値を使用してremoveContact操作を実行できます。

パラメータ・フォーム: 「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズします。実行時に、アプリケーション・ユーザーが様々なContactのフィールドの値を入力できる、編集可能なフォームがページに表示されます。このフォームの下にあるボタンをクリックすると、入力した値を使用してremoveContact操作を実行できます。

2. 戻されたContactオブジェクトを「データ・コントロール」パネルにあるremoveContact操作の下からドラッグし、ADFフォームとしてページ上にドロップすることもできます。その後、「フォーム・フィールドの編集」ダイアログでフォームをカスタマイズできます。removeContact操作を実行すると、結果がこのフォームに表示されます。

例9-23と例9-24は、findContactsを使用して検索したコンタクト先を削除する方法を示しています。removeContactメソッドとContactオブジェクトについては、ADFモバイルJavadocのDeviceDataControlクラスおよびPhoneGapのドキュメント(http://www.phonegap.com/home)を参照してください。

例9-23 removeContactのJavaScriptコード例

// Remove the contact from the device
contact.remove(onSuccess,onError);

function onSuccess()
{
alert("Removal Success");
}

function onError(contactError)'
{
alert("Error = " + contactError.code);
}

例9-24 removeContactのJavaコード例

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;

/*
* Remove the contact from the device
*/
Contact[] foundContacts = DeviceManagerFactory.getDeviceManager().findContacts(
"name,phoneNumbers,emails,addresses", familyName, true);

// Assuming there is only one contact returned, we can use the first contact in the array.
// If more than one contact is returned we will have to filter more to find the
// exact contact we want to remove.

// Access device features in Java code by acquiring an instance of the DeviceManager
// from the DeviceManagerFactory.
DeviceManagerFactory.getDeviceManager().removeContact(foundContacts[0]);

9.5.8 startLocationMonitorメソッドの使用方法

DeviceFeaturesデータ・コントロールに含まれるstartLocationMonitorメソッドをADFモバイル・アプリケーションで使用すると、地理的位置機能を提供し、エンド・ユーザーがデバイスの場所を取得できるようにすることが可能です。ADFモバイルでは、デバイスのインタフェースを表示し、必要に応じてstartLocationMonitorのフィールドに事前にデータを移入できます。

ADFモバイルで公開されているAPIを使用すると、デバイスの現在の位置を取得できるため、特定の時点におけるデバイスの現在の位置を取得したり、定期的にその情報をサブスクライブできます。例9-25と例9-26は、アプリケーションでデバイスの位置の取得を可能にするコード例を示しています。startLocationMonitorメソッドについては、ADFモバイルJavadocのDeviceDataControlクラスおよびPhoneGapのドキュメント(http://www.phonegap.com/home)を参照してください。

DeviceFeaturesデータ・コントロールを使用してデバイスの位置の変更をリスニングするには:

JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからstartLocationMonitor操作をページ・デザイナ上にドラッグし、ADFモバイルのリンクまたはボタンとしてドロップします。アクションの編集ダイアログによって要求されたら、次のようにフィールドに値を移入します。

- enableHighAccuracy: trueの場合、位置の修正を最も正確に取得できるメソッドを使用します。これは単なるヒントであり、オペレーティング・システムでは考慮されない場合があります。多くの場合、デバイスには、携帯電話基地局の三角測量、Wi-Fiホットスポットの参照、実際のGPSなど、位置の修正を取得するためのいくつかの異なるメカニズムがあります。falseを指定すると、正確性の低い位置を受け入れることになりますが、この場合、レスポンスの速度が向上し、消費電力が低下する可能性があります。

- updateInterval: 更新の受信頻度をミリ秒単位で定義します。位置の更新は、指定した頻度では配信されない場合があります。オペレーティング・システムでは、デバイスの位置の大きな変更が検出されるまで待機してから、別の位置の更新をトリガーする場合があります。

- locationListener: 次のシグネチャを含むBeanメソッドに解決されるEL式。

void methodName(Location newLocation)

このEL式は、位置の更新を受信するたびに評価されます。たとえば、viewScope.LocationListenerBean.locationUpdated(#{}で囲みません)と入力した後、LocationListenerBeanというBeanをviewScope内に定義し、次のシグネチャを含むメソッドを実装します。

public void locationUpdated(Location currentLocation)
{
System.out.println(currentLocation);
// To stop subscribing to location updates, invoke the following:
// DeviceManagerFactory.getDeviceManager().clearWatchPosition(
//     currentLocation.getWatchId());
}

注意:

EL式の評価結果としてlocationListenerの名前が必要でないかぎり、locationListenerを指定するためにEL構文#{LocationListenerBean.locationUpdate}を使用しないでください。

例9-25は、デバイスの位置の変更を定期的にサブスクライブする方法を示しています。この例で使用するDeviceManager.startUpdatingPositionメソッドのパラメータは、次のとおりです。

- int updateInterval: 位置の更新の配信頻度をミリ秒単位で定義します。位置の更新は、指定した頻度では配信されない場合があります。オペレーティング・システムでは、デバイスの位置の大きな変更が検出されるまで待機してから、別の位置の更新をトリガーする場合があります。逆に言えば、位置の更新は指定した頻度で配信されることもありますが、デバイスの位置が大きく変更されるまで、配信される位置が変化しない場合があります。

- boolean enableHighAccuracy: trueに設定された場合、位置の修正を最も正確に取得できるメソッドを使用します。

- String watchID: 後から位置の更新のサブスクライブを停止するために使用できる一意のIDを定義します。

- GeolocationCallback: GeolocationCallbackインタフェースの実装。例9-25のように、この実装のlocationUpdatedメソッドは、位置が更新されるたびに起動されます。

JavaScriptを使用してデバイスの位置の変更をサブスクライブする方法の例は、PhoneGapのドキュメント(http://www.phonegap.com/home)を参照してください。

locationListenerによって指定されたコールバック関数内に戻されるパラメータは、次のとおりです。

- double getAccuracy: m単位の緯度と経度を示す座標の精度レベル。

- double getAltitude: m単位の楕円体高度。

- double getLatitude: 10進度単位の緯度。

- double getLongitude: 10進度単位の経度。

- double getAltitudeAccuracy: m単位の高度座標の精度レベル。

- double getHeading: 真北から時計回りに計測した度単位で示される進行方向

- double getSpeed: m/秒単位で指定される、デバイスの現在の対地速度

- long getTimestamp: Unixエポックからのミリ秒単位の経過時間で示されるタイムスタンプの作成

- String getWatchId: 定期的な位置の更新をサブスクライブするときのみ使用します。後から位置の更新のサブスクライブを停止するために使用できる一意のID

startLocationMonitorおよびstartHeadingMonitorメソッドの詳細は、ADFモバイルJavadocのDeviceDataControlクラスおよびPhoneGapのドキュメント(http://www.phonegap.com/home)を参照してください。

例9-25 地理的位置を使用したデバイスの位置の変更のサブスクライブ

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;
import oracle.adf.model.datacontrols.device.GeolocationCallback;
import oracle.adfmf.framework.contract.adf.Location;

// Subscribe to location updates that will be delivered every 20 seconds, with high accuracy.
// As we can have multiple subscribers, let's identify this one as 'MyGPSSubscriptionID'.
// Notice that this call returns the watchID, which is usually the same as the watchID passed in.
// However, it may be different if the specified watchID conflicts with an existing watchID,
// so be sure to always use the returned watchID.
String watchID = DeviceManagerFactory.getDeviceManager().startUpdatingPosition(20000, true, "
"MyGPSSubscriptionID", new GeolocationCallback() {
public void locationUpdated(Location position) {
System.out.println("Location updated to: " + position);
}
});

// The previous call returns immediately so that you can continue processing.
// When the device's location changes, the locationUpdated() method specified in
// the previous call will be invoked in the context of the current feature.

// When you wish to stop being notified of location changes, call the following method:
DeviceManagerFactory().getDeviceManager().clearWatchPosition(watchID);

DeviceFeaturesデータ・コントロールを使用してデバイスの位置を取得するには:

JDeveloperで、「データ・コントロール」パネルのDeviceFeaturesデータ・コントロールからstartLocationMonitor操作をページ・デザイナ上にドラッグし、ADFモバイルのリンクまたはボタンとしてドロップします。例9-25に従いますが、最初の位置の変更を受信した後、リスニングを停止します。

例9-26は、デバイスの位置を1回取得する方法を示しています。この例で使用するDeviceManager.getCurrentPositionメソッドのパラメータは、次のとおりです。

- int maximumAge: ミリ秒単位で指定したこの値より古くないキャッシュ値を受け入れます。位置の修正をこの時間内に取得した場合、その情報がすぐに戻されますが、それ以外の場合、コールは新しい位置の修正が確定するまでブロックされます。

- boolean: enableHighAccuracy trueに設定された場合、位置の修正を最も正確に取得できるメソッドを使用します。

例9-26 地理的位置を使用したデバイスの現在位置の取得(1回)

import oracle.adf.model.datacontrols.device.DeviceManagerFactory;
import oracle.adfmf.framework.contract.adf.Location;

// Get the device's current position, with highest accuracy, and accept a cached location that is
// no older than 60 seconds.
Location currentPosition = DeviceManagerFactory.getDeviceManager().getCurrentPosition(60000, true);
System.out.println("The device's current location is: latitude=" + currentPosition.getLatitude() +
", longitude=" + currentPosition.getLongitude());

9.5.9 デバイス・プロパティ

アプリケーションには、特定のデバイスの特性や機能に依存する機能が含まれる場合があります。たとえば、デバイスの画面の向きによって異なるユーザー・インタフェースを提示したり、デバイスで地理的位置がサポートされる場合のみマッピング機能を有効にすることなどが考えられます。ADFモバイルでは、このような動的な動作をサポートするためにJavaとELからアクセスできる、様々なプロパティが提供されます。表9-6に、これらのプロパティをリストし、問合せ方法、予期される戻り値およびアプリケーションのライフサイクル中にそのプロパティが変更される可能性があるかどうかに関する情報も提供します。

表9-6 デバイス・プロパティと対応するEL式

プロパティ

静的/
動的

EL式

サンプル値

Java API

device.name

静的

#{deviceScope.device.name}

"iPhone Simulator"、"Joe Smith's iPhone"

DeviceManager.getName()

device.platform

静的

#{deviceScope.device.platform}

"iPhone Simulator"、"iPhone"

DeviceManager.getPlatform()

device.version

静的

#{deviceScope.device.version}

"4.3.2"、"5.0.1"

DeviceManager.getVersion()

device.os

静的

#{deviceScope.device.os}

"iOS"

DeviceManager.getOs()

device.model

静的

#{deviceScope.device.model}

"x86_64"、"i386"、"iPhone3,1"

DeviceManager.getModel()

device.phonegap

静的

#{deviceScope.device.phonegap}

"1.0.0"

DeviceManager.getPhonegap()

hardware.hasCamera

静的

#{deviceScope.hardware.hasCamera}

"true"、"false"

DeviceManager.hasCamera()

hardware.hasContacts

静的

#{deviceScope.hardware.hasContacts}

"true"、"false"

DeviceManager.hasContacts()

hardware.hasTouchScreen

静的

#{deviceScope.hardware.hasTouchScreen}

"true"、"false"

DeviceManager.hasTouchScreen()

hardware.hasGeolocation

静的

#{deviceScope.hardware.hasGeolocation}

"true"、"false"

DeviceManager.hasGeolocation()

hardware.hasAccelerometer

静的

#{deviceScope.hardware.hasAccelerometer}

"true"、"false"

DeviceManager.hasAccelerometer()

hardware.hasCompass

静的

#{deviceScope.hardware.hasCompass}

"true"、"false"

DeviceManager.hasCompass()

hardware.hasFileAccess

静的

#{deviceScope.hardware.hasFileAccess}

"true"、"false"

DeviceManager.hasFileAccess()

hardware.hasLocalStorage

静的

#{deviceScope.hardware.hasLocalStorage}

"true"、"false"

DeviceManager.hasLocalStorage()

hardware.hasMediaPlayer

静的

#{deviceScope.hardware.hasMediaPlayer}

"true"、"false"

DeviceManager.hasMediaPlayer()

hardware.hasMediaRecorder

静的

#{deviceScope.hardware.hasMediaRecorder}

"true"、"false"

DeviceManager.hasMediaRecorder()

hardware.networkStatus

動的

#{deviceScope.hardware.networkStatus}

"wifi"、"2g"、"unknown"、"none"脚注 1

DeviceManager.getNetworkStatus()

hardware.screen.width

動的

#{deviceScope.hardware.screen.width}

320、480

DeviceManager.getScreenWidth()

hardware.screen.height

動的

#{deviceScope.hardware.screen.height}

480、320

DeviceManager.getScreenHeight()

hardware.availableWidth

動的

#{deviceScope.hardware.screen.availableWidth}

<= 320、<= 480

DeviceManager.getAvailableScreenWidth()

hardware.availableHeight

動的

#{deviceScope.hardware.screen.availableHeight}

<= 480、<= 320

DeviceManager.getAvailableScreenHeight()

hardware.screen.dpi

静的

#{deviceScope.hardware.screen.dpi}

160、326

DeviceManager.getScreenDpi()

hardware.screen.diagonalSize

静的

#{deviceScope.hardware.screen.diagonalSize}

9.7、6.78

DeviceManager.getScreenDiagonalSize()

hardware.screen.scaleFactor

静的

#{deviceScope.hardware.screen.scaleFactor}

1.0、2.0

DeviceManager.getScreenScaleFactor()

脚注 1  wifiと2Gの両方が有効になっている場合、wifiが2Gよりも優先されるため、ネットワーク・ステータスはwifiになります。

9.6 検証の実行

ADFモバイルでは、データ・コントロール・レイヤーで検証を実行し、Oracle ADFの場合と同様に動作するバインディング属性に設定された検証ルールを使用します。属性の検証は、バインディングに対するsetValue操作中に、システム内の単一点で実行されます。

データ・コントロールによって公開される属性に対して、次のバリデータを定義できます。

- 比較バリデータ

- 長さバリデータ

- リスト・バリデータ

- 範囲バリデータ

特定の属性に対してすべてのバリデータが実行され、成功しないすべてのバリデータに対してネストされた例外がスローされます。属性の検証メッセージを定義し、実行時に検証ルールを起動するときに表示できます。詳細は、第8.9項「入力の検証」と第9.6.1項「検証ルールの追加方法」を参照してください。

注意:

JSONの制限により、BigDecimalが保持できる値はDoubleの範囲内となり、BigIntegerが保持できる値はLongの範囲内となります。許可された値よりも大きい数値を使用するには、toStringをBigDecimalまたはBigIntegerでコールし、値をStringとしてシリアライズします。

表9-7に、長さバリデータでサポートされる検証の組合せをリストします。

表9-7 長さの検証

比較タイプ

Byte

Character

Equals

サポート

サポート

Not Equals

サポート

サポート

Less Than

サポート

サポート

Greater Than

サポート

サポート

Less Than Equal To

サポート

サポート

Greater Than Equal To

サポート

サポート

Between

サポート

サポート

表9-8と表9-9に、範囲バリデータでサポートされる検証の組合せをリストします。

表9-8 範囲検証

比較タイプ

Byte

Char

Double

Float

Integer

Long

Short

Between

サポート

サポート

サポート

サポート

サポート

サポート

サポート

Not Between

サポート

サポート

サポート

サポート

サポート

サポート

サポート

表9-9 範囲検証: math、sqlおよびutilパッケージ

比較タイプ

java.math.BigDecimal

java.math.BigInteger

java.sql.Date

java.sql.Time

java.sql.Timestamp

java.util.Date

Between

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Not Between

サポート

サポート

未サポート

未サポート

未サポート

未サポート

表9-10に、リスト・バリデータでサポートされる検証の組合せをリストします。

表9-10 リスト検証

比較タイプ

String

In

サポート

Not In

サポート

表9-11と表9-12に、比較バリデータでサポートされる検証の組合せをリストします。

表9-11 比較検証

比較タイプ

Byte

Char

Double

Float

Integer

Long

Short

String

Equals

サポート

サポート

サポート

サポート

サポート

サポート

サポート

サポート

Not Equals

サポート

サポート

サポート

サポート

サポート

サポート

サポート

サポート

Less Than

未サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

Greater Than

未サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

Less Than Equal To

未サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

Greater Than Equal To

未サポート

サポート

サポート

サポート

サポート

サポート

サポート

未サポート

表9-12 比較検証: java.math、java.sqlおよびjava.utilパッケージ

比較タイプ

java.math.BigDecimal

java.math.BigInteger

java.sql.Date

java.sql.Time

java.sql.Timestamp

java.util.Date

Equals

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Not Equals

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Less Than

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Greater Than

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Less Than Equal To

サポート

サポート

未サポート

未サポート

未サポート

未サポート

Greater Than Equal To

サポート

サポート

未サポート

未サポート

未サポート

未サポート

9.6.1 検証ルールの追加方法

検証ルールは、様々なユース・ケースに合わせて定義できます。宣言的検証ルールをエンティティ・オブジェクトに追加するには、データ・コントロール構造ファイルの「概要」エディタにある「属性」ページを使用します。

検証ルールの追加の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のエンティティ・オブジェクトおよび属性への検証ルールの追加に関する項を参照してください。

検証規則を追加する手順:

1. 「データ・コントロール」パネルで、データ・コントロール・オブジェクトを右クリックして「定義の編集」を選択します。

2. データ・コントロール構造ファイルの「概要」エディタで、「属性」ページを選択します。

3. ページの下部にある「検証ルール」タブを選択し、「追加」をクリックします。表示された「検証ルールの追加」ダイアログで、検証ルールと失敗処理を定義します。

詳細は、次の項を参照してください。

- 第7.3.2.4項「データ・コントロールのビューへの追加」

- 『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の組込みの宣言的検証ルールの使用方法に関する項

9.6.2 バリデータのメタデータについて

バリデータのメタデータは、設計時にデータ・コントロール構造のメタデータXMLファイル内に配置されます。例9-27は、サンプルの長さバリデータを示しています。

例9-27 メタデータ・ファイル内で宣言された長さバリデータ

<?xml version="1.0" encoding="windows-1252" ?>
<!DOCTYPE PDefViewObject SYSTEM "jbo_03_01.dtd">
<PDefViewObject
xmlns="http://xmlns.oracle.com/bc4j"
Name="Product"
Version="12.1.1.61.36"
xmlns:validation="http://xmlns.oracle.com/adfm/validation">
<DesignTime>
<Attr Name="_DCName" Value="DataControls.ProductListBean"/>
<Attr Name="_SDName" Value="mobile.Product"/>
</DesignTime>
<PDefAttribute
Name="name">
<validation:LengthValidationBean
Name="nameRule0"
OnAttribute="name"
CompareType="GREATERTHAN"
DataType="BYTE"
CompareLength="5"
Inverse="false"/>
</PDefAttribute>
</PDefViewObject>

9.7 データ変更イベント

JDeveloperでは、データ変更イベントを単純化するために、プロパティ変更リスナー・パターンを使用します。多くの場合、JDeveloperを使用して、Beanのプロパティ・アクセッサから通知をソースとして参照するために必要なコードを生成できます。これを行うには、「アクセッサの生成」ダイアログの「プロパティの変更時にリスナーに通知」チェック・ボックスを選択します(詳細は第9.2.4.2項「ADFマネージドBean」を参照)。PropertyChangeSupportオブジェクトが自動的に生成され、新たに生成されたsetterメソッドにfirePropertyChangeへのコールが含まれます。また、addPropertyChangeListenerおよびremovePropertyChangeListenerメソッドが追加されるため、プロパティ変更リスナーは、このオブジェクトを使用して自身を登録および登録解除できます。これを使用してフレームワークはクライアント・キャッシュにプッシュする変更を取得し、データが変更されたことをユーザー・インタフェース・レイヤーに通知します。

プロパティ変更のみでは、すべてのデータ変更通知は解決されません。たとえば、データ・コントロールによってラップされたBeanがあり、アイテムのコレクションの公開が必要な場合が考えられます。リストの個々のアイテムを変更するにはプロパティ変更で十分ですが、カーディナリティを変更するには十分ではありません。この場合、コレクション全体のプロパティ変更を起動すると、パフォーマンスが低下する可能性があるため、かわりにコレクションのデルタのみを更新します。これを行うには、ProviderChangeSupportクラスを使用して、単純なプロパティ変更に必要なデータよりも多くのデータを公開する必要があります。

プロバイダ変更は、データ・コントロールによってラップされたBeanで公開されている動的なコレクションを保持しているときのみ必要になるため、起動するプロバイダ変更イベントは、次のいくつかのタイプのみになります。

- fireProviderCreate: 新しい要素をコレクションに追加する場合

- fireProviderDelete: 要素をコレクションから削除する場合

- fireProviderRefresh: 同時に複数の変更をコレクションに加え、単純にクライアントにコレクション全体のリフレッシュを要求した方がよいと判断した場合(これは一括操作でのみ使用する必要があります)

ProviderChangeSupportクラスは、コレクション要素に関連する通知を送信するために使用され、これによって、Java Beanデータ・コントロール内で変更が発生したときにコンポーネントを適切に更新できます。このクラスが従うパターンは、自動的に生成されるPropertyChangeSupportクラスと似ていますが、ProviderChangeSupportとともに使用されるイベント・オブジェクトでは、操作のタイプや変更された要素のキーと位置などの詳細情報を送信します。ProviderChangeSupportでは、コレクションに対する要素(プロバイダ)の追加や削除など、コレクションに対する構造的な変更を取得します。PropertyChangeSupportでは、コレクション内の個々のアイテムに対する変更を取得します。

例9-28は、ProviderChangeSupportを使用して、コレクションの要素に対する構造的な変更(子を追加または削除する場合など)に関する通知を送信する方法を示しています。ProviderChangeListenerインタフェースとProviderChangeEventクラスの詳細は、ADFモバイルJavadocを参照してください。

例9-28 ProviderChangeSupportのコード例

public class NotePad {
private   static    List
s_notes               = null;

protected transient PropertyChangeSupport
propertyChangeSupport = new PropertyChangeSupport(this);
protected transient ProviderChangeSupport
providerChangeSupport = new ProviderChangeSupport(this);

public NotePad() {
…
}

public  mobile.Note[] getNotes() {
mobile.Note n[] = null;

synchronized (this)
{
if(s_notes.size() > 0) {
n = (mobile.Note[])
s_notes.toArray(new mobile.Note[s_notes.size()]);
}
else {
n = new mobile.Note[0];
}
}

return n;
}

public void addNote() {
System.out.println("Adding a note ....");
Note  n = new Note();
int   s = 0;

synchronized (this)
{
s_notes.add(n);
s = s_notes.size();
}

System.out.println("firing the events");
providerChangeSupport.fireProviderCreate("notes", n.getUid(), n);
}

public void removeNote() {
System.out.println("Removng a note ....");
if(s_notes.size() > 0) {
int     end = -1;
Note    n   = null;

synchronized (this)
{
end   = s_notes.size() - 1;
n     = (Note)s_notes.remove(end);
}

System.out.println("firing the events");
providerChangeSupport.fireProviderDelete("notes", n.getUid());
}
}

public void RefreshNotes() {
System.out.println("Refreshing the notes ....");

providerChangeSupport.fireProviderRefresh("notes");
}

public void addProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.addProviderChangeListener(l);
}

public void removeProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.removeProviderChangeListener(l);
}

protected String   status;

/* --- JDeveloper generated accessors --- */

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

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

public void setStatus(String status) {
String oldStatus = this.status;
this.status = status;
propertyChangeSupport.firePropertyChange("status", oldStatus, status);
}

public String getStatus() {
return status;
}
}

データ変更は、JVMレイヤーからのレスポンス・メッセージや戻り値とともに、クライアントに(キャッシュするために)戻されます。これにより、JDeveloperではユーザー・インタフェースに対してリフレッシュするイベントと更新の数を縮小し、可能なかぎりフレームワークの効率を上げることができます。

ただし、バックグラウンド・スレッドで実行時間の長い処理(Webサービスの相互作用、データベースの相互作用、コストのかかる計算など)に対処し、ユーザー・アクションに依存しないユーザー・インタフェースへの通知を行うことが必要になる場合もあります。AMXページのデータを更新して、値が変更されたデータ・フィールドの現在の値を反映させる場合、AdfmfJavaUtilities.flushDataChangeEventをコールして現在キューに入っているデータ変更をクライアントに強制することによって、AMXページ全体のリロードによるパフォーマンスの低下を回避できます。

注意:

flushDataChangeEventメソッドは、バックグラウンド・スレッドからのみ実行できます。

例9-29は、flushDataChangeEventメソッドを使用して保留中のデータ変更をクライアントに強制する方法を示しています。oracle.adfmf.framework.api.AdfmfJavaUtilities.flushDataChangeEventの詳細は、Oracle Fusion Middleware Oracle ADFモバイルJava APIリファレンスを参照してください。

例9-29 データ変更イベントの例

/* Note – Simple POJO used by the NotePad managed bean or data control wrapped bean */

package mobile;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.java.beans.PropertyChangeListener;
import oracle.adfmf.java.beans.PropertyChangeSupport;

/**
* Simple note object
* uid   - unique id - generated and not mutable
* title - title for the note - mutable
* note  - note comment - mutable
*/
public class Note {
/* standard jdev generated property change support */
protected transient PropertyChangeSupport
propertyChangeSupport = new PropertyChangeSupport(this);

private static boolean s_backgroundFlushTestRunning = false;

public Note() {
this("" + (System.currentTimeMillis() % 10000));
}

public Note(String id) {
this("UID-"+id, "Title-"+id, "");
}

public Note(String uid, String title, String note) {
this.uid     = uid;
this.title   = title;
this.note    = note;
}

/* update the current note with the values passed in */
public void updateNote(Note n) {
if (this.getUid().compareTo(n.getUid()) == 0) {
this.setTitle(n.getTitle());
this.setNote(n.getNote());
} else {
throw new IllegalArgumentException("note");
}
}

/* background thread to simulate some background process that make changes */
public void startNodeBackgroundThread(ActionEvent actionEvent) {
Thread backgroundThread   = new Thread() {
public void run() {
System.out.println("startBackgroundThread enter - " +
s_backgroundFlushTestRunning);

s_backgroundFlushTestRunning = true;
for(int i = 0; i <= iterations; ++i) {
try
{
System.out.println("executing " + i + " of " + iterations + "
" iterations.");

/* update a property value */
if(i == 0) {
setNote("thread starting");
}
else if( i == iterations) {
setNote("thread complete");
s_backgroundFlushTestRunning = false;
}
else {
setNote("executing " + i + " of " + iterations + " iterations.");
}
setVersion(getVersion() + 1);
setTitle("Thread Test v" + getVersion());
AdfmfJavaUtilities.flushDataChangeEvent();  /* key line */
}
catch(Throwable t)
{
System.err.println("Error in the background thread: " + t);
}

try {
Thread.sleep(delay);  /* sleep for 6 seconds */
} catch (InterruptedException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
}
}
};

backgroundThread.start();
}

protected String uid;
protected String title;
protected String note;
protected int    version;

protected int    iterations =  10;
protected int    delay      = 500;

/* --- jdev generated accessors --- */

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

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

public String getUid() {
return uid;
}

public void setTitle(String title) {
String oldTitle = this.title;
this.title = title;
propertyChangeSupport.firePropertyChange("title", oldTitle, title);
}

public String getTitle() {
return title;
}

public void setNote(String note) {
String oldNote = this.note;
this.note = note;
propertyChangeSupport.firePropertyChange("note", oldNote, note);
}

public String getNote() {
return note;
}

public void setVersion(int version) {
int oldVersion = this.version;
this.version = version;
propertyChangeSupport.firePropertyChange("version", oldVersion, version);
}

public int getVersion() {
return version;
}

public void setIterations(int iterations) {
int oldIterations = this.iterations;
this.iterations = iterations;
propertyChangeSupport.
firePropertyChange("iterations", oldIterations, iterations);
}

public int getIterations() {
return iterations;
}

public void setDelay(int delay) {
int oldDelay = this.delay;
this.delay = delay;
propertyChangeSupport.
firePropertyChange("delay", oldDelay, delay);
}

public int getDelay() {
return delay;
}
}

/* NotePad – Can be used as a managed bean or wrapped as a data control */

package mobile;

import java.util.ArrayList;
import java.util.List;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;
import oracle.adfmf.java.beans.PropertyChangeListener;
import oracle.adfmf.java.beans.PropertyChangeSupport;
import oracle.adfmf.java.beans.ProviderChangeListener;
import oracle.adfmf.java.beans.ProviderChangeSupport;

public class NotePad {
private static List     s_notes                      = null;
private static boolean  s_backgroundFlushTestRunning = false;

protected transient     PropertyChangeSupport
propertyChangeSupport = new PropertyChangeSupport(this);

protected transient     ProviderChangeSupport
providerChangeSupport = new ProviderChangeSupport(this);

public NotePad() {
if (s_notes == null) {
s_notes = new ArrayList();

for(int i = 1000; i < 1003; ++i) {
s_notes.add(new Note(""+i));
}
}
}

public  mobile.Note[] getNotes() {
mobile.Note n[] = null;

synchronized (this)
{
if(s_notes.size() > 0) {
n = (mobile.Note[])s_notes.
toArray(new mobile.Note[s_notes.size()]);
}
else {
n = new mobile.Note[0];
}
}

return n;
}

public void addNote() {
System.out.println("Adding a note ....");
Note  n = new Note();
int   s = 0;

synchronized (this)
{
s_notes.add(n);
s = s_notes.size();
}

System.out.println("firing the events");

/* update the note count property on the screen */
propertyChangeSupport.
firePropertyChange("noteCount", s-1, s);

/* update the notes collection model with the new note */
providerChangeSupport.
fireProviderCreate("notes", n.getUid(), n);

/* to update the client side model layer */
AdfmfJavaUtilities.flushDataChangeEvent();
}

public void removeNote() {
System.out.println("Removing a note ....");
if(s_notes.size() > 0) {
int     end = -1;
Note    n   = null;

synchronized (this)
{
end   = s_notes.size() - 1;
n     = (Note)s_notes.remove(end);
}

System.out.println("firing the events");

/* update the client side model layer */
providerChangeSupport.
fireProviderDelete("notes", n.getUid());

/* update the note count property on the screen */
propertyChangeSupport.
firePropertyChange("noteCount", -1, end);
}
}

public void RefreshNotes() {
System.out.println("Refreshing the notes ....");

/* update the entire notes collection on the client */
providerChangeSupport.fireProviderRefresh("notes");
}

public int getNoteCount() {
int size = 0;

synchronized (this)
{
size = s_notes.size();
}
return size;
}

public void
addProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.addProviderChangeListener(l);
}

public void
removeProviderChangeListener(ProviderChangeListener l) {
providerChangeSupport.removeProviderChangeListener(l);
}

public void
startListBackgroundThread(ActionEvent actionEvent) {
for(int i = 0; i < 10; ++i) {
_startListBackgroundThread(actionEvent);
try {
Thread.currentThread().sleep(i * 1234);
} catch (InterruptedException e) {
}
}
}

public void
_startListBackgroundThread(ActionEvent actionEvent) {
Thread backgroundThread   = new Thread() {
public void run() {
s_backgroundFlushTestRunning = true;

for(int i = 0; i <= iterations; ++i) {
System.out.println("executing " + i +
" of " + iterations + " iterations.");

try
{
/* update a property value */
if(i == 0) {
setStatus("thread starting");
addNote();  // add a note
}
else if( i == iterations) {
setStatus("thread complete");
removeNote();  // remove a note
s_backgroundFlushTestRunning = false;
}
else {
setStatus("executing " + i + " of " +
iterations + " iterations.");

synchronized (this)
{
if(s_notes.size() > 0) {
Note n =(Note)s_notes.get(0);

n.setTitle("Updated-" +
n.getUid() + " v" + i);
}
}
}
AdfmfJavaUtilities.
flushDataChangeEvent();
}
catch(Throwable t)
{
System.err.
println("Error in bg thread - " + t);
}

try {
Thread.sleep(delay);
} catch (InterruptedException ex) {
// TODO Auto-generated catch block
setStatus("inturrpted " + ex);
ex.printStackTrace();
}
}
}
};

backgroundThread.start();
}

protected int iterations = 100;
protected int delay      = 750;

protected String   status;

/* --- jdev generated accessors --- */

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

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

public void setStatus(String status) {
String oldStatus = this.status;
this.status = status;
propertyChangeSupport.
firePropertyChange("status", oldStatus, status);
}

public String getStatus() {
return status;
}

public void setIterations(int iterations) {
int oldIterations = this.iterations;
this.iterations = iterations;
propertyChangeSupport.
firePropertyChange("iterations",
oldIterations, iterations);
}

public int getIterations() {
return iterations;
}

public void setDelay(int delay) {
int oldDelay = this.delay;
this.delay = delay;
propertyChangeSupport.
firePropertyChange("delay", oldDelay, delay);
}

public int getDelay() {
return delay;
}
}

StockTrackerサンプル・アプリケーションでは、データ変更イベントでJavaを使用してデータ変更をユーザー・インタフェースに反映する方法の例を示します。このサンプル・アプリケーションは、開発用コンピュータのJDeveloperインストール・ディレクトリ内にある次の場所のPublicSamples.zipファイルに含まれています。

jdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samples

サンプル・アプリケーションの詳細は、付録E「サンプルのADFモバイル・アプリケーション」を参照してください。

10 Webサービスの使用方法

この章では、サード・パーティのWebサービスをADFモバイルAMXアプリケーション機能の実装に統合する方法について説明します。

この章では、次の項目について説明します。

- 第10.1項「Webサービスの使用方法の概要」

- 第10.2項「Webサービス・データ・コントロールの作成」

- 10.3項「新しいWebサービス接続の作成」

- 第10.4項「Webサービス・データ・コントロールのエンドポイントの調整」

- 第10.5項「セキュアなWebサービスへのアクセス」

- 第10.6項「JavaからのWebサービスの起動」

- 第10.7項「Webサービスの管理」

10.1 Webサービスの使用方法の概要

Webサービスでは、アプリケーションおよびその機能は、定義済のアプリケーション・プログラミング・インタフェースを使用してデータと情報を交換できます。Webサービスを使用すると、元のアプリケーションのプラットフォームや言語に関係なくビジネス機能を公開できます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のFusion WebアプリケーションのWebサービスの概要に関する項を参照してください。

ADFモバイルでは、SOAPとRESTの両方のWebサービスをサポートしており、サード・パーティのWebサービスをADFモバイルAMXアプリケーション機能に統合できます。

10.2 Webサービス・データ・コントロールの作成

ADFモバイルで開発したアプリケーション機能でWebサービスを使用する方法の中では、Webサービスのデータ・コントロールを作成する方法が最も一般的です。これは通常、次の理由で実行されます。

- Webサービスとしてはすぐに利用できるが、アプリケーション内で開発するには時間がかかる機能を追加するため

- 異なるアーキテクチャで実行されるアプリケーションへのアクセスを提供するため

- ADFモバイルで作成されたコンポーネントの再利用を可能にし、それらを他のアプリケーションのWebサービスとして利用可能にするため

Webサービス・データ・コントロールおよびその使用方法の詳細は次を参照してください。

- 『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のWebサービス・データ・コントロールに関する項

- 『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のREST Webサービス・データ・コントロールに関する項

- 『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のOracle ADF Fusion Webアプリケーションでのデータ・コントロールに関する付録

- 第7.3.2.4項「データ・コントロールのビューへの追加」

- 『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のデータ・コントロール・パネルの使用方法に関する項

10.2.1 SOAPを使用したWebサービス・データ・コントロールの作成方法

JDeveloperでは、そのサービスのWeb Services Description Language(WSDL)ファイルのみを使用して、既存のSOAP Webサービスのデータ・コントロールを作成します。ローカル・ファイル・システムでWSDLファイルを参照するか、Universal Description, Discovery and Integration(UDDI)レジストリでWSDLファイルを検索するか、WSDL URLを直接入力することができます。

注意:

ファイアウォールで保護されている環境で、ファイアウォール外にあるWebサービスを使用する場合は、JDeveloperで「Webブラウザとプロキシ」の設定を構成する必要があります。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のブラウザ・プロキシ情報の設定に関する項を参照してください。

SOAP Webサービス・データ・コントロールを作成するには:

1. アプリケーション・ナビゲータでアプリケーション名を右クリックして、JDeveloperのメイン・メニューから「ファイル」→「新規」を選択します。

2. 「新規ギャラリ」ダイアログで、左側の「ビジネス層」ノードを開いて「Webサービス」を選択します。右側の「アイテム」リストから「Webサービス・データ・コントロール」を選択して(図10-1を参照)、「OK」をクリックします。

図10-1 新しいSOAP Webサービス・データ・コントロールの作成

3. ウィザードの指示に従って、データ・コントロールの作成を完了します。

注意:

ADFモバイルでは、SOAP 1.1および1.2の両方のバージョンで次のエンコーディング・スタイルをサポートしています。

- ドキュメント/リテラル

- ドキュメント/ラップ

- RPC

Webサービス・データ・コントロールの作成後は、Webサービスの操作およびその操作の戻り値が「データ・コントロール・パレット」に表示され、そのページでは、Webサービスの操作により戻されるオブジェクトを適切なADFモバイルAMX UIコンポーネントとしてドラッグ・アンド・ドロップできます。詳細は、第7.3.2.4項「データ・コントロールのビューへの追加」を参照してください。Webサービスの操作から戻されたデータが表示されると、次のオブジェクト・タイプが処理されます。

- コレクション

- Webサービスの操作により戻された複合オブジェクト

- Webサービスの操作により戻された、ネストされた複合オブジェクト

Webサービスの操作を使用して、データの更新(標準データ型と複合オブジェクトの両方を含む)および削除ができます。

10.2.2 RESTを使用したWebサービス・データ・コントロールの作成方法

JDeveloperでは、既存のREST Webサービスのデータ・コントロールを作成できます。

注意:

ファイアウォールで保護されている環境で、ファイアウォール外にあるWebサービスを使用する場合は、JDeveloperで「Webブラウザとプロキシ」の設定を構成する必要があります。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のブラウザ・プロキシ情報の設定に関する項を参照してください。

同じ接続を使用して、REST Webサービス・データ・コントロール(URLサービス・データ・コントロールとも呼ばれる)に1つ以上のHTTPメソッドを関連付けることができます。標準のHTTPメソッド以外にもRESTサービスにより公開されたカスタム操作にアクセスできます。これらのカスタム操作は、HTTPメソッドの1つにマップされ、データ・コントロールを作成することでクライアントに公開できます。

モバイル・デバイスでセキュリティおよび通知機能を使用する場合は、RESTデータ・コントロールによって公開された特定の操作で使用する標準のHTTPヘッダーにカスタム・ヘッダーおよびカスタム値を追加できます。

始める前に:

データ・コントロールがアクセスするREST Webサービスへのアクセス権があることを確認します。

REST Webサービス・データ・コントロールを作成するには:

1. アプリケーション・ナビゲータでアプリケーション名を右クリックして、JDeveloperのメイン・メニューから「ファイル」→「新規」を選択します。

2. 「新規ギャラリ」ダイアログで、左側の「ビジネス層」ノードを開いて「データ・コントロール」を選択します。右側の「アイテム」リストから「URLサービス・データ・コントロール」を選択して(図10-2を参照)、「OK」をクリックします。

図10-2 新しいREST Webサービス・データ・コントロールの作成

3. 「URLサービス・データ・コントロールの作成」ウィザードの説明に従って、次の点に注意しながらデータ・コントロールの作成を完了します。

- ADFモバイルでは、Webサービスに対して基本認証のみをサポートしています(第10.5項「セキュアなWebサービスへのアクセス」を参照)。「接続」ページを完了する際は、「認証タイプ」フィールドの「基本」を選択します。

- ADFモバイルでは、GET、POST、PUTおよびDELETEのすべてのHTTPメソッド・タイプをサポートしています。「接続」ページの「HTTPメソッド」フィールドを入力すると、これらのメソッド・タイプを選択できます。

注意:

同じ接続および同じREST Webサービス・データ・コントロールを使用して4つのメソッドをすべて追加できます。

- ADFモバイルでは、「パラメータ」ページにリストされたすべての設定がサポートされます。

- ADFモバイルでは、スプレッド・シート・データ内の区切り文字で区切られた値およびXMLデータ・フォーマットのXSLはサポートされません。「データ・フォーマット」ページを入力する際は、「XML」またはXML用のXSDフォーマットのいずれかを指定します。

- URLサービス・データ・コントロール定義にローカルXSDファイルを指定することで、「スキーマ」フィールドにファイルURI参照を作成します。

注意:

ADFモバイルではコンパイル時にXSD構造の内部定義を作成するため、アプリケーションのコンパイル後はXSDを変更しないようにします。したがって、XSDファイルをローカルで参照することをお薦めします。リモートXSDの使用がパフォーマンスに悪影響を与えるのは、ADFモバイルではアプリケーションを実行するたびにXSDを取得するためです。

前述の手順に従って作成されたREST Webサービス・データ・コントロールは、Oracle ADFのデータ・コントロールと同様に動作します。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のURLサービスに関する項を参照してください。

データ・コントロールを使用しないJavaによるREST Webサービスの使用方法の詳細は、第10.6.1項「REST Webサービス・アダプタの使用方法」を参照してください。

10.3 新しいWebサービス接続の作成

Webサービスの接続情報は、アプリケーション内の他の接続とともにconnections.xmlファイルに保存されます。このファイルは、Webサービス・データ・コントロールの作成時に新しいWebサービス・データ・コントロールウィザードによって.adf/META-INFディレクトリに生成されるため、明示的に作成する必要はありません(第10.2項「Webサービス・データ・コントロールの作成」を参照)。

接続設定を変更するには、connections.xmlファイルを編集します。

10.4 Webサービス・データ・コントロールのエンドポイントの調整

Webサービス・データ・コントロールを作成すると、URIのエンドポイントを変更できます。これは、機能をテスト環境から本番環境に移行するような場合に役に立ちます。

エンドポイントを変更するには、connections.xmlファイルを編集します。

10.5 セキュアなWebサービスへのアクセス

ADFモバイルでは、HTTPおよびHTTPS経由の基本認証(BASIC_AUTH)とともに、保護されたWebサービスおよび非保護のWebサービスの両方がサポートされます。

詳細は、次の項を参照してください。

- 第17.3項「認証の概要」

- 第17章「ADFモバイル・アプリケーションのセキュリティ」

- Oracle Fusion Middleware Webサービスの管理のポリシーの構成に関する項

ADFモバイル・アプリケーションから保護されたWebサービスにアクセスするには、アプリケーションに追加されたWebサービス・データ・コントロールの構成が必要な場合もあります。

10.5.1 SOAPベースのWebサービスへのアクセスを有効にする方法

SOAPベースのWebサービスでは次のセキュリティ・ポリシーがサポートされます。

- oracle/wss_http_token_client_policy

- oracle/wss_http_token_over_ssl_client_policy

- oracle/http_basic_auth_over_ssl_client_policy

- oracle/wss_username_token_client_policy

- oracle/wss_username_token_over_ssl_client_policy

SOAP Webサービスが保護されている場合は、oracle/wss_http_token_over_ssl_client_policyまたはoracle/wss_http_token_client_policyのいずれかでWebサービス・データ・コントロールを構成することでアクセスが可能になります。これを行うには、図10-2に示す「データ・コントロール・ポリシーの編集」ダイアログを使用します。このダイアログは次の方法で開くことができます。

- ナビゲータで.dcxファイルを選択します。

- 「構造」ペインで、構成が必要なWebサービス・データ・コントロールを右クリックし、ポップアップ・メニューから「Webサービス・セキュリティの定義」を選択します。

図10-3 Webサービス・データ・コントロール・ポリシーの編集

10.5.2 RESTベースのWebサービスへのアクセスを有効にする方法

RESTベースのWebサービスでサポートされるセキュリティ・ポリシーは1つのみのため、ADFモバイルでは、HTTPS経由でのREST Webサービスにはoracle/wss_http_token_over_ssl_client_policy、HTTPプロトコル経由でのREST Webサービスにはoracle/wss_http_token_client_policyを自動追加し、Oracle Web Services Manager (OWSM) Lite MobileのADFアプリケーション・エージェントが適切なセキュリティ・ヘッダーを挿入できるようにします。

10.5.3 資格証明の挿入について

保護されたWebサービスにおけるユーザーの資格証明は、Webサービス・リクエストの起動時にそのリクエストに動的に挿入されます。このプロセスは、SOAP WebサービスとREST Webサービスで似ています。

ADFモバイルでは、Oracle Web Services Manager (OWSM) Lite MobileのADFアプリケーション・エージェントを使用してプロキシを作成および構成するほか、そのプロキシを使用してサービスをリクエストします。ユーザーの資格証明は、プロキシの構成時にOWSM強制コンテキストに挿入されます。資格証明の挿入はOWSMプロキシによって処理されます。詳細は、Oracle Fusion Middleware Oracle Web Services Manager Java APIリファレンスを参照してください。

Webサービスを起動する前に、ユーザーは、保護されたADFモバイル・アプリケーション機能の呼出しまたはアクセス制御サービス(ACS)で制御されたアプリケーションの起動を試みるユーザーによってトリガーされた認証プロンプトに応答する必要があります。後者では、アプリケーションでACS URLを使用してデフォルトのログイン・サーバーを定義し、user.role設定に依存する制約を持つ機能を少なくとも1つは備えておく必要があります。ユーザーの資格証明は、IDM Mobile資格証明ストアと呼ばれる資格証明ストアに格納されます。この資格証明ストアは、認証プロバイダのサーバーURLおよびユーザーと関連付けられた資格証明の格納に使用される、デバイス・ネイティブかつローカルなリポジトリです。実行時に、ADFモバイルでは、すべての資格証明がその使用前にIDM Mobile資格証明ストアに格納されているものとみなします。

ADFモバイルでは、WebサービスのエンドポイントURLに対してのみ認証がサポートされます。connections.xmlファイルには、Webサービスの接続参照のcredentialStoreKey属性にログイン・サーバーの接続名を指定して、ログイン・サーバーをWebサービスのセキュリティに関連付ける必要があります(例10-1および例10-2を参照)。

注意:

connections.xmlファイルを編集するには、この構成がJDeveloperのデザイナに公開されていないため、「ソース」エディタを使用します。

例10-1は、credentialStoreKey="MyAuth"として参照されるWebサービス接続の定義を示しています。ここで、MyAuthとは、ログイン接続の参照名です。

例10-1 Webサービス接続の定義

<Reference name="URLConnection1"
className="oracle.adf.model.connection.url.HttpURLConnection"
credentialStoreKey="MyAuth"
xmlns="">
<Factory className="oracle.adf.model.connection.url.URLConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="URLConnection1">
<Contents>
<urlconnection name="URLConnection1"
url="http://myhost.us.example.com:7777/
SecureRESTWebService1/Echo">
<authentication style="challange">
<type>basic</type>
<realm>myrealm</realm>
</authentication>
</urlconnection>
</Contents>
</XmlRefAddr>
<SecureRefAddr addrType="username"/>
<SecureRefAddr addrType="password"/>
</RefAddresses>
</Reference>

例10-2は、ログイン接続の定義を示しています。ここでのMyAuthは、ログイン・サーバー接続における資格証明ストア・キーの値として使用されます。

例10-2 ログイン接続の定義

<Reference name="MyAuth"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="MyAuth"
partial="false"
manageInOracleEnterpriseManager="true"
deployable="true"
xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://172.31.255.255:7777/
SecuredWeb1-ViewController-context-root/faces/view1.jsf"/>
<logout url="http://172.31.255.255:7777/
/SecuredWeb1-ViewController-context-root/faces/view1.jsf"/>
<accessControl url="http://myhost.us.example.com:7777/
UserObjects/jersey/getUserObjects" />
<idleTimeout value="10"/>
<sessionTimeout value="36000"/>
<cookieNames>
<cookie name="JSESSIONID"/>
</cookieNames>
<userObjectFilter>
<role name="testuser1_role1"/>
<role name="testuser2_role1"/>
<privilege name="testuser1_priv1"/>
<privilege name="testuser2_priv1"/>
<privilege name="testuser2_priv2"/>
</userObjectFilter>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>

認証の失敗によってWebサービス・リクエストが拒否された場合は、ADFモバイルにより適切な例外が戻され、適切なアクションが起動されます(第18.5項「ロギングの使用方法と構成」を参照)。既存の例外で状況を適切に示せない場合は、新しい例外が追加されます。

connections.xmlファイルは構成サービスの下でデプロイされ、管理されています。詳細は、第10.7項「Webサービスの管理」を参照してください。

FAR内のconnection.xmlファイルは、ADFモバイル・アプリケーションのデプロイ時に集約されます。資格証明はデプロイメント固有のデータを表しており、FAR内に格納することは想定されていません。

10.5.4 セキュアなWSDLファイルの使用制限

ADFモバイル・アプリケーションではWSDLファイルへのアクセスを実行時に認証なしに行えるようにする必要があるため、基本認証によって保護されたSOAP WebサービスでセキュアなWSDLファイルを使用することはできません。

WSDLの保護が目的の場合は次の点を考慮してください。WSDLファイルはWebサービスのGETメソッドによってフェッチされるため、GETメソッドを除く各Webサービス・メソッドを保護する場合は、セキュアなWSDLを使用できます。GETメソッドを保護する場合は、WSDLを保護しないようにします。

10.6 JavaからのWebサービスの起動

ADFモバイル・アプリケーションでは、JavaコードからWebサービス層(RESTおよびSOAPの両方)を起動して、その結果をJavaメソッドで使用できます。

ADFモバイルでは、使用可能なGenericTypeBeanSerializationHandlerユーティリティ・クラスが提供され、POJO (JavaBeansオブジェクト)とADFモバイルのGenericTypeオブジェクトとの間で次の変換ルールのセットに基づいて変換が実行されます。

1. POJOからGenericTypeオブジェクトに変換する場合:

- プロパティの決定に標準JavaBeansの反映ルールが使用されます。

- 変換プロセスでは一時プロパティが無視されます。

- 読取り可能プロパティはGenericType属性に変換されます。

- 配列プロパティはGenericType内で繰返し属性として表されます。

- マッピング・プロパティはGenericType内で個別の属性として表されます。

- 非プリミティブ・プロパティはネストされたGenericTypeオブジェクトとして表されます。

2. GenericTypeオブジェクトからPOJOに変換される場合:

- プロパティの決定に標準JavaBeansの反映ルールが使用されます。

- 変換プロセスでは一時プロパティが無視されます。

- 書込み可能プロパティはGenericType属性に変換されます。

- GenericType内の繰返し属性は配列オブジェクトに変換されます。

- POJOにMapインタフェースが実装されている場合は、標準アクセッサを介して設定できないすべてのプロパティがMapのsetメソッドを介してPOJOに設定されます。

- 非プリミティブ属性はネストされたPOJOオブジェクトとして表されます。

このヘルパーAPIを使用する利点は、Webサービスから受け取ったレスポンスを取得して、1回のコールでJavaBeanに変換できることです。

たとえば、Webサービスは、ビジネス・ロジック全体で再利用する必要があるEmployeeオブジェクトを渡したり戻したりします。このオブジェクトには次のプロパティ・セットがあります。

- String型のname

- address(street、city、stateおよびzipcodeの各属性を持つ複合オブジェクト)

- long型のid

- float型のsalary

- String型のphone(複数のphoneになる可能性もある)

- String型のpassword(このpasswordはバックエンドのWebサービスに送信しないでください)

例10-3は、考えられるEmployeeオブジェクトのコードを示しています。

例10-3 Employeeオブジェクト

public class Employee {

protected String name;
protected Address address;
protected long id;
protected float salary;
protected String[] phone;
protected transient String password;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Address getAddress() {
return address;
}

public void setAddress(Address address) {
this.address = address;
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public float getSalary() {
return salary;
}

public void setSalary(float salary) {
this.salary = salary;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public void setPassword(String password) {
this.password = password;
}

public String[] getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

例10-4は、EmployeeクラスのAddressオブジェクトのコードとして考えられるものを示しています。

例10-4 Addressオブジェクト

public class Address {

protected String street;
protected String city;
protected String state;
protected String zipcode;

public String getStreet() {
return street;
}

public void setStreet(String street) {
this.street = street;
}

public String getCity() {
return city;
}

public void setCity(String city)  {
this.city = city;
}

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public String getZipcode() {
return zipcode;
}

public void setZipcode(String zipcode)  {
this.zipcode = zipcode;
}

変換ルールについては次に注意します。

1. passwordは一時的に定義されるため、変換アルゴリズムに対しては無視されます。

2. name、address、idおよびsalaryにはすべてgetメソッドおよびsetメソッドがあるため、それらはすべてGenericTypeとの間で変換が行われます。

3. プロパティ・タイプに基づき、oracle.adfmf.misc.ConverterクラスのcoerceToType(Object, Class)メソッドの定義に従って、プロパティをタイプ間で強制変換できます。

4. addressなどの複合オブジェクトは、変換アルゴリズムによって再帰的に処理することで、変換の方向により、子であるGenericTypeを構築するか、POJO複合オブジェクトを作成してデータを移入します。

5. phoneはStringオブジェクトの配列で、それぞれが一意の電話番号を表しており、またこの要素のカーディナリティは2以上のため、変換アルゴリズムによってGenericTypeオブジェクト内のphone属性におけるすべての組合せが検索され、それらが配列として表されるほか、Bean上ではsetPhoneメソッドが起動されます。GenericTypeBeanSerializationHandlerのtoGenericTypeメソッドでは各配置要素が取得され、個別のphone属性としてtoGenericTypeに追加されます。

次のように定義されている場合:

final String EMPLOYEE_VIRTUAL_BEAN_NAME = "EmployeeDC.Types.Employee";
Employee emp = getEmployee();
GenericType gt = null;

- Employeeオブジェクトは、次のようにGenericTypeに変換されます。

gt = GenericTypeBeanSerializationHelper.toGenericType
(EMPLOYEE_VIRTUAL_BEAN_NAME, emp);

- GenericTypeは次のようにEmployeeオブジェクトに変換されます。

emp = GenericTypeBeanSerializationHelper.fromGenericType
(Employee.class, gt, null);

正常に変換するには次の点を考慮します。

- POJOでは通常、それらに関連付けられたGenericType構造に厳密に従います。

- GenericType構造から外れた場合は、次のいずれかの方法に従います。

1. 追加のBeanプロパティを一時的に宣言します。

2. 操作パラメータとして使用されたときに欠落データをバッキング・サービスが処理できる場合は、POJOからオプション・プロパティを除外できます。

- GenericTypeは、SOAPデータ・コントロールにのみ公開されます。仮想タイプには、toGenericTypeメソッドに渡される、関連付けられた仮想Bean名があります。JDeveloperの「データ・コントロール」ウィンドウで仮想タイプ上にカーソルを置くことによって仮想Bean名にアクセスできます。通常の名前フォーマットは、<DCName>.Types.<methodName>.<argName>です。

詳細は、Oracle Fusion Middleware Oracle ADFモバイルJava APIリファレンスを参照してください。

10.6.1 REST Webサービス・アダプタの使用方法

RestServiceAdapterインタフェースを使用して、RESTコールで送信されるデータにアクセスできます(このデータは、JavaScript Object Notationと表される場合があります)。RestServiceAdapterインタフェースによって、Webサービス・データ・コントロールを作成したり、それと直接やりとりする必要なしに、Webサービス操作の実行をトリガーできます。

ADFモバイル・アプリケーションでRestServiceAdapterインタフェースを使用するには、connections.xmlファイルに接続が存在することを確認し(第10.3項「新しいWebサービス接続の作成」を参照)、次の例で示すようにコードをBeanクラスに追加します。

例10-5は、GETリクエストに対するRestServiceAdapterの使用方法を示しています。

例10-5 GETリクエストに対するRestServiceAdapterの使用方法

RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

// Clear any previously set request properties, if any
restServiceAdapter.clearRequestProperties();

// Set the connection name
restServiceAdapter.setConnectionName("RestServerEndpoint");

// Specify the type of request
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_GET);

// Specify the number of retries
restServiceAdapter.setRetryLimit(0);

// Set the URI which is defined after the endpoint in the connections.xml.
// The request is the endpoint + the URI being set
restServiceAdapter.setRequestURI("/WebService/Departments/100");

String response = "";

// Execute SEND and RECEIVE operation
try {
// For GET request, there is no payload
response = restServiceAdapter.send("");
}
catch (Exception e) {
e.printStackTrace();
}

例10-6は、POSTリクエストに対するRestServiceAdapterの使用方法を示しています。

例10-6 POSTリクエストに対するRestServiceAdapterの使用方法

String id = "111";
String name = "TestName111";
String location = "TestLocation111";
RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_POST);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/WebService/Departments");

String response = "";

// Execute SEND and RECEIVE operation
try {
String postData = makeDepartmentPost("DEPT", id, name, location);
response = restServiceAdapter.send(postData);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("The response is:  " + response);

private String makeDepartmentPost(String rootName, String id,
String name, String location) {
String ret = "<" + rootName + ">";
ret += "<DEPTID>" + id + "</DEPTID>";
ret += "<NAME>" + name + "</NAME>";
ret += "<LOCATION>" + location + "</LOCATION>";
ret += "</" + rootName + ">";
return ret;
}

例10-7は、PUTリクエストに対するRestServiceAdapterの使用方法を示しています。

例10-7 PUTリクエストに対するRestServiceAdapterの使用方法

String id = "111";
String name = "TestName111";
String location = "TestLocation111";
RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_PUT);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/WebService/Departments");

String response = "";

// Execute SEND and RECEIVE operation
try {
String putData = makeDepartmentPut("DEPT", id, name, location);
response = restServiceAdapter.send(putData);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("The response is:  " + response);

private String makeDepartmentPut(String rootName, String id,
String name, String location) {
String ret = "<" + rootName + ">";
ret += "<DEPTID>" + id + "</DEPTID>";
ret += "<NAME>" + name + "</NAME>";
ret += "<LOCATION>" + location + "</LOCATION>";
ret += "</" + rootName + ">";
return ret;
}

例10-8は、DELETEリクエストに対するRestServiceAdapterの使用方法を示しています。

例10-8 DELETEリクエストに対するRestServiceAdapterの使用方法

RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("RestServerEndpoint");
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_DELETE);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/WebService/Departments/44");

String response = "";

// Execute SEND and RECEIVE operation
try {
// For DELETE request, there is no payload
response = restServiceAdapter.send("");
}
catch (Exception e) {
e.printStackTrace();
}

System.out.println("The response is:  " + response);

RestServiceAdapterを使用する場合は、AcceptヘッダーとContent-Typeヘッダーを設定して、MIMEタイプの不一致が原因でリクエストおよびレスポンスのペイロードが無効と判断されないようにします。

注意:

REST Webサービス・アダプタでは、モバイル・アプリケーション上の文字セットとしてUTF-8のみをサポートします。UTF-8は、アダプタのプログラムに埋め込まれています。

10.6.1.1 非テキスト・レスポンスのサポート

Webサービス・コールから受け取ったバイナリ(非テキスト)レスポンスを処理するには、RestServiceAdapterを使用できます。これらのレスポンスには、PDFファイルやビデオ・ファイルなど、どの種類のバイナリ・データでも含めることができます。使用するRestServiceAdapterメソッドはsendReceiveです。

例10-9は、ファイルのリクエストをRESTサーバーに送信し、そのファイルをディスクに保存する方法を示しています(例10-10を参照)。

例10-9 ファイルのリクエストの送信

RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();

restServiceAdapter.clearRequestProperties();
restServiceAdapter.setConnectionName("JagRestServerEndpoint");
restServiceAdapter.setRequestType(RestServiceAdapter.REQUEST_TYPE_GET);
restServiceAdapter.setRetryLimit(0);
restServiceAdapter.setRequestURI("/ftaServer/v1/kpis/123/related/1");

// Set credentials needed to access the REST server
String theUsername = "hr_spec_all";
String thePassword = "Welcome1";
String userPassword = theUsername + ":" + thePassword;
String encoding = new sun.misc.BASE64Encoder().encode(userPassword.getBytes());

restServiceAdapter.addRequestProperty("Authorization", "Basic " + encoding);

// Execute the SEND / RECEIVE operation.
// Since it is a GET request, there is no payload.
try {
this.responseRaw = restServiceAdapter.sendReceive("");
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("The response is:  " + this.responseRaw);

// Write the response to a file
writeByteArrayToFile(this.responseRaw);

例10-10は、例10-9のコードによって呼び出されるメソッドを示しています。このメソッドでは、ファイルに対するbyte[]レスポンスをディスクに保存します。

例10-10 ファイルのディスクへの保存

public void writeByteArrayToFile(byte[] fileContent) {
BufferedOutputStream bos = null;
try {
FileOutputStream fos = new FileOutputStream(new File(fileToSavePath));
bos = new BufferedOutputStream(fos);

// Write the byte [] to a file
System.out.println("Writing byte array to file");
bos.write(fileContent);
System.out.println("File written");
}
catch(FileNotFoundException fnfe) {
System.out.println("Specified file not found" + fnfe);
}
catch (IOException ioe) {
System.out.println("Error while writing file" + ioe);
}
finally {
if(bos != null) {
try {
// Flush the BufferedOutputStream
bos.flush();

// Close the BufferedOutputStream
bos.close();
}
catch (Exception e) {
}
}
}

10.6.2 データ・コントロール操作の起動について

AdfmfJavaUtilitiesのinvokeDataControlMethodメソッドを使用することで、PageDefファイルのmethodActionとして明示的に追加する必要がないデータ・コントロール操作を起動できます。

詳細および例は、Oracle Fusion Middleware Oracle ADFモバイルJava APIリファレンスを参照してください。

10.7 Webサービスの管理

ADFモバイルが提供する構成サービスを使用すると、管理者は、サーバーから異なるADFモバイル・アプリケーションに対するWebサービス接続のエンドポイントを更新できるようになり、結果としてユーザーはADFモバイル・アプリケーションの初回起動時に新しい接続を取得できます。これを行うには、異なるアプリケーションの複数のconnections.xmlファイルをホストおよび更新します。それ以降にアプリケーションを起動すると、ADFモバイル・アプリケーションの開発者はコンテナ・ユーティリティAPIを使用して新しい接続をチェックするように要求されます(第6.2.3項「checkforNewConfiguration」を参照)。

管理者は、基本認証によって保護されるリソースとしてconnections.xmlファイルを指定する必要があります(第17章「ADFモバイル・アプリケーションのセキュリティ」を参照)。

クライアント・アプリケーションでは、更新のチェックに構成サービスを使用できます。

「構成サービス」ダイアログでは次を実行できます。

- 構成サービスのURLを更新してこのアプリケーションの更新を保存します。
「構成サービス」ダイアログの入力を支援するURLの値を使用して構成サービスのURLをシードできます(例10-11を参照)。そのプリファレンスIDが存在する場合は、それが「構成サービス」ダイアログにシードされます。

connections.xmlファイルは、構成サービスのURLに存在する必要があります。構成サービスが有効の場合は、アプリケーション・バンドルではなく構成サービスからこのファイルを取得し、使用します。詳細は、第10.7.1項「URLの構築について」を参照してください。

- キーストアに保存されているユーザー名とパスワードを入力します。

管理者は、アプリケーションのadf-config.xmlファイルにある設定を使用して、アプリケーションの起動時に構成サービスを呼び出すかどうかを定義できます(例10-11を参照)。アプリケーションの初回起動時には、ダイアログが表示され、資格証明がキーストアにキャッシュされます。それ以降の起動(再起動は含まない)では、サーバーの変更をチェックし、「構成サービス」ダイアログの表示をトリガーすることをアプリケーションに指示する必要があります。ADFモバイルが提供するAPIでは、更新のチェックを実行し、その更新に対して「構成サービス」ダイアログを起動するためにクライアントAPIを呼び出すアプリケーション内の場所を指定できます。更新後は、アプリケーションは適切に実行されます(必要な場合は再起動されます)。

例10-11は、use-configuration-service-at-startupプロパティの使用方法を示しています。このプロパティのデフォルト値はfalseです。さらに、この例では、構成サービスの接続情報に関するユーザー・プロンプト内でエンドポイントURLのシードに使用されるadfmf-configuration-service-seed-urlプロパティが示されています。

例10-11 adf-config.xmlファイルでの構成サービスの設定

<adf:adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
<adf-property name="use-configuration-service-at-startup" value="true"/>
<adf-property name="adfmf-configuration-service-seed-url"
value="http://myhost.us.example.com:7777/
ConfigServerWebDavFolder/"/>
</adf:adf-properties-child>

構成サービスでは、アプリケーションの起動時に次の手順を実行します。

1. アプリケーションの起動時に起動します。

2. Documentsディレクトリをチェックして管理対象ファイルのコピーを検索します。それらが見つかった場合は、構成サービスのプロセスが終了します。
構成サービスによってDocumentsディレクトリ内の構成ファイルが見つからない場合は次の操作が実行されます。

- 構成サービスが使用されていないことをadf-config.xmlファイルが示している場合、構成サービスは管理対象ファイルをアプリケーション・バンドルからDocumentsディレクトリ管理対象フォルダにコピーして、構成サービスのプロセスを終了します。

- 構成サービスが使用されていることをadf-config.xmlファイルが示している場合、構成サービスは管理対象ファイルのダウンロードを試みます。

3. セキュアなストアから、格納されている資格証明をチェックします。資格証明が見つかり、それらによって構成サーバーにアクセスできる場合は、Documentsディレクトリの管理対象フォルダにconnections.xmlファイルがダウンロードおよび配置され、その時点で構成サービスのプロセスが終了します。
資格証明が見つからず、格納されている資格証明では構成サーバーへのアクセスに失敗する場合、ユーザーに接続情報(ユーザー名、パスワードおよびエンドポイントURL)の入力を求めるプロンプトが表示されます。

4. 構成サービスでは、アプリケーションが失敗またはドロップアウトするまでに、プロンプトまたはダウンロードを5回試みます。

5. 構成サーバーへの接続が正常に確立された場合は、connections.xmlファイルがダウンロードされ、それ以降の使用に備えて接続情報が格納されます。

図10-4は、iPhoneにおける構成サービスのプロンプト・ダイアログを示しています。

図10-4 iPhone上の構成サービス・ダイアログ

10.7.1 URLの構築について

構成サービスの各管理対象リソースへのURLが構築されています。これには、次のようにアプリケーションIDとファイル名が含まれています。

URLのhttp://my.server.com:port/SomeFolderLocationとアプリケーションIDのcom.mycompany.appnameがユーザーによって指定されている場合は、次のURLを使用して構成ファイルをダウンロードします。

http://my.server.com:port/SomeFolderLocation/com.mycompany.appname/connection.xml

11 ローカル・データベースの使用方法

この章では、ADFモバイル・アプリケーションを使用したローカルSQLiteデータベースの使用方法について説明します。

この章では、次の項目について説明します。

- 第11.1項「ローカルSQLiteデータベースの使用方法の概要」

- 第11.2項「ローカルSQLiteデータベースの使用方法」

11.1 ローカルSQLiteデータベースの使用方法の概要

SQLiteは、特に埋込みアプリケーション用に設計されたリレーショナル・データベース管理システム(RDBMS)です。

SQLiteには次の特性があります。

- ACID準拠: 他の従来のデータベース・システムと同様に、原子性、一貫性、独立性および永続性という特性を備えています。

- 軽量: アプリケーション内に直接埋め込むように設計された小さなCライブラリでデータベース全体が構成されています。

- 移植性: 様々な範囲のコンピュータ・アーキテクチャおよびオペレーティング・システム間でバイナリ互換性がある単一ファイルでデータベースは自己完結型となります。

詳細は、http://www.sqlite.orgを参照してください。

ローカルSQLiteデータベースの使用例は、HRと呼ばれるADFモバイルのサンプル・アプリケーションを参照してください。ここでのデータは、すべてのOracleデータベースで提供されるデフォルトのHRスキーマに基づいています。データは、ローカルSQLiteデータベースに格納されており、各起動間で持続されています。HRアプリケーションは、開発コンピュータのjdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samplesディレクトリ内にあるPublicSamples.zipファイルに配置されています。

11.1.1 SQLiteと他のリレーショナル・データベースとの相違点

SQLiteは、埋込みデータベース・システムとして使用する設計になっており、通常は1人のユーザーによって使用され、アプリケーションに直接リンクされることも多くあります。他方、エンタープライズ・データベースは、クライアントとサーバーの分散された環境における高い同時実行性を求めて設計されています。このような違いがあるため、Oracleデータベースと比較して複数の制約が存在します。最も重要な相違点を次に示します。

- 同時実行性

- SQLのサポートおよび解釈

- データ型

- データベース・トランザクション

- 認証

詳細は、http://www.sqlite.org/docs.htmlにあるSQLiteサイトのドキュメント・セクションを参照してください。

11.1.1.1 同時実行性

SQLiteデータベースの単一インスタンスは、常に、単一の読取り/書込み接続または複数の読取り専用接続のいずれかを持つことができます。

ロック・メカニズムが粗いため、SQLiteでは、同一のデータベース・インスタンスに対する複数の読取り/書込み接続がサポートされていません。詳細は、http://www.sqlite.org/lockingv3.htmlにあるSQLiteサイトのドキュメント・セクションで入手可能な『File Locking And Concurrency In SQLite Version 3』を参照してください。

11.1.1.2 SQLのサポートおよび解釈

SQLiteはSQL92標準でコンパイルされますが、サポートされていない構成が次を含めていくつか存在します。

- RIGHT OUTER JOIN

- FULL OUTER JOIN

- GRANT

- REVOKE

詳細は、http://www.sqlite.org/omitted.htmlにあるSQLiteサイトのドキュメント・セクションで入手可能な『SQL Features That SQLite Does Not Implement』を参照してください。

SQLiteによるSQLの解釈の方法については、http://www.sqlite.org/lang_createtable.htmlにあるSQLiteサイトのドキュメント・セクションで入手可能な『SQL As Understood by SQLite』を参照してください。

11.1.1.3 データ型

大部分のデータベース・システムは強く型指定をしているのに対して、SQLiteは動的な型指定のため、宣言された型とは無関係にどの列にどの値を格納することもできます。たとえば、数値列に文字列値が間違って格納された場合でも、SQLiteではエラーは戻されません。詳細は、http://www.sqlite.org/datatype3.htmlにあるSQLiteサイトのドキュメント・セクションで入手可能な『Datatypes In SQLite Version 3』を参照してください。

11.1.1.4 データベース・トランザクション

SQLiteはACID準拠であるためトランザクションをサポートしていますが、SQLiteとOracleのトランザクション・サポートの間には基本的な相違点がいくつか存在します。

- ネストされたトランザクション: SQLiteでは、ネストされたトランザクションをサポートしません。単一のトランザクションのみを常時アクティブにできます。

- コミット: SQLiteでは、複数の読取り専用接続または単一の読取り/書込み接続のいずれかが常時可能です。したがって、同一のデータベースに対して複数の接続がある場合は、データベースの変更を試みる最初の接続のみが成功します。

- ロールバック: SQLiteでは、開いているすべてのResultSetsを閉じるまではトランザクションのロールバックができません。

詳細は、http://www.sqlite.org/different.htmlにあるSQLiteサイトのドキュメント・セクションで入手可能な『Distinctive Features of SQLite』を参照してください。

11.1.1.5 認証

SQLiteでは、ロールベースまたはユーザーベースの認証はどの形式もサポートしていません。デフォルトで、どのユーザーもファイル内のすべてのデータにアクセスできます。ただし、ADFモバイルでは、使用可能な暗号化ルーチンを提供することで、データを保護し、有効な資格証明セットを持たないユーザーによるアクセスを防ぎます。

11.2 ローカルSQLiteデータベースの使用方法

通常SQLiteを使用する場合は、次のことを知っておく必要があります。

- データベースへの接続方法

- SQLスクリプトを使用してデータベースを初期化する方法またはデスクトップ上でデータベースを初期化する方法

- データベースを暗号化および復号化する方法

11.2.1 データベースへの接続方法

SQLiteデータベースへの接続は、Oracleデータベースへの接続を開く場合とは少し異なります。つまり、最初の接続を取得すると、同じJDBC APIおよびSQL構文の大部分が使用可能になり、データベースの問合せと変更が可能になります。

ユーザーのアプリケーションに関連付けられたjava.sql.Connectionオブジェクトを使用して、SQLiteデータベースに接続します。接続を作成する場合は、どのSQLite JDBC URLもjdbc:sqlite:というテキストで始まるようにします。

例11-1は、暗号化されていないデータベースと接続を開く方法を示しています。

例11-1 暗号化されていないデータベースとの接続

java.sql.Connection connection = new SQLite.JDBCDataSource
("jdbc:sqlite:/path/to/database").getConnection();

例11-2は、暗号化されたデータベースと接続を開く方法を示しています。

例11-2 暗号化されたデータベースとの接続

java.sql.Connection connection = new SQLite.JDBCDataSource
("jdbc:sqlite:/path/to/database").getConnection(null,"password");

前述の例では、getConnectionメソッドの最初のパラメータがユーザー名となっていますが、SQLiteではユーザーベースのセキュリティがサポートされないため、この値は無視されます。

注意:

SQLiteでは、不正なパスワードで暗号化されたデータベースを開いた場合でも、エラー・メッセージが表示されません。同様に、暗号化されていないデータベースをパスワードで誤って開いた場合でも警告は表示されません。そのかわりに、データの読取りまたは変更を試みた場合は、エラー: ファイルが暗号化されているか、ファイルがデータベースではありません。というメッセージとともにSQLExceptionがスローされます。

11.2.2 SQLスクリプトを使用してデータベースを初期化する方法

通常、アプリケーションの起動時にSQLスクリプトを使用してデータベースを初期化できます。例11-3は、サポートされたSQL構文(第11.1.1.2項「SQLのサポートおよび解釈」で説明)の一部を示すSQL初期化スクリプトを示しています。この構文では、DROP TABLE、CREATE TABLEおよびINSERTの各コマンドとNUMBERおよびVARCHAR2の各データ型が使用されています。

例11-3 SQL初期化スクリプト

DROP TABLE IF EXISTS PERSONS;

CREATE TABLE PERSONS
(
PERSON_ID NUMBER(15) NOT NULL,
FIRST_NAME VARCHAR2(30),
LAST_NAME VARCHAR2(30),
EMAIL VARCHAR2(25) NOT NULL
);

INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 100, 'David', 'King', 'steven@king.net');
INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 101, 'Neena', 'Kochhar', 'neena@kochhar.net');
INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 102, 'Lex', 'De Haan', 'lex@dehaan.net');
INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 103, 'Alexander', 'Hunold', 'alexander@hunold.net');
INSERT INTO PERSONS (PERSON_ID, FIRST_NAME, LAST_NAME, EMAIL) VALUES ( 104, 'Bruce', 'Ernst', 'bruce@ernst.net');

SQLスクリプトを使用するには、それをADFモバイル・アプリケーションのApplicationControllerプロジェクトにリソースとして追加します。サンプル・スクリプトは、META-INFディレクトリでinitialize.sqlとして保存されているものとします。例11-4は、SQLスクリプトを解析し、その文を実行するために追加する必要のあるコードが示されています。

例11-4 SQLスクリプトからのデータベースの初期化

private static void initializeDatabaseFromScript() throws Exception {
InputStream scriptStream = null;
Connection conn = null;
try {
// ApplicationDirectory returns the private read-write sandbox area
// of the mobile device's file system that this application can access.
// This is where the database is created
String docRoot = AdfmfJavaUtilities.getDirectoryPathRoot
(AdfmfJavaUtilities.ApplicationDirectory);
String dbName = docRoot + "/sample.db";

// Verify whether or not the database exists.
// If it does, then it has already been initialized
// and no furher actions are required
File dbFile = new File(dbName);
if (dbFile.exists())
return;

// If the database does not exist, a new database is automatically
// created when the SQLite JDBC connection is created
conn = new SQLite.JDBCDataSource("jdbc:sqlite:" + docRoot +
"/sample.db").getConnection();

// To improve performance, the statements are executed
// one at a time in the context of a single transaction
conn.setAutoCommit(false);

// Since the SQL script has been packaged as a resource within
// the application, the getResourceAsStream method is used
scriptStream = Thread.currentThread().getContextClassLoader().
getResourceAsStream("META-INF/initialize.sql");
BufferedReader scriptReader = new BufferedReader
(new InputStreamReader(scriptStream));
String nextLine;
StringBuffer nextStatement = new StringBuffer();

// The while loop iterates over all the lines in the SQL script,
// assembling them into valid SQL statements and executing them as
// a terminating semicolon is encountered
Statement stmt = conn.createStatement();
while ((nextLine = scriptReader.readLine()) != null) {
// Skipping blank lines, comments, and COMMIT statements
if (nextLine.startsWith("REM") ||
nextLine.startsWith("COMMIT") ||
nextLine.length() < 1)
continue;
nextStatement.append(nextLine);
if (nextLine.endsWith(";")) {
stmt.execute(nextStatement.toString());
nextStatement = new StringBuffer();
}
}
conn.commit();
}
finally {
if (conn != null)
conn.close();
}
}

注意:

例11-4では、わかりやすくするためにエラー処理が省略されました。

例11-5で示すとおり、LifeCycleListenerImplのstartメソッドからデータベース初期化コード(例11-4を参照)を起動します。

例11-5 データベース初期化コードの起動

public void start() {
try {
initializeDatabaseFromScript();
}
catch (Exception e) {
Trace.log(Utility.FrameworkLogger,
Level.SEVERE,
LifeCycleListenerImpl.class,
"start",
e);
}
}

11.2.3 デスクトップ上でデータベースを初期化する方法

SQLiteデータベースは自己完結型でプラットフォーム間のバイナリ互換性があるため、同じデータベース・ファイルをiOS、Android、Windows、LinuxおよびMac OSの各プラットフォームで使用できます。複雑なケースでは、サード・パーティのツール(MesaSQLite、SQLiteManager、SQLite Database Browserなど)を使用してデスクトップ上でデータベースを初期化し、結果ファイルをアプリケーション内のリソースとしてパッケージ化できます。

データベースを使用するには、それをADFモバイル・アプリケーションのApplicationControllerプロジェクトにリソースとして追加します。データベースは、META-INFディレクトリにsample.dbとして保存されているものとします。例11-6は、アプリケーションからモバイル・デバイスのファイル・システムにデータベースをコピーしてデータベースへのアクセスを有効化するために追加する必要のあるコードを示しています。

例11-6 デスクトップ上のデータベースの初期化

private static void initializeDatabase() throws Exception {
InputStream sourceStream = null;
FileOutputStream destinationStream = null;
try {
// ApplicationDirectory returns the private read-write sandbox area
// of the mobile device's file system that this application can access.
// This is where the database is created
String docRoot = AdfmfJavaUtilities.getDirectoryPathRoot
(AdfmfJavaUtilities.ApplicationDirectory);
String dbName = docRoot + "/sample.db";

// Verify whether or not the database exists.
// If it does, then it has already been initialized
// and no furher actions are required
File dbFile = new File(dbName);
if (dbFile.exists())
return;

// Since the database has been packaged as a resource within
// the application, the getResourceAsStream method is used
scriptStream = Thread.currentThread().getContextClassLoader().
getResourceAsStream("META-INF/sample.db");
destinationStream = new FileOutputStream(dbName);
byte[] buffer = new byte[1000];
int bytesRead;
while ((bytesRead = sourceStream.read(buffer)) != -1) {
destinationStream.write(buffer, 0, bytesRead);
}
}
finally {
if (sourceStream != null)
sourceStream.close();
if (destinationStream != null)
destinationStream.close();
}
}

注意:

例11-6では、わかりやすくするためにエラー処理が省略されました。

例11-7で示すとおり、LifeCycleListenerImplのstartメソッドからデータベース初期化コード(例11-6を参照)を起動します。

例11-7 データベース初期化コードの起動

public void start() {
try {
initializeDatabase();
}
catch (Exception e) {
Trace.log(Utility.FrameworkLogger,
Level.SEVERE,
LifeCycleListenerImpl.class,
"start",
e);
}
}

11.2.4 コミット処理について

Commit文があってもこれは無視されます。各文は、SQLスクリプトから読み込まれる際にコミットされます。

11.2.5 ADFモバイルでのSQLite JDBCドライバの制限

java.sqlパッケージからの次のメソッドは、ADFモバイル内では制限があるか、サポートされていません。

- ResultSetのgetByteメソッドはサポートされていません。このメソッドを使用した場合は、実行時にメソッドからSQLExceptionがスローされます。

- (ResultSetを戻す文に対してのみtrueを戻すのとは対照的に)Statementのexecuteメソッドは常にtrueを戻します。

11.2.6 データベースを暗号化および復号化する方法

ADFモバイルでは、初期またはそれ以降に暗号化したSQLiteデータベースを提供できます。これを行うには、データベースの接続を確立し(第11.2.1項「データベースへの接続方法」を参照)、次のユーティリティ・メソッドを使用して新しい鍵でデータベースを暗号化する必要があります。

AdfmfJavaUtilities.encryptDatabase(connection, "newPassword");

注意:

データベースを不正に開いて(不正なパスワードを使用して暗号化されたデータベースを開くなど)、再び暗号化した場合は、以前の正しいパスワード、不正なパスワード、新しいパスワードのいずれでもデータベースのロックを解除できなくなり、取り返しのつかないデータの損失につながります。

暗号化に加えて、データベースを永続的に復号化することもできます。これを行うには、暗号化されたデータベースを正しいパスワードで開いて、次のメソッドを使用します。

AdfmfJavaUtilities.decryptDatabase(connection);

第V部

高度なトピック

ここでは、ネイティブのデバイス制御にアクセス可能なリモートURLから導出されたコンテンツを有効化する方法や、ユーザー・プリファレンス・ページでADFモバイル・アプリケーションを拡張する方法、さらには制約の設定によりアプリケーション機能の表示方法やそれにアクセスする方法をどのようにして決定できるのかについて説明します。

第V部の内容は次のとおりです。

- 第12章「リモートURLとしてのアプリケーション機能の実装」

- 第13章「ユーザー・プリファレンスの有効化」

- 第14章「制約の設定」

- 第15章「Oracle Cloud上のデータへのアクセス」

12 リモートURLとしてのアプリケーション機能の実装

この章では、デバイス・サービスに対して、リモートURLからのコンテンツを使用するアプリケーション機能をアクセス可能(または制限可能)にする方法について説明します。

この章では、次の項目について説明します。

- 第12.1項「リモートURLアプリケーションの概要」

- 第12.2項「リモートURL実装によるPhoneGapへのアクセスの有効化の概要」

- 第12.3項「ホワイトリストを使用したリモート・アプリケーションによるデバイス・サービスへのアクセスの有効化」

- 第12.4項「アプリケーション・コンポーネントのホワイトリストの作成」

- 第12.5項「リモートURLページでのブラウザ・ナビゲーション・バーの有効化」

12.1 リモートURLアプリケーションの概要

第5.9.1項「アプリケーション・コンテンツの定義方法」の説明に従って、adfmf-feature.xmlファイルの概要エディタにあるアプリケーション機能のコンテンツ・タイプをリモートURLとして構成することで、構成されたURLから供給されるブラウザベースのアプリケーションを作成します。このようなサーバー・ホスト型のアプリケーションは、ADFモバイルAMXまたはObjective-Cなどのプラットフォーム固有言語で記述されたアプリケーションとは次の2つの点で異なります。1つはこれらは偶発的な使用を目的としている点、もう1つはこれらのやり取りがデバイス・ブラウザの機能によって異なるためデバイスのメモリーまたはサービスに直接アクセスできない点です。

スマートフォン向けのブラウザベースのアプリケーションはApache Trinidadコンポーネントで作成され(http://myfaces.apache.org/trinidad/を参照)、様々なフィーチャー・フォンおよびスマートフォンの適切なレンダリングが可能です。タブレット上で実行されるアプリケーションは、ADFデスクトップのWebアプリケーションと同じ方法で作成できます。

注意:

リモートURLからコンテンツを導出するアプリケーション機能にはADFモバイル・ブラウザを使用することをお薦めします。ADFモバイル・ブラウザ・アプリケーションは、Apache Trinidadコンポーネントが移入されたJSFページで構成されます。詳細は、『Oracle Fusion Middleware Oracle Application Development Frameworkモバイル・ブラウザ開発者ガイド』を参照してください。

12.2 リモートURL実装によるPhoneGapへのアクセスの有効化の概要

デフォルトでは、コンタクト先またはGPS(グローバル・ポジショニング・システム)などのデバイス機能へのアクセスは、ローカルで格納されたHTMLページのバンドルまたはADFモバイルAMXとして実装されたADFモバイル・アプリケーションに制限されています。後者の場合は、ADFモバイルAMX UIコンポーネントにデバイスのデータ・コントロールを追加することで、アプリケーション機能によるデバイス機能へのアクセスが可能になります。詳細は、第9.5項「DeviceFeaturesデータ・コントロールの使用方法」を参照してください。ただし、リモートURL実装では、PhoneGap JavaScript APIを使用したデバイスネイティブのコントロールにのみアクセスできます。第6章「アプリケーション機能の表示制御」の説明のとおり、ADFモバイルJavaScriptファイルは、ADFモバイルがPhoneGapと連携するために使用するメカニズムです。

12.3 ホワイトリストを使用したリモート・アプリケーションによるデバイス・サービスへのアクセスの有効化

ADFモバイルはホワイトリスト(アプリケーションのWebビュー内で開いているURLのレジストリ)の概念をサポートしており、GPS、カメラ、ファイル・システムなどの様々なデバイス・サービスにアクセスできます。Webページがホワイトリストに含まれていない(つまりホワイトリストされていない)場合は、そのかわりに、ADFモバイルPhoneGap実装によってデバイス・ブラウザ(Safariなど)でWebページが開かれます。ホワイトリストしないかぎり、Webビュー内にリモートWebページを開くことはできません。

デフォルトでは、connections.xmlファイルに定義されているドメイン、つまりADFモバイル・アプリケーションに定義されているすべての接続のリポジトリは、自動的にホワイトリストされます。図12-4に示すとおり、これらの接続は、「URL接続の作成」ダイアログを使用して定義されます。ADFモバイルでは、各接続文字列からドメインを解析して、これらのドメインをホワイトリストに追加します。

図12-1 リモートURLアプリケーション機能のコンテンツを取得するための接続の作成

次に、JDeveloperでは、「アプリケーション・リソース」パネルにあるconnections.xmlファイルに接続情報が移入され、図12-2のoracleやconnection 1などのような接続リソースが作成されます。

注意:

ホワイトリストされたドメインのみがWebビューで開かれ、その他の(ホワイトリストされていない)ドメインはすべてデバイス・ブラウザで開かれます。

12.3.1 デバイス機能へのアクセスの制御方法

adfmf-application.xmlファイルを編集することによって、図12-2に示すとおり、PhoneGapが有効化されたデバイス・サービスへのアクセスをアプリケーション機能単位で制限できます。デフォルトでは、すべてのアプリケーション機能にこのようなアクセス権があるため、ADFモバイル・アプリケーションに構成されているホワイトリストされたドメインはすべてデバイスにアクセスできます。ADFモバイルがconnections.xmlファイルから追加するドメインに加えて、第12.3.2項「ホワイトリストの作成方法」の説明のとおり、adfmf-application.xmlファイルの「セキュリティ」ページを使用してドメインをホワイトリストすることもできます。

図12-2 ドメイン・アクセスを制限するための<adfmf-FeatureReference>の編集

図12-2で説明した「ソース」エディタには、allowDeviceAccess属性が移入された<adfmf-feature-reference>要素が示されています。JDeveloperは、リモートURLコンテンツを含むすべてのアプリケーション機能にこの属性を移入します。この属性はデフォルトでtrueに設定されています。このデフォルトの設定では、すべてのURLでPhoneGap APIにアクセスできるようになっています。

始める前に:

adfmf-feature.xmlファイルの概要エディタ(「アプリケーション・ナビゲータ」の「プロジェクト」パネルの「ViewController」ノードおよび「META-INF」ノードの下に配置されている)を使用して、第5.5.1項「モバイル・アプリケーションのコンテンツの指定方法」の説明に従い、アプリケーションのコンテンツをリモートURLとして指定して、接続を作成します。

adfmf-application.xmlファイルの概要エディタを開くには、adfmf-application.xmlファイル(図12-2に示すとおり、「アプリケーション・リソース」パネルの「リソース」ノードおよび「ADF META-INF」ノードの下に配置されています)をダブルクリックします。

ソース・エディタ、「構造」ウィンドウおよびプロパティ・エディタを使用してこの属性を構成できます。

デバイス・サービスへのアクセスを制限するには:

1. adfmf-application.xmlファイルを開いて、「機能参照」ページを開きます。

2. 図12-3に示すとおり、「機能参照」テーブルの「デバイス・アクセスの許可」列でドロップダウン・メニューを使用してデフォルト値(<default> true)をfalseに変更します。

図12-3 「機能参照」ページを使用したドメインによるデバイス・サービスへのアクセスの防止

12.3.2 ホワイトリストの作成方法

図12-4に示すとおり、adfmf-application.xmlの「セキュリティ」ページでホワイトリストを構成します。

図12-4 ホワイトリストの構成

始める前に:

ADFモバイル・アプリケーションで構成された一部のURLが他のドメインで開かれる可能性があることに注意してください。

ホワイトリストを作成するには:

1. adfmf-application.xmlファイルを開いて、「セキュリティ」ページを選択します。

2. 「追加」をクリックして、アプリケーション機能のWebビュー内からコールされる可能性があるドメインを入力します。これらのドメインにはワイルドカード(*)を含めることができます。たとえば、*.example.comは、*.example.*と同様に有効なドメイン・エントリです。完全修飾パスは入力できません。

注意:

ワイルドカードのみを入力すると、Webビューではすべてのドメインをリクエストできるため、セキュリティ上のリスクを招く可能性があります。また、すべてのドメインをホワイトリストに追加すると、それらのすべてがWebビュー内で開けるのみではなく、それらのすべてがデバイスにアクセスできるようになります(そのように意図しているかどうかは無関係に)。

12.3.3 ホワイトリストにドメインを追加する場合の処理

ドメインを追加すると、JDeveloperでは、例12-1に示すとおり<adfmf:remoteURLWhiteList>要素が更新されます。

例12-1 ホワイトリストの構成

...
<adfmf:remoteURLWhiteList>
<adfmf:domain>*.oracle.*</adfmf:domain>
<adfmf:domain>www.oracle.*</adfmf:domain>
</adfmf:remoteURLWhiteList>
...

12.3.4 リモートURLについて

一部のURLは、ホワイトリスト・ドメインの一部ではない可能性のあるURLにリダイレクトされます。これらのURLは、アプリケーションのWebビューよりもデバイス・ブラウザで開かれる可能性があります。たとえば、www.oracle.com(<adfmf:domain>www.oracle.com<adfmf:domain>)をホワイトリストしてデバイス上でそのサイトを開いた場合、ADFモバイルがそのサイトのモバイル・バージョン(www.oracle.mobi)にリダイレクトされます。これは、ホワイトリストの受渡しが行われないからです。図12-5は、ホワイトリストに追加されていないWebページをデバイス・ブラウザ内で開いたものを示しています。

図12-5 ADFモバイルのWebビューではなくデバイス・ブラウザで開かれたWebページ

www.oracle.comをアプリケーションのWebビュー内で開けるようにするには、例12-1に示すように*.oracle.*またはwww.oracle.*を指定する必要があります。

ADFモバイルのホワイトリストはドメインレベルのため、アプリケーション機能のWebビューで開くことをホワイトリストされたドメイン内の個々のページについて制限することはできず、すべてのページが許可されます。

12.4 アプリケーション・コンポーネントのホワイトリストの作成

別のドメインを指すURLへのリンクを含むページにホワイトリストを使用します。このようなページは、ADFモバイルのWebビューではなくデバイス・ブラウザで別途開かれます。このような場合、例12-2の<goLink2>にあるurl属性など、アプリケーションの外部を指す<amx:goLink>コンポーネントのurl属性を使用して、アンカー・タグまたは<amx:goLink>コンポーネントを作成できます。

例12-2 URLパラメータを使用した<amx:goLink>

<?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:panelGroupLayout id="panelGroupLayout1">
<amx:goLink text="This opens in the device browser"
id="golink1"
url="http://www.example.com"
shortDesc="Opens in device browser"/>
<amx:goLink text="This opens in the web view"
id="golink2"
url="http://www.example2.com"
shortDesc="Accesses device services"/>
</amx:panelGroupLayout>
</amx:panelPage>
</amx:view>

また、第8.3項「UIコンポーネントの作成と使用方法」も参照してください。

12.5 リモートURLページでのブラウザ・ナビゲーション・バーの有効化

ADFモバイルでは、図12-6に示すように、ADFモバイルのWebビュー内で開く、リモートで供給されるWebコンテンツとして実装されるアプリケーション機能に対して、戻る、進むおよびリフレッシュの各アクション用のボタンが付いたナビゲーション・バーを追加できます。進むまたは戻るのいずれかの移動が不可能な場合は、進むと戻るのボタンが無効になります。

注意:

戻るボタンは、Androidデバイスでは無効になります。

図12-6 ナビゲーション・ボタンとリフレッシュ・ボタンを表示するリモートWebページ

12.5.1 リモートURLアプリケーション機能へのナビゲーション・バーの追加方法

adfmf-feature.xmlファイルの概要エディタの「コンテンツ」タブで、ユーザーがリモート・コンテンツを移動またはリフレッシュできるようにします。

始める前に:

第5.9項「アプリケーション機能のコンテンツ・タイプの定義」の説明に従って、まず「リモートURL」を選択し、次にホスト・サーバーへの接続を作成することにより、リモートでホストされるアプリケーションから配信されるアプリケーション機能のコンテンツを指定します。

ドメインがホワイトリストに含まれていることを確認します。

ナビゲーション・バーを有効にするには:

1. adfmf-feature.xmlファイルの「機能」表にリストされている「リモートURL」アプリケーション機能を選択します。

2. 「コンテンツ」をクリックします。

3. 図12-7に示すとおり、「ブラウザ・ナビゲーション・ボタンの表示」を選択します。

図12-7 ナビゲーション・オプションの選択

12.5.2 リモートURLアプリケーション機能のブラウザ・ナビゲーション・ボタンを有効にする場合の処理

JDeveloperでは、showNavButtonsと呼ばれる属性でadfmf:remoteURL要素を更新します。例12-3に示すとおり、ここではtrueに設定されています。

例12-3 showNavButtons属性

<?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="oraclemobile" name="oraclemobile">
<adfmf:content id="oraclemobile.1">
<adfmf:remoteURL connection="connection1"
showNavButtons="true"/>
</adfmf:content>
</adfmf:feature>
</adfmf:features>

アプリケーションをデプロイすると、図12-8に示すとおり、ADFモバイルでは、進む、戻るおよびリフレッシュの各ボタンがリモートURLアプリケーション機能のホームページから移動されるWebページに適用されます。

Figure 12-8 リモートURLアプリケーション機能での移動

13 ユーザー・プリファレンスの有効化

この章では、ADFモバイルのアプリケーションレベルとアプリケーション機能レベルの両方のユーザー・プリファレンス・ページを作成する方法について説明します。

この章では、次の項目について説明します。

- 第13.1項「ADFモバイル・アプリケーションのユーザー・プリファレンス・ページの作成」

- 第13.2項「アプリケーション機能のユーザー・プリファレンス・ページの作成」

- 第13.3項「ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法」

- 第13.4項「プラットフォームによる表示の差異」

13.1 ADFモバイル・アプリケーションのユーザー・プリファレンス・ページの作成

プリファレンスによって、エンド・ユーザーが構成可能な設定を追加できます。adfmf-application.xmlおよびadfmf-feature.xmlの両方のファイル内で、<adfmf:preferernces>要素を使用してユーザー・プリファレンス・ページを定義します。例13-1に示すとおり、<adfmf:preferenceGroup>と呼ばれる<adfmf:preferences>の子要素とその子要素によってユーザー・プリファレンスを定義します。これには、読取り専用文字列、ドロップダウン・メニューや、例13-1のケースのようにアプリケーション設定の追加オプションをユーザーに提示する子ページなど、様々な形でオプションを提示するページを作成します。

また、<adfmf:preferences>要素を使用して、各アプリケーション機能内でユーザーが管理するプリファレンスを作成します。

例13-1 <adfmf:preferences>要素を使用したアプリケーションレベルのプリファレンスの定義

<?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="MobileApplication"
id="com.company.MobileApplication"
appControllerFolder="ApplicationController"
version="1"
vendor="oracle"
listener-class="application.LifeCycleListenerImpl">
<adfmf:description>This is an ADF Mobile application</adfmf:description>
<adfmf:featureReference id="PROD"/>
<adfmf:featureReference id="HCM"/>
<adfmf:featureReference id="Customers"/>
<adfmf:preferences>
<adfmf:preferenceGroup id="a" label="Prefs Group A">
<adfmf:preferenceBoolean id="a1-sound" label="Sound Effects"/>
<adfmf:preferenceNumber id="a2-retries" label="Retries" default="3"/>
<adfmf:preferenceList id="a3-background" label="Background" default="3">
<adfmf:preferenceValue name="None" value="0"/>
<adfmf:preferenceValue name="Field" value="1"/>
<adfmf:preferenceValue name="Galaxy" value="2"/>
<adfmf:preferenceValue name="Mountain" value="3"/>
</adfmf:preferenceList>
<adfmf:preferenceText id="a4-name" label="Default Name"/>
<adfmf:preferencePage id="aa" label="Prefs SubGroup AA">
<adfmf:preferenceGroup id="aa-sec" label="Security">
<adfmf:preferenceBoolean id="aa-sec-useSec" label="Use Security"/>
<adfmf:preferenceNumber id="aa-sec-timeout" label="Timeout (secs)" default="120"/>
</adfmf:preferenceGroup>
</adfmf:preferencePage>
</adfmf:preferenceGroup>
<adfmf:preferenceGroup id="b" label="Prefs Group B">
<adfmf:preferenceBoolean id="b-cloudSync" label="Cloud Sync"/>
<adfmf:preferenceList id="b-dispUsage" label="Display Usage As" default="1">
<adfmf:preferenceValue name="Percent" value="1"/>
<adfmf:preferenceValue name="Minutes" value="2"/>
</adfmf:preferenceList>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:application>

図13-1では、子ユーザー・プリファレンス・ページを開くことでそれに続くオプションを提供する方法の例を示しています。

図13-1 ユーザー・プリファレンス・ページ

プリファレンス・ページは<adfmf:preferenceGroup>要素内で定義され、次の子要素が存在します。

- <adfmf:preferencePage>: ユーザー・インタフェースに新しいページを指定します。

- <adfmf:preferenceList>: ユーザーに特定のオプション・セットを提供します。

- <adfmf:preferenceValue>: リスト要素を定義する子要素です。

- <adfmf:preferenceBoolean>: ブール設定です。

- <adfmf:preferenceText>: テキスト・プリファレンス設定です。

これらの要素およびその属性の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。

ADFモバイル・アプリケーションおよびアプリケーション機能レベルの両方のプリファレンス・ページを作成する例については、PrefDemoサンプル・アプリケーションを参照してください。このサンプル・アプリケーションは、開発コンピュータのJDeveloperインストール・ディレクトリ内で次の場所にあるPublicSamples.zipファイルに置かれています。

jdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samples

PrefDemoアプリケーションは、アプリケーションレベルの設定ページと、ADFモバイルAMXとして実装されている3つのアプリケーション機能のプリファレンス・ページで構成されています。図13-2は、通常の設定ページから起動する、PrefDemoアプリケーションの設定ページを示しています。この図では、プリファレンス設定ページをiOSの設定アプリケーションから起動しています。

図13-2 PrefDemoアプリケーションの設定ページ

図13-3で「App」、「Feature1」(これが選択されています)および「Feature 2」と表示されているアプリケーション機能のプリファレンス・ページでは、ADFモバイル・ブール・スイッチ、入力テキストおよび出力テキストの各コンポーネントから構築されたプリファレンス・ページの例が示されています。これらのコンポーネントは、EL(式言語)を使用してアプリケーション機能やその内部に構成されている様々な<adfmf:preferences>コンポーネントにアクセスします。詳細は、第13.3項「ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法」を参照してください。

図13-3 PrefDemoからのアプリケーション機能のプリファレンス・ページ

PrefDemoアプリケーションでは、ビュー・アクティビティとページ・リフレッシュが可能な制御フロー・ケースで構成される単一のバインド・タスク・フローによって、ADFモバイルAMXの各プリファレンス・ページが参照されます。

13.1.1 モバイル・アプリケーションレベルのプリファレンス・ページの作成方法

adfmf-application.xml概要エディタの「プリファレンス」ページ(図13-4を参照)では、<adfmf:preferenceGroup>内の子プリファレンス・ページ要素をネストすることでアプリケーションレベルのプリファレンス・ページ・セットを構築できます。このページでは、<adfmf:preferencesGroup>およびその子要素が同様に名付けられたオプション(「プリファレンス・グループ」、「プリファレンス・ページ」、「プリファレンス・リスト」など)として示され、JDeveloperの「構造」ウィンドウと同様にこれらを階層(またはツリー)にアセンブルします。

図13-4 プリファレンス・ページを使用したモバイル・アプリケーションレベルのプリファレンスの追加

adfmf-application.xmlファイルを正しく構成するには、図13-4に示す「プリファレンス」ページの「追加」ドロップダウン・リストを使用してユーザー・プリファレンス・ページを構築します。また、図13-5に示す「プリファレンス」パレットからコンポーネントをドラッグして、エディタ、「ソース」ウィンドウまたは「構造」ウィンドウのいずれかにドロップできる一方で、そのページのドロップダウン・リストには、選択されたプリファレンス要素に対して、適切な親、子または兄弟の関係を持つことができる要素のみが提示されます。たとえば、図13-4には、プリファレンス・グループ要素であるOracleモバイル・アプリケーション内に挿入できるコンポーネントのみが示されています。また、このエディタでは、各プリファレンス要素に固有の属性に対して値を入力できます。

図13-5 「コンポーネント・パレット」内の「プリファレンス」

プリファレンス・ページを作成するには:

1. 「プリファレンス」をクリックします。

2. 「追加」をクリックして、親である<adfmf:preferenceGroup>要素を作成します。

3. 次の情報を「プリファレンス・グループの挿入」ダイアログ(図13-6を参照)に入力します。

図13-6 親プリファレンス・グループ要素の定義

- プリファレンス・グループ要素の一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。ユーザー・インタフェースにこのテキストを表示する方法の例は、図13-1の例を参照してください。

4. 「追加」をクリックし、「前に挿入」、「内部に挿入」、「後ろに挿入」の各オプションを使用してさらにプリファレンス・ページを定義し、XML文書が正しく構成されるようにします。

13.1.1.1 新しいユーザー・プリファレンス・ページの作成方法

プリファレンス・ページ・コンポーネントでは新しいユーザー・インタフェース・ページを作成できます。「前に挿入」、「内部に挿入」、「後ろに挿入」の各オプションを使用してプリファレンス・ページを作成します。

始める前に:

プリファレンス・グループ要素を作成する必要があります。

新しいユーザー・プリファレンス・ページを作成するには:

1. 「プリファレンス・グループ」要素を選択します。

2. 「追加」をクリックして「内部に挿入」(プリファレンス・グループ)を選択し、「プリファレンス・ページ」を選択します。図13-7に示すとおり、プリファレンス・グループはMobileAppと呼ばれています。

図13-7 プリファレンス・ページ・コンポーネントの選択

3. 「プリファレンス・ページの挿入」ダイアログ(図13-8を参照)に次のプリファレンス・ページ属性を定義します。

- プリファレンス・ページ要素の一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図13-8 「プリファレンス・ページの挿入」ダイアログ

4. プリファレンス・ページを選択し、図13-9に示すとおり、「内部に挿入」(プリファレンス・ページ)→「プリファレンス・グループ」と選択することで、子プリファレンス・グループ要素を挿入し、プリファレンス・ページの本体を作成します。子プリファレンス・グループの一意の識別子と表示名を定義すると、これにプリファレンス・リスト要素などの他の要素を移入できます(例13-2を参照)。

図13-9 プリファレンス・グループのプリファレンス・ページへの追加

13.1.1.2 プリファレンス・ページを追加する場合の処理

概要エディタでプリファレンス・ページとその子プリファレンス・グループ・コンポーネントを定義すると、JDeveloperでは、例13-2と同様の属性を使用して<adfmf:preferencePage>が生成されます。<adfmf:preferencePage>は、親<adfmf:preferenceGroup>要素内にネストされます。

例13-2 <adfmf:PreferencePage element>の追加

<adfmf:preferences>
<adfmf:preferenceGroup id="gen" label="Oracle Mobile App">
<adfmf:preferencePage id="application_version" label="Version">
<adfmf:preferenceGroup id="version_select" label="Select Your Version">
<adfmf:preferenceList id="edition" label="Edition" default="PERSONAL">
<adfmf:preferenceValue name="Enterprise" value="ENTERPRISE"/>
<adfmf:preferenceValue name="Personal" value="PERSONAL"/>
</adfmf:preferenceList>
</adfmf:preferenceGroup>
</adfmf:preferencePage>
</adfmf:preferences>

13.1.1.3 ユーザー・プリファレンス・リストの作成方法

プリファレンス・リスト・コンポーネントを追加してオプションのリストを作成します。

始める前に:

プリファレンス・リストまたは他のすべてのリストに関連するコンポーネントの親としてプリファレンス・グループを作成する必要があります。

ユーザー・プリファレンス・リストを作成するには:

1. 「プリファレンス・グループ」または「プリファレンス・ページ」を選択して、「追加」→「内部に挿入」→「プリファレンス・リスト」の順にクリックします。例13-2には、Select Your Versionという名前のプリファレンス・グループ・コンポーネントの子としてプリファレンス・リストを追加する例が示されています。

図13-10 プリファレンス・リスト・コンポーネントのプリファレンス・グループへの追加

2. 「プリファレンス・リストの挿入」ダイアログ(図13-2を参照)を使用して次の属性を定義し、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図13-11 「プリファレンス・リストの挿入」ダイアログ

3. 「プリファレンス値」表(図13-12を参照)で「追加」をクリックし、読取り専用アイテムのリストを定義します。プリファレンス値を選択してから「削除」をクリックすることで、この値を削除することもできます。プリファレンス値の表示順番を変更するには、プリファレンス値を選択してから上および下の矢印を使用します。
ユーザーにデフォルト設定を提供するには、「デフォルト」を選択します。例13-2に示すように、<adfmf:preferenceList>要素内でデフォルト・ステータスは、default="ENTERPIRSE"と定義されています。

ヒント:

「追加」をクリックするほか、それらをドラッグして「構造」ウィンドウまたは「ソース」ウィンドウのいずれかにドロップしても、プリファレンス値コンポーネントを追加できます。

図13-12 プリファレンス値の追加

13.1.1.4 プリファレンス・リストを作成する場合の処理

プリファレンス・リスト・コンポーネントをプリファレンス・グループに追加し、一連のプリファレンス値を定義すると、例13-2に示すように、JDeveloperでは<adfmf:preferenceList>要素を使用して<adfmf:preferences>セクションが更新されます。

13.1.1.5 ブール型のプリファレンス・リストの作成方法

たとえば、例13-1を参照してください。

始める前に:

<adfmf:preferenceBoolean>要素は<adfmf:preferenceGroup>要素内にネストされる必要があるため、まずプリファレンス・グループ・コンポーネントを階層に挿入する必要があります。

ブール型のプリファレンス・リストを作成するには:

1. 図13-13のGPS設定など、プリファレンス・グループ要素を選択します。

図13-13 ブール型プリファレンスのプリファレンス・グループへの追加

2. 「ブール型のプリファレンスの挿入」ダイアログ(図13-14を参照)を使用して次の属性を定義し、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図13-14 「ブール型のプリファレンスの挿入」ダイアログ

3. デフォルト値のfalseをそのまま使用するか、trueを選択します。

13.1.1.6 ブール型のプリファレンスを追加する場合の処理

ブール型のプリファレンスを追加してそのデフォルト値を指定した場合、例13-3に示すように、JDeveloperでは、<adfmf:preferenceBoolean>要素を使用してadfmf-application.xmlファイルの<adfmf:preferences>セクションが更新されます。

例13-3 <adfmf:preferenceBoolean>要素の追加

<adfmf:preferencePage id="gps_tracking"
label="Your_GPS_Locations">
<adfmf:preferenceGroup id="gps"
label="GPS Settings">
<adfmf:preferenceBoolean id="trackGPS"
label="Auto Track Location"
default="true"/>

13.1.1.7 テキストのプリファレンスの追加方法

図13-15に示すように、挿入オプションを使用して、ユーザーが情報を格納したりデフォルト・テキストを閲覧できるようにする「テキストのプリファレンス」というダイアログを作成します。図13-15は、「セキュリティ」という名前のプリファレンス・グループ内にテキストのプリファレンスを作成する例を示しています。

図13-15 「テキストのプリファレンス」の挿入

始める前に:

プリファレンス・グループ要素を作成します。

テキストのプリファレンスを作成するには:

1. プリファレンス・グループ要素を選択します。

2. 「内部に挿入」→「テキストのプリファレンス」を選択します。

3. 「テキストのプリファレンスの挿入」ダイアログ(図13-16を参照)に次の情報を入力して、「OK」をクリックします。

- 一意の識別子を入力します。

- ユーザー・インタフェースに表示される説明テキストを入力します。

図13-16 「テキストのプリファレンスの挿入」ダイアログ

4. テキストのプリファレンス・ダイアログに次を定義します。

- デフォルトのテキスト値を入力します。

- 「機密」を選択し、テキストのプリファレンスを非表示にすることでユーザーが編集できないようにします。

図13-17 テキストのプリファレンスの定義

13.1.1.8 テキストのプリファレンスを定義する場合の処理

テキストのプリファレンスを追加してそのデフォルト値を指定すると、例13-4に示すように、JDeveloperでは、<adfmf:preferenceText>要素を使用してadfmf-application.xmlファイルの<adfmf:preferences>セクションが更新されます。

例13-4 <adfmf:preferenceText>要素の追加

<adfmf:preferenceGroup id="security" label="Security">
<adfmf:preferenceText id="serviceURL"
label="Security URL"
default="http://security.foo.com/provider"/>
<adfmf:preferenceText  id="username"
label="User Name"/>
<adfmf:preferenceText  id="password"
label="Password"
secret="true"/>
</adfmf:preferenceGroup>

セキュリティURL、ユーザー名およびパスワードのプリファレンス設定を定義するプリファレンス・グループ要素は図13-18のように表示されます。

図13-18 テキストのプリファレンス

図13-18は、セキュリティURLが読取り専用の値、ユーザー名が入力値の<adfmf:preferenceText>要素を示しています。ADFモバイルのプリファレンスはiOS設定アプリケーションと統合されているため、パスワード入力テキストのsecret="true"属性により、ユーザーの入力を黒丸で覆うiOSの表記規則に従うアプリケーションとなります。詳細は、iOS Developer Library(http://developer.apple.com/library/ios/navigation/)で入手可能な『Settings Application Schema Reference』のisSecureテキスト・フィールド要素の説明および第13.4項「プラットフォームによる表示の差異」を参照してください。

13.1.2 アプリケーションレベルのプリファレンス・ページを作成する場合の処理

ADFモバイル・アプリケーションをデプロイすると、アプリケーション全体のプリファレンス設定ページがiOSデバイスの設定アプリケーションなど、デバイスのグローバル設定アプリケーションに伝播されます。詳細は、16.2.3.6項「AndroidエミュレータまたはAndroidデバイスにアプリケーションをデプロイする場合のJDeveloperでの処理」、第16.4.5.1項「iOSシミュレータまたはiOSデバイスにアプリケーションをデプロイする場合のJDeveloperでの処理」および付録B「デプロイメントでのプリファレンスの変換」を参照してください。

13.2 アプリケーション機能のユーザー・プリファレンス・ページの作成

図13-19に示されている「プリファレンス」タブでは、特定のアプリケーション機能に適用可能なユーザー・プリファレンスを定義できます。第13.1項「ADFモバイル・アプリケーションのユーザー・プリファレンス・ページの作成」の説明に従い、モバイル・アプリケーションレベルのプリファレンスを構築する方法でこれらのプリファレンスを構築します。次に、第8.3項「UIコンポーネントの作成と使用方法」で説明したブール・スイッチ、入力および出力の各コンポーネントに埋め込むADFモバイルAMXページを参照するアプリケーション機能を作成することによって実際のプリファレンスを構築します。

図13-19 アプリケーション機能レベルのプリファレンスの設定

13.3 ユーザー・プリファレンス・ページ用に格納された値を取得するEL式の使用方法

アプリケーション機能レベルのプリファレンス・ページを作成する場合、例13-5の入力テキスト・コンポーネントなど、ADFモバイルAMXコンポーネントに対してEL式を追加します。

例13-5 ADFモバイルAMXコンポーネントでELを使用したプリファレンス値の参照

<amx:inputText label="Number" id="it1" inputType="number"
value="#{preferenceScope.feature.Feature1.f1top.f1Number}"/>

例13-5に示すとおり、EL式では、preferenceScopeオブジェクトを使用して、アプリケーションがアプリケーション機能レベルのプリファレンスにアクセスできるようにします。これらのEL式の書式は次のとおりです。

preferenceScope.feature.feature-id.group-id.property-id

図13-20は、式ビルダーを使用したEL式の作成について説明しています。アプリケーション機能(<adfmf:feature id="Feature1">)のID、プリファレンス・グループ(<adfmf:preferenceGroup id="f1top">)のID、プリファレンス・プロパティ(<adfmf:preferenceNumber id="f1Number">)のIDなど、adfmf-feature.xml内の様々なコンポーネントに対して構成されるIDによってプリファレンス自体が指定されています。

EL式には、ゼロ個以上のgroup-id要素およびproperty-id要素が含まれる可能性があります。

図13-20 プリファレンスに対するEL式の構築

13.3.1 preferenceScopeについて

EL式には次の解決パターンがあります。

- JavaScriptレイヤーから、次のJavaScript関数を使用してEL値式を解決します。

adf.mf.el.getValue(expression, success, failed)

adf.mf.el.getValueの解決では、まずJS-ELパーサーとJavaScriptコンテキスト・キャッシュをローカルで使用して式の解決を試みます。式がローカルで解決できない場合は、その式を埋込みJavaレイヤーに評価用として渡し、そこでJava ELパーサーによって解決されます。これは、モデルのgetValueメソッドに対するGenericInvokeRequestを使用して処理されます。

- Javaレイヤーで、次の手法を使用してEL値式を解決します。

String val = AdfmfJavaUtilities.evaluateELExpression("#{preferenceScope.feature.f0.vendor}");

setValueメソッドでは、次のように式を解決します。

ValueExpression ve = AdfmfJavaUtilities.getValueExpression("#{preferenceScope.feature.f0.vendor}");
ve.setValue(AdfmfJavaUtilities.getADFELContext(), value);

EL式の評価には、preferenceScopeオブジェクトの検索が含まれます。評価は左から右に行われ、各トークンは別個に解決されます。トークンが解決されると、これは次の(その右側の)トークンの解決に使用されます。

preferenceScopeオブジェクトがない場合は、プリファレンスを公開できません。

13.3.2 iOSネイティブ・ビューでのプリファレンス値の読取り

ADFモバイルでは、ネイティブUI(UIView、UIViewControllerなど)に提供されているAPIが統合され、iOSプラットフォームで一定の構成が可能です。

ネイティブUIを初期化すると、ADFSession オブジェクトのインスタンスが利用可能になります。そのgetPreferencesメソッドを使用して、ADFモバイルに対し、adfmf-application.xmlファイルで定義されているアプリケーションで利用可能なプリファレンスのリストを提供するように命令できます。例13-6に示すとおり、このメソッドでは、プリファレンスにid、valueおよびlabelを含めることができるプリファレンス・プロパティ・オブジェクトのNSArray*が戻されます。このAPIコールでは、エンド・ユーザーによって特定のプリファレンスの値が提供されたこと、またはプリファレンスのデフォルト値が戻されていることのいずれかを確認します。

例13-6 プリファレンスの取得

//...
-(id) initWithADFSession:(id<ADFSession>) providedSession
{
id me = [self init];
session = providedSession;
//...
// Dump the preferences to the data display
NSArray* prefsArray = [session getPreferences];
NSString* prefs = [prefsArray JSONRepresentation];
self.theData.text = [[NSString alloc ] initWithFormat:
:@"%@\nUser Preferences = --> %@ <--", self.theData.text, prefs];
//...
return me;
}

13.4 プラットフォームによる表示の差異

ADFモバイルのプリファレンス・ページでは、iOSおよびAndroidの両プラットフォームでネイティブのルック・アンド・フィールが維持されます。その結果、ADFモバイルのプリファレンス・ページの表示は2つのプラットフォームで異なります。表13-1に示すとおり、iOSプラットフォームではプリファレンスがインラインで表示されるため、そのシステムではダイアログ・ページを起動しません。いくつかの例外を除いて、Androidプラットフォームではこれらのコンポーネントがダイアログで表示されます。

表13-1 プラットフォームごとのプリファレンス・コンポーネントの比較

コンポーネント

iOS

iOSの表示例

Android

Androidの表示例

ブール型のプリファレンス・リスト

ブール型のプリファレンスは、onとoffなどのペアの値で表示されます。

Androidでは、ブール型のプリファレンスをチェック・ボックスで表示します。

テキストのプリファレンス(デフォルトは読取り専用のテキスト)

iOSは読取り専用のテキストをインラインで表示します。

Androidは読取り専用のテキストをインラインで表示します。

テキストのプリファレンス(入力テキスト)

iOSプラットフォームでは、ユーザーはテキストをインラインで入力します。

Androidでは、入力テキスト・ダイアログを起動します。

テキストのプリファレンス(機密入力テキスト)

iOSプラットフォームでは、ユーザーはテキストをインラインで入力し、各文字はその入力後に黒丸で覆われます。詳細は、第13.1.1.8項「テキストのプリファレンスを定義する場合の処理」を参照してください。

Androidでは、入力テキスト・ダイアログが起動し、各文字はその入力後に黒丸で覆われます。

単一のアイテム選択リスト(プリファレンス・リストから)

iOSプラットフォームでは別のプリファレンス・ページに単一のアイテム選択リストが表示されます。

Androidでは、ダイアログ内に単一のアイテム選択リストが表示されます。

プリファレンス・グループ(カテゴリ選択)

iOSでは、その親プリファレンス・グループ内にプリファレンス要素が表示されます。

Androidでは、その親プリファレンス・グループ内にプリファレンス要素が表示されます。

プリファレンス・ページ

iOSでは、プリファレンス・グループから子プリファレンス・ページを起動します。

Androidでは、プリファレンス・グループから子プリファレンス・ページを起動します。

iOSおよびAndroidのプラットフォームには設定アプリケーションがありますが、図13-21のOracleプリファレンスで示すように、設定アプリケーションへのアプリケーションレベルのプリファレンスの統合はiOSプラットフォームのみでサポートされます。

図13-21 iOS設定アプリケーションでのOracleモバイル・プリファレンス

Androidデバイスでは、図13-22に示すとおり、ユーザーはプリファレンス・メニューを使用してプリファレンス・ページにアクセスします。

図13-22 Androidデバイスのプリファレンス・メニュー

14 制約の設定

この章では、ユーザーのアクセス権限またはデバイス要件に基づいてアプリケーション機能を制限できる制約の設定方法について説明します。

この章では、次の項目について説明します。

- 第14.1項「制約の概要」

- 第14.2項「アプリケーション機能の制約の定義」

14.1 制約の概要

制約には、アプリケーション機能またはコンテンツを使用するタイミングが記述されています。制約には、デバイス上で使用可能なハードウェアのほか、ユーザーとユーザー・ロール、モバイル・アプリケーションの実行対象となるデバイスの特性が記述されています。アプリケーションの承認機能を管理者ロールを持つユーザーのみに制限するなど、アプリケーション機能全般に渡って制約を定義できます。アプリケーション機能のコンテンツに関しては、あるタスク・フローを管理者ロールを持つユーザーのみに使用可能にし、別のタスク・フローを営業担当ロールを持つユーザーのみに使用可能にするなどの制約を設定できます。

14.2 アプリケーション機能の制約の定義

制約は実行時に評価され、アプリケーション機能をデプロイできるようにするにはtrueに評価される必要があります。<adfmf:constraint>要素(<adfmf:constraints>の子要素)のproperty、operatorおよびvalueの各属性では、ユーザー、デバイスおよびハードウェアの各オブジェクトを参照できます。例14-1に示すこれらの属性の定義の例は、アプリケーション機能へのアクセスをField Repに制限し、さらにiOS用デバイスでのみアプリケーションを実行するように制限する属性の定義を示しています。

例14-1 <adfmf:constraint>要素

<adfmf:constraints>
<adfmf:constraint property="user.roles"
operator="contains"
value="Field Rep"/>
<adfmf:constraint property="device.model"
operator="contains"
value="ios"/>
</adfmf:constraints>

14.2.1 アプリケーション機能に制約を定義する方法

図14-0に示すように、「機能」ページの「制約」タブを使用して、選択したアプリケーション機能の制約を宣言的に構成します。

図14-1 制約の定義

アプリケーション機能の制約を定義するには:

1. 「制約」タブをクリックします。

2. 「追加」をクリックします。

3. プロパティと適切な演算子を選択し、値を入力します。プロパティの使用の詳細は、第14.2.3項「property属性について」を参照してください。

14.2.2 制約を定義する場合の処理

例14-1と同様に、「制約」タブに値を入力すると、定義された<adfmf:constraint>要素を使用して、識別子ファイルの<adfmf:constraints>要素が更新されます。

14.2.3 property属性について

ADFモバイルでは、ユーザー、デバイスおよびハードウェアの各プロパティを反映するproperty属性のセットが提供されています。これらのプロパティを次の演算子と組み合せて使用することでアプリケーション機能の使用方法が決定されます。

- contains

- equal

- less

- more

- not

14.2.3.1 ユーザー制約

user.privilegesおよびuser.rolesの各制約とcontainsまたはnotの演算子を使用して、ログイン・ユーザーのアプリケーション機能へのアクセスを制限します。この制限は、ADFモバイル・ランタイムによる評価方法により、ユーザー・ロールとユーザー権限に基づきます。

アプリケーション・ログイン・サーバー接続のアクセス制御を使用して、user.rolesおよびuser.privilegesに基づく制約を評価します。通常は、user.rolesおよびuser.privilegesに基づく制約を使用してアプリケーション機能へのアクセスを制御します。たとえば、アプリケーション機能へのアクセスをmanager_roleロールを持つユーザーのみに許可するには、user.roles contains manager_roleの制約をアプリケーション機能の定義に追加する必要があります。

アプリケーションの起動時に、「ADFモバイル・ログイン・サーバー接続の作成」ダイアログの「アクセス制御URL」オプションにエンド・ポイントが定義されているアクセス制御サービス(ACS) Webサービスが起動され、ユーザーに割り当てられたロールと権限がフェッチされてADFモバイルによる評価が可能になります。各アプリケーション機能の制約セットが評価され、関連付けられたすべての制約を満たしたアプリケーション機能のみがユーザーに対して使用可能となります。詳細は、第17.4.2項「ログイン・ページの指定方法」および17.4.6項「アクセス制御サービスについて」を参照してください。

Oracle Identity Connect (OIC)にログインすると、ロールおよび権限コレクションがuserオブジェクトに移入されます。詳細は、第17.3項「認証の概要」を参照してください。

user.rolesおよびuser.privilegesでは、containsおよびnotの演算子を次のように使用します。

- contains: ロールまたは権限のコレクションに名前の付いたロールまたは権限が含まれる場合、ランタイムではその制約をtrueに評価します。例14-2には、contains演算子を使用したuser.rolesプロパティの使用の例が示されています。ユーザーのロールに従業員のロールが含まれている場合は、モバイル・アプリケーションにアプリケーション機能が表示されます。

例14-2 ユーザー・ロール・コレクションに対するcontains演算子の使用方法

<feature ...>
...
<constraints>
<constraint property="user.roles"
operator="contains"
value="employee" />
</constraints>
...
</feature>

- not: ロールまたは権限のコレクションに名前の付いたロールまたは権限が含まれない場合、ランタイムではその制約をtrueに評価します。例14-3では、ユーザーの権限に管理者権限が含まれる場合はアプリケーション機能が含められません。

例14-3 not演算子とuser.privilegesプロパティを使用したアプリケーション機能へのアクセスの制限

<feature ...>
...
<constraints>
<constraint property="user.privileges"
operator="not"
value="manager" />
</constraints>
...
</feature>

14.2.3.1.1 ハードウェア関連の制約

ハードウェア・オブジェクトは、カメラの有無、コンパス向首方向情報提供機能、ファイルの保存機能など、デバイスで使用可能なハードウェアを参照します。次のプロパティではequal演算子が使用されます。

- hardware.networkStatus: アプリケーションの起動時にネットワークの状態が表示されます。NotReachable、CarrierDataConnectionおよびWiFiConnectionの3つの属性値を使用してこのプロパティを変更できます。例14-4 は、この3つ目の属性値を例示しています。その例に示すとおり、この値を設定することで、デバイス・ハードウェアがWi-Fi接続があることを示している場合にのみモバイル・アプリケーションにこのモバイル・アプリケーション機能が表示されることになります。つまり、デバイスにWi-Fi接続がない場合は、ADFモバイル・アプリケーションをロードしても、そのアプリケーション機能は表示されません。

例14-4 hardware.networkStatusプロパティの定義

<feature ...>
...
<constraints>
<constraint property="hardware.networkStatus"
operator="equal"
value="WiFiConnection" />
</constraints>
...
</feature>

注意:

この制約は、iOSデバイスの起動時に評価されます。たとえば、起動時にデバイスにWi-Fi接続がなく、その後その接続を取得した場合、ユーザーがWi-Fiのホットスポットに入っても、アプリケーション機能は無効のままとなり、ユーザーがモバイル・アプリケーションを停止し再起動するまで利用できません。

- hardware.hasAccelerometer: デバイスに加速度計があるかどうかを示します。このプロパティは、trueまたはfalseの値で定義します。例14-5は、trueの値を示しており、ハードウェアに加速度計がある場合にのみこのアプリケーション機能が利用可能なことを示しています。

例14-5 hardware.hasAccelerometerプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasAccelerometer"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

iOSベースのハードウェアにはすべて加速度計があるため、このプロパティは常にtrueの値にして、iOSデバイスでアプリケーション機能が利用できるようにしておく必要があります。

- hardware.hasCamera: デバイスにカメラがあるかどうかを示します。この制約は、trueまたはfalseの属性値を使用して定義します。例14-6は、値がtrueに設定されており、デバイスにカメラが含まれている場合にのみアプリケーション機能が利用可能なことを示しています。

例14-6 hardware.hasCameraプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasCamera"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

すべてのiOSベース・ハードウェアにカメラが搭載されているわけではありません。この値は、iOSデバイスでADFモバイル・アプリケーションを起動した際に動的に評価されます。そのときに、モバイル・アプリケーションでは、trueに評価されないアプリケーション機能が削除されます。

- hardware.hasCompass: デバイスにコンパスがあるかどうかを示します。この制約は、例14-7に示すように、trueまたはfalseの属性値を使用して定義します。

例14-7 hardware.hasCompassプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasCompass"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

すべてのiOSデバイスにコンパスがあるわけではありません。この値は、iOSデバイスでADFモバイル・アプリケーションを起動した際に動的に評価されます。そのときに、モバイル・アプリケーションでは、trueに評価されないアプリケーション機能が削除されます。

- hardware.hasContacts: デバイスにアドレス帳またはコンタクト先があるかどうかを示します。この制約は、例14-8に示すように、trueまたはfalseの属性値を使用して定義します。

例14-8 hardware.hasContactsプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasContacts"
operator="equal"
value"=true" />
</constraints>
...
</feature>

注意:

iOSベースのハードウェアのコンタクト先はPhoneGap経由でアクセスされるため、iOSデバイスに対してはvalue属性は常にtrueに設定されます。

- hardware.hasFileAccess: デバイスでファイル・アクセスが可能かどうかを示します。この制約は、例14-9に示すように、trueまたはfalseの属性値を使用して定義します。ランタイムがこの制約をtrueに評価した場合にのみ、アプリケーション機能を利用できます。

例14-9 hardware.hasFileAccessプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasFileAccess"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

iOSベースのハードウェアのファイル・アクセスはPhoneGap経由でアクセスされるため、iOSデバイスに対してはvalue属性は常にtrueになります。

- hardware.hasGeoLocation: デバイスが地理的位置情報サービスを提供しているかどうかを示します。この制約は、例14-10に示すように、trueまたはfalseの属性値を使用して定義します。デバイスが地理的位置情報をサポートする場合にのみ、アプリケーション機能を利用できます。

例14-10 hardware.hasGeoLocationプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasGeoLocation"
operator="equal"
value="true"/>
</constraints>
...
</feature>

注意:

PhoneGapでは、すべてのiOSデバイスに対して地理的位置情報サービスへのアクセスを提供しているわけではありません。デバイスによっては、制約がランタイムにより評価された場合に、アプリケーション機能が利用できない可能性があります。

- hardware.hasLocalStorage: デバイスがファイルのローカル記憶域を提供するかどうかを示します。この制約は、例14-11に示すように、trueまたはfalseのvalue属性を使用して定義します。デバイスがローカルでのファイルの格納をサポートする場合にのみ、アプリケーション機能が表示されます。

例14-11 hasLocalStorageプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasLocalStorage"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

PhoneGapではすべてのiOSハードウェアでローカル・ファイル記憶域へのアクセスが提供されるため、iOSデバイスに対するvalue属性は常にtrueになります。

- hardware.hasMediaPlayer: デバイスにメディア・プレーヤがあるかどうかを示します。この制約は、例14-12に示すように、trueまたはfalseのvalue属性を使用して定義します。デバイスにメディア・プレーヤがある場合にのみ、アプリケーション機能が表示されます。

例14-12 hardware.hasMediaPlayerプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasMediaPlayer"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

PhoneGapではiOSベースのハードウェアでメディア・プレーヤへのアクセスを提供しているため、iOSデバイスではvalue属性は常にtrueになります。

- hardware.hasMediaRecorder: デバイスにメディア・レコーダがあるかどうかを示します。この制約は、例14-13に示すように、trueまたはfalseのvalueを使用して定義します。デバイス・ハードウェアがメディア・レコーダをサポートする場合にのみ、アプリケーション機能が含まれます。

例14-13 hardware.hasMediaRecorderプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasMediaRecorder"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

すべてのiOSベースのハードウェアにPhoneGapからアクセス可能なメディア・レコーダがあるため、すべてのiOSデバイスでこの値をtrueに設定します。Apple iTouchなどのいくつかのデバイスにはマイクがありませんが、エンド・ユーザーは外部マイクを取り付けることでレコーディングが可能になります。

- hardware.hasTouchScreen: ハードウェアにタッチ・スクリーン機能があるかどうかを示します。この制約は、例14-14に示すように、trueまたはfalseのvalue属性を使用して定義します。デバイス・ハードウェアがタッチ・スクリーンをサポートする場合にのみ、アプリケーション機能が含められます。

例14-14 hardware.hasTouchScreenプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.hasTouchScreen"
operator="equal"
value="true" />
</constraints>
...
</feature>

注意:

すべてのiOSベースのハードウェアにタッチ・スクリーン機能があるため、iOSデバイスのvalue属性をtrueに設定します。

- hardware.screen.width: デバイスの現在の向きでの画面幅を示します。例14-15の320など、画面幅(ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

例14-15 hardware.screen.widthプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.screen.width"
operator="equal"
value="320" />
</constraints>
...
</feature>

注意:

この値はモバイル・アプリケーションの起動時に評価され、その際にランタイムが制約を評価し、trueに評価されない制約を持つアプリケーション機能は削除されます。ADFモバイル・アプリケーションの起動後にユーザーがデバイスを回転させた場合、アプリケーション機能の設定はモバイル・アプリケーションの起動後に修正されるため、ADFモバイルのランタイムではこの制約は再評価されません。

- hardware.screen.height: デバイスの現在の位置における画面高さを示します。例14-16に示すように、320や480などの画面幅(ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

例14-16 hardware.screen.heightプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.screen.height"
operator="equal"
value="480" />
</constraints>
...
</feature>

注意:

モバイル・アプリケーションの起動時に、trueに評価されない制約を持つアプリケーション機能を削除するプロセスの一部として、ADFモバイル・ランタイムではこの制約の画面高さの値を評価します。ADFモバイル・アプリケーションの起動後にユーザーがデバイスの向きを変えた場合は、アプリケーション機能の設定はモバイル・アプリケーションの起動後に修正されるため、ランタイムではこの制約は再評価されません。

- hardware.screen.availableWidth: デバイスの現在の向きで利用可能な画面幅を示します。例14-17に示すように、320や480などの画面幅(ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

例14-17 hardware.screen.availableWidthプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.screen.availableWidth"
operator="equal"
value"320" />
</constraints>
...
</feature>

- hardware.screen.availableHeight: デバイスの現在の位置で利用可能な画面高さを示します。例14-18に示すように、320や480などの画面幅(ピクセル単位)を示す数値を入力します。この値はデバイスの向きによって異なります。

例14-18 hardware.screen.availableHeightプロパティの使用方法

<feature ...>
...
<constraints>
<constraint property="hardware.screen.availableHeight"
operator="equal"
value"480" />
</constraints>
...
</feature>

15 Oracle Cloud上のデータへのアクセス

この章では、Oracle Java Cloud ServiceでホストされるデータへのADFモバイル・アプリケーションによるアクセス方法について説明します。

15.1 Oracle CloudでホストされるデータへのADFモバイル・アプリケーションによるアクセスの有効化

ADFモバイル・アプリケーションでは、Oracle CloudでホストされるSOAPおよびRESTの両方のWebサービスにアクセスできます。ホストされたSOAP Webサービスへのアクセスを有効化するには、第10.2項「Webサービス・データ・コントロールの作成」の説明に従い、Webサービス・データ・コントロールを作成します。RESTful Webサービスへのアクセスを有効化するには、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFデータ・コントロールを使用したURLサービスの公開に関する項の説明に従い、URLサービス・データ・コントロールを作成します。コンテンツ・タイプにより、第7.3.2項「ADFモバイルAMXページへのUIコンポーネントおよびデータ・コントロールの追加方法」の説明に従い、データ・コントロールをドラッグしてADFモバイルAMX UIコンポーネントにドロップするか、コンテンツがリモートWebサーバーまたはローカルに格納されたHTMLファイルのいずれかから配信されるアプリケーションの場合はプログラムによって、ADFモバイル・アプリケーションによるクラウド・データへのアクセスが可能になります。

15.1.1 Oracle Cloudの認証方法

「ADFモバイル・ログイン・サーバー接続」ダイアログを使用して、Oracle Cloudに対して認証するためのログイン・サーバー接続を作成します。

始める前に:

ログイン・サーバー接続に使用するOracle Cloud URLを取得します。

Oracle Cloudのエンドポイントを使用してログインURLを作成するには:

1. 「アプリケーション」→「新規」→「接続」の順に選択します。

2. ADFモバイル・サーバー・ログイン接続を選択します。

3. 次の項目を入力して、図15-1に示すADFモバイル・ログイン接続の接続ダイアログを完了します。

- 「名前」フィールド: 接続名

- 「ログインURL」フィールド: Oracle CloudのURL

詳細は、Oracle JDeveloperオンライン・ヘルプおよび第17.4.2項「ログイン・ページの指定方法」を参照してください。

図15-1 Oracle Cloudへのログインの作成

15.1.2 Oracle Java CloudにアクセスするためのWebサービス・データ・コントロールの作成方法

データ・サービス・コントロールの作成ウィザードでは、ホストされたデータにアクセスするデータ・コントロールを作成できます。Oracle Java CloudにデプロイされたSOAP WebサービスのWSDL URLを使用してこのデータ・コントロールを作成します。このURLがわからない場合は、アプリケーションのコンテキスト・ルートにWebサービスのポート名および?wsdlを追加して、WSDLドキュメントへのURLを作成する必要があります。

始める前に:

Oracle Java Cloud ServiceにデプロイされているSOAP Webサービス・アプリケーションへのアクセス権を持つ必要があります。このアプリケーションは、Oracle Java Cloud Service Controlホームページにある「アプリケーション」ペインを経由して利用可能にする必要があります。さらに、図15-2のHCMMobileServiceアプリケーションで示されるように、その「ステータス」および「状態」それぞれが「↑」および「アクティブ」である必要があります。

図15-2 Java Cloud Services Controlホームページ

Webサービス・データ・コントロールの作成方法:

1. Oracle Cloud上でホストされたWebサービスのアプリケーション・コンテキスト・ルートを次のように取得します。

1. 「アプリケーション」ペイン(図15-2に表示)のアプリケーションをクリックして、図15-3に示されるアプリケーションのホームページに移動します。

2. 図15-3に示すように、URLをコピーします。このURLは、WSDLドキュメントのアプリケーション・コンテキスト・ルートになります。

図15-3 Webサービスのアプリケーション・コンテキスト・ルートのコピー

2. 第10.2項「Webサービス・データ・コントロールの作成」の説明に従い、JDeveloperで、「アプリケーション・ナビゲータ」のビュー・コントローラ・プロジェクトを右クリックして「Webサービス・データ・コントロールの作成」ウィザードを開きます。

3. 図15-4に示す「データソース」ページで、データ・コントロールの名前を入力します。

図15-4 WSDLドキュメントのURLの入力

4. 「URL」フィールドで、Oracle Cloud Java Serviceにデプロイされている(さらに現在実行されている)SOAPベースのWebサービスのURLを貼り付けます。

5. 図15-4のHCMServicePort?wsdlなど、アプリケーション・コンテキスト・ルートにWebサービスのポート名と?wsdlを追加することで、データ・コントロールによるWSDLへのアクセスを可能にします。

6. 図15-5に示すとおり、「データ・コントロール操作」ページで、アプリケーション機能がデータの取得に使用できるWebサービス操作を選択します。「終了」をクリックします。

図15-5 Webサービス操作の選択

図15-5には、ADFモバイル・アプリケーションで使用できる、ADFモバイル・デザインタイムにより戻されるWebサービス操作が示されています。この例で、デザインタイムは、人事管理データをホストするWebサービスに問合せを行い、経費の承認を含む従業員データを取得するための操作を戻します。

15.1.2.1 SOAPベースのWebサービスにおけるポリシーの構成

Oracle Cloud上で保護されるSOAPベースのWebサービスに対してポリシーを構成する必要があります。第10.5項「セキュアなWebサービスへのアクセス」の説明に従い、データ・サービス・コントロール・ポリシーの編集ダイアログを使用して、oracle/wss_http_token_over_ssl_client_policyを選択できます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のWebサービス・データ・コントロール・セキュリティの定義方法に関する項を参照してください。

注意:

SOAPベースのWebサービスには、oracle/wss_http_token_over_ssl_client_policyのみがサポートされます。RESTful Webサービスでは、基本認証またはSSLポリシーがサポートされます。

15.1.3 Oracle Java Cloud ServiceにアクセスするADFモバイル・アプリケーションをデプロイする場合の処理

アプリケーションをデプロイすると、Webサービス・データ・コントロールの操作によって、Oracle Java Cloud Serviceインスタンス上で実行されるWebサービスからデータが取得されます。

第VI部

アプリケーションの完成

ここでは、ADFモバイル・アプリケーションのセキュリティを有効にする方法とアプリケーションのデバッグおよびデプロイ方法について説明します。

第VI部の内容は次のとおりです。

- 第16章「ADFモバイル・アプリケーションのデプロイ」

- 第17章「ADFモバイル・アプリケーションのセキュリティ」

- 第18章「ADFモバイル・アプリケーションのテストとデバッグ」

16 ADFモバイル・アプリケーションのデプロイ

この章では、テストと公開のためのADFモバイル・アプリケーションのデプロイ方法について説明します。

この章では、次の項目について説明します。

- 第16.1項「モバイル・アプリケーションのデプロイメントの概要」

- 第16.2項「デプロイメント・プロファイルでの作業」

- 第16.3項「Androidアプリケーションのデプロイ」

- 第16.4項「iOSアプリケーションのデプロイ」

- 第16.5項「機能アーカイブ・ファイル(FAR)のデプロイ」

- 第16.6項「コマンドラインからのADFモバイル・アプリケーションのデプロイ」

16.1 モバイル・アプリケーションのデプロイメントの概要

エンド・ユーザーに配布するためにアプリケーションを公開する前に、シミュレータまたは実際のデバイスでこれをテストして、その動作と使いやすさを評価する必要があります。ADFモバイルでは、iOSアプリケーション・バンドル(.ipaファイル)またはAndroidアプリケーション・パッケージ・ファイル(.apk)をプラットフォームに適したデバイスまたはシミュレータにデプロイすることで、App Store (Apple iTunes)またはアプリケーション・マーケットプレイス(Google Playなど)に公開する前にアプリケーションをテストできます。

16.1.1 ADFモバイルによるアプリケーションのデプロイ方法

ADFモバイル・プロジェクトのデプロイメントは、プラットフォーム固有のテンプレート・アプリケーションを一時的な場所にコピーして、ADFモバイル・プロジェクトで定義されたコード、リソースおよび構成を使用してアプリケーションを更新してから、ターゲット・プラットフォームのツールを使用してアプリケーションをビルドおよびデプロイすることで行います。デプロイメントを構成するタスクは次のとおりです。

1. 指定のプラットフォームSDKでプラットフォーム固有のビルド・ツールを使用できることを検証します。

2. XMLファイルを含むアプリケーションの内容を検証します。

3. 必要であれば、プラットフォームに依存するテンプレート・ファイルを一時的な場所に解凍します。

注意:

「ビルド」→「すべてクリーン」を選択すると、テンプレート・ファイルが存在しない場合があります。

4. テンプレートの適切な場所にデフォルト・イメージをコピーします。

5. テンプレートの適切な場所にカスタム・イメージをコピーします。

6. Webコンテンツ(機能アプリケーションに関連するあらゆるイメージを含む)をテンプレートの場所にコピーします。

7. Java仮想マシン1.4 (JVM 1.4)のライブラリとすべてのサポート・ライブラリを、テンプレートの適切な場所にコピーします。詳細は、第16.1.1.2項「JVM 1.4ライブラリのデプロイメント」を参照してください。

8. カスタム・コンテンツをテンプレートの適切な場所にコピーします(これにはプロジェクト・プロパティに含まれているライブラリとJARファイルが含まれます)。

9. テンプレートのメタデータ・ファイルをコピーするか、デプロイメント・プロファイル、adfmf-application.xmlファイルおよびadfmf-feature.xmlファイルで定義されているプリファレンスで更新します。

10. テンプレート・プロジェクトで、プラットフォーム固有のビルド・ツールを実行します。

11. テンプレート・プロジェクトでプラットフォーム固有のツールを実行し、プロジェクトに署名して(必要な場合)、選択したデプロイメント用にプロジェクトをパッケージ化します。

Androidアプリケーションのデプロイメント・フローの詳細は、第16.2.3.6項「AndroidエミュレータまたはAndroidデバイスにアプリケーションをデプロイする場合のJDeveloperでの処理」を参照してください。iOSアプリケーションのデプロイメント・フローの詳細は、第16.4.5.1項「iOSシミュレータまたはiOSデバイスにアプリケーションをデプロイする場合のJDeveloperでの処理」を参照してください。

16.1.1.1 プロジェクト・ライブラリのデプロイメント

「ライブラリとクラスパス」ダイアログ(図16-1を参照)を使用してプロジェクトに宣言するライブラリは、そのプロジェクトのデプロイメント・アーティファクトに含まれます。このダイアログにより、アプリケーション機能は実行時にこれらのライブラリにアクセスすることが可能になります。

図16-1 プロジェクトへのライブラリの追加

16.1.1.2 JVM 1.4ライブラリのデプロイメント

AndroidアプリケーションとiOSアプリケーションのどちらの場合も、それぞれのADFモバイルのデプロイメントには、デプロイメントのタイプ(リリースまたはデバッグ)とデプロイメント・ターゲット(シミュレータまたは実際のデバイス)の組合せに固有の異なるライブラリのセットが含まれます。さらに、それぞれのライブラリ・セットには、JVM 1.4のJARファイルが含まれます。アプリケーションのバインディング・レイヤーは、Objective-Cライブラリのコレクションであるこの仮想マシン内にあります。たとえば、ADFモバイルは、iOSシミュレータをターゲットとするデバッグ・デプロイメントに対して、JVM 1.4 JARファイルと一連のライブラリをデプロイしますが、実際のiOSデバイスをターゲットとするデバッグ・デプロイメントに対しては、異なるJVM 1.4 JARファイルと一連のライブラリをデプロイします。

16.2 デプロイメント・プロファイルでの作業

デプロイメントのためにADFモバイル・アプリケーションを準備する際は、最初に、プラットフォーム固有のデプロイメント・プロファイルを作成します。デプロイメント・プロファイルでは、iOSデバイス、Androidデバイス、iOSシミュレータまたはAndroidエミュレータにデプロイするアプリケーションをアーカイブにパッケージ化する方法を定義します。デプロイメント・プロファイルは次を行います。

- アーカイブの形式と内容を指定します。iOSのアーカイブ形式は、アプリケーション・バンドルとして知られている.ipaファイルになります。Androidのアーカイブ形式は、Androidアプリケーション・パッケージ・ファイル(.apk)になります。

注意:

.apkファイルはアーカイブ互換です。つまり、WinZipまたは7-Zipのようなアーカイブ・ツールを使用して、その内容を表示できます。

- アーカイブ・ファイルへのパッケージ対象となるソース・ファイル、デプロイメント・ディスクリプタおよびその他の補助ファイルをリストします。

- 作成されるアーカイブ・ファイルのタイプおよび名前を記述します。

- 依存情報、プラットフォーム固有の指示およびその他の情報を示します。

16.2.1 デプロイメント・プロファイルの作成方法

ADFモバイルの拡張機能によって、iOSとAndroidのどちらのデプロイメントでも、ADFモバイル固有のページ(表16-1で説明)が、次を含む標準ADFデプロイメント・ページに追加されます。

- ファイル・グループ

- ライブラリ依存性

- プロファイル依存性

「デプロイメント・プロファイルの作成」ウィザード(図16-2を参照)を使用して、デフォルトのデプロイメント・プロファイルを作成できます。デプロイメント・プロファイルは、必要な数だけ作成できます。これらの標準ADFデプロイメント・プロファイル・ページの詳細は、「ヘルプ」をクリックしてJDeveloperオンライン・ヘルプを参照してください。

注意:

ADFモバイル・アプリケーションのデプロイメントでは、アプリケーションレベルのデプロイメント・プロファイルの作成のみが必要とされるので、ビュー・コントローラレベルのデプロイメント・プロファイルを作成する必要はありません。

始める前に:

JDeveloperでADFモバイル・アプリケーションをデプロイできるようにするには、第3.3.1項「プラットフォームとフォーム・ファクタに応じた開発環境の構成方法」で説明されているように、ADFモバイル・プリファレンスのページを使用してターゲット・プラットフォームのSDKを指定する必要があります。

デプロイメント・プロファイルを作成する手順は、次のとおりです。

1. 「アプリケーション」→「デプロイ」を選択します。

2. 「新規デプロイメント・プロファイル」を選択します。

3. ターゲット・プラットフォームに応じて、「Android用ADFモバイル」または「iOS用ADFモバイル」を選択します(図16-2を参照)。

4. プロファイルのデフォルト名をそのまま使用するか、新しい名前を入力します。「OK」をクリックします。

5. 必要な場合は、「オプション」ページと「アプリケーション・イメージ」ページを適宜使用して、「OK」をクリックします。

図16-2 「デプロイメント・プロファイルの作成」ウィザード

16.2.2 デプロイメント・プロファイルの作成時の処理

ウィザードが完了すると、JDeveloperによってデプロイメント・プロファイルが作成され、デプロイメント・プロファイルのプロパティ・エディタが開きます。

表16-1に、デプロイメント・プロファイルのプロパティ・エディタのADFモバイルに固有のページ(図16-6を参照)をリストします。

表16-1 ADFモバイル固有のデプロイメント・プロファイル・ページ

ページ

機能

iOSオプション

iOSデバイスまたはiOSシミュレータにデプロイされるアプリケーションの設定を変更できます。

Androidオプション

AndroidデバイスまたはAndroidエミュレータにデプロイされるアプリケーションの設定を変更できます。

アプリケーション・イメージ

適切なグラフィックス・ファイルを追加することで、アプリケーションにカスタム・アイコンを割り当てられます。

デバイスの向き

アプリケーションの表示をデバイスの特定の向きに制限できます。このページはiOSデプロイメント・プロファイルのみに使用されます。

注意:

デプロイメントはアプリケーションのニーズによって異なります。表16-1にリストされたページにシードされたデフォルト値を使用してアプリケーションをデプロイできます。

アプリケーションをデプロイすると、JDeveloperによってデプロイメント・ディレクトリと関連するサブディレクトリが作成されます。さらに、ビュー・コントローラ・プロジェクトとアプリケーション・コントローラ・プロジェクトの両方の機能アーカイブ・ファイル(FAR)が作成されます。これら2つのFARに加え、プロジェクトにインポートされたすべてのFARのコピーがJDeveloperによって作成されます。コンパイル・プロファイルを変更する際は、デプロイメント・ディレクトリを削除する必要があります。「ビルド」→「すべてクリーン」を選択することで、このディレクトリに加え、FARを含むビュー・コントローラ・プロジェクト内のデプロイメント・ディレクトリを削除できます。

「フィルタ」パネル(図16-3を参照)を使用して、選択したアーティファクトをデプロイから除外できます。特に、「フィルタ」パネルを使用すると、ターゲット・デプロイメント・プラットフォームに合わないすべてのアーティファクトを除外できます。詳細は、Oracle JDeveloperオンライン・ヘルプを参照してください。

図16-3 「フィルタ」パネルを使用したデプロイメントからのファイルの除外

16.2.3 Androidデプロイメント・プロファイルの作成方法

デプロイメント・プロファイルによって、Androidデバイスまたはエミュレータへのアプリケーション・デプロイメントのためのテンプレートまたはAndroidアプリケーション・パッケージ・ファイル(.apk)としてアプリケーションを作成するためのテンプレートが作成されます。

Androidのデプロイメント・プロファイルを作成するには、アプリケーションの署名オプションとjavacコンパイラの動作を定義し、必要な場合はアプリケーション・アイコンに使用されるデフォルトOracleイメージをカスタム・イメージでオーバーライドします。

始める前に:

第3.5項「Androidプラットフォーム用の開発ツールの設定」の説明に従って、Android SDKをインストールおよびダウンロードします。Androidエミュレータにデプロイする場合は、Android開発者のWebサイト(http://developer.android.com/tools/devices/index.html)の説明に従って、Android Virtual Device Managerを使用して各エミュレータ・インスタンスの仮想デバイスを作成する必要があります。Android Virtual Device (AVD)を作成する際は、「CPU/ABI」値にARMシステム・イメージが反映されていることを確認してください(例: 図16-4のARM (armeabi-v7a))。また、AVDのSDカード・イメージ・ファイルのサイズを、大きなRAMサイズに設定してください(例: 図16-4の「Device ram size」プロパティでは1024 MB (1 GB)に設定)。ただし、小さなサイズを指定することもできます。

注意:

ADFモバイルでは、ARM EABI v7aシステム・イメージのみがサポートされます。ADFモバイルでは、Android 2.3.nプラットフォーム(APIレベル9)上で動作するAndroidデバイスがサポートされますが、このプラットフォーム上で動作するエミュレータへのデプロイメントはサポートされません。なぜなら、これらはARM926EJ-S rev 5 (v51)プロセッサをベースとしているからです。さらに、JVM 1.4を2.nプラットフォームのAndroidエミュレータにデプロイすると、正しく動作できなくなります。

図16-4 Android Virtual Deviceの作成

また、AndroidプラットフォームSDKのADFモバイルのプリファレンス(「ツール」→「プリファレンス」→「ADFモバイル」→「プラットフォーム」→「Android」を選択してアクセス)を、Android SDKパッケージのダウンロードの一部であるSDKとプラットフォームの場所に設定する必要があります。図16-5には、これらの場所が示されています。「プラットフォーム」ページを使用して、Androidアプリケーションの署名に使用されるキーのデバッグとリリースのプロパティも定義します。続いて、デプロイメント・プロファイル内で、ADFモバイル・アプリケーションのリリースをデバッグまたはリリースに指定します。署名キー・プロパティは一度定義するのみでかまいません。詳細は、第16.2.3.3項「Android署名オプションの定義」を参照してください。また、Android開発者のWebサイト(http://developer.android.com/tools/publishing/app-signing.html)で、アプリケーションの公開に関する情報も参照してください。

注意:

Androidエミュレータにアプリケーションをデプロイするには、API 14以降(Platform 4.0.n)をインストールする必要があります。

図16-5 Android SDK、プラットフォームおよび署名プロパティの設定

16.2.3.1 アプリケーションの詳細オプションの設定

「Androidオプション」ページ(図16-6を参照)では、次を行うことができます。

- アプリケーションのバージョンを示します。Androidアプリケーションのバージョニングの詳細は、Android開発者のWebサイト(http://developer.android.com/tools/publishing/versioning.html)を参照してください。

- .apkファイルのパッケージングを最適化するアーカイブ位置合せツールであるAndroid zipalignツールを構成します。データ・マニフェストなど、各アプリケーション・パッケージに格納されるデータ・ファイルは、Androidオペレーティング環境内の複数プロセスによって絶えずアクセスされます。zipalignツールの詳細は、Android開発者のWebサイト(http://developer.android.com/tools/help/zipalign.html)を参照してください。

- ロギング・レベル出力を詳細またはデバッグに設定します。

- デプロイメント・ターゲットに適した署名オプションを設定します(エミュレータまたはデバイス)。詳細は、第16.2.3.3項「Android署名オプションの定義」を参照してください。

図16-6 デプロイメント・プロファイルのプロパティ・エディタ(「Androidオプション」ページ)

アプリケーション・オプションを設定するには:

1. 「Androidオプション」(図16-6を参照)を選択します。

2. デフォルト値をそのまま使用するか、次のオプションを定義します。

- アプリケーション・バンドルID: adfmf-application.xmlファイルのid属性で設定されるアプリケーションの一意のID。Androidデバイスにデプロイされる各アプリケーションには、一意のIDがあります。このIDを数字から始めることはできません。詳細は、第5.3項「ADFモバイル・アプリケーションの基本情報の設定」を参照してください。
必要な場合は、デプロイメント・ファイルでこの値をオーバーライドできます。ただし、デプロイするアプリケーションでは、この名前は、Androidマニフェスト・ファイルの<manifest>要素のpackage属性に従う必要があります。この詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/manifest/manifest-intro.html)を参照してください。具体的には、IDには、インターネット・ドメイン(com.company.application)のリバースパッケージ書式を使用します。ネーミングの競合を避けるために、パッケージ名にはドメインの所有者が反映されます(例: com.oracle.application)。

注意:

アプリケーション・バンドルIDに空白を含めることはできません。

- バージョン名: ユーザーに表示されるアプリケーション・コードのリリース・バージョン。第5.3項「ADFモバイル・アプリケーションの基本情報の設定」も参照してください。

- バージョン・コード: アプリケーション・コードのバージョンを表す整数値。これは、他のアプリケーションによってプログラムで、アップグレードかダウングレードかチェックされます。デフォルトは1で、これが最小の値です。任意の値を選択し、リリースごとに1つずつ値を増やすことができます。

16.2.3.2 デプロイメント・オプションの設定

「オプション」ページでは、javacコンパイラ・ツール・オプションによって渡される値、zipalignオプションおよびAndroid APIリビジョンを設定できます。

R.javaファイルと.classファイルのJDK互換性レベルを設定するには:

1. 「ソース・ファイル」ドロップダウン・リストからJDK互換性レベルを選択します。デフォルト値は1.5です。この値は、デプロイメントでjavacツールを実行し、javac -sourceオプションを使用してR.java (アプリケーション・リソースの参照用にAndroidによって生成されたファイル)をコンパイルする際に指定されます。次の値を使用できます。

- 1.5

- 1.6

R.javaの詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/resources/accessing-resources.html)を参照してください。

2. 「クラス・ファイル」ドロップダウン・リストから、コンパイルされた.classファイルのJDKバージョンの互換性を選択します。この値は、デプロイメントでjavacツールを実行し、javac -targetオプションを使用してR.javaファイルをコンパイルする際に指定されます。デフォルト値は1.5です。次の値を使用できます。

- 1.5

- 1.6

3. 「ターゲットSDK APIレベル」ドロップダウン・リストから、アプリケーションが実行されるAPIレベルを選択します。最小(デフォルト)値はAPIレベル9で、これはAndroid 2.3.nプラットフォームに対応します。詳細は、Android開発者のWebサイト(http://developer.android.com/guide/topics/manifest/manifest-intro.html)で、Androidマニフェスト・ファイルの<uses-sdk>属性の説明を参照してください。

4. 「最小SDK APIレベル」ドロップダウン・リストから、アプリケーションが実行できる最小APIレベルを選択します。最小(デフォルト)値は9で、これはAndroid 2.3.nプラットフォームに対応します。

5. 「文字エンコーディング」ドロップダウン・リストから、コンパイラがASCIIキャラクタ・セット以外の文字を解釈する方法を制御するネイティブエンコーディング名を選択します。デフォルトはUTF-8です。

ZIP位置合せオプションを設定するには:

バイト位置合せ(32ビットまたは64ビット)を選択します。32ビット(デフォルト)を選択すると、4バイト境界の位置合せが提供されます。

ロギング・レベルを設定するには、次のようにします。

Androidデプロイメントに「詳細出力」を選択して、.apkのビルド時にデプロイメントによって起動される各コマンドライン・ツールによって提供される全出力をログに記録します。このオプションを選択しないと、デプロイメントですべての出力がログに記録されません。

16.2.3.3 Android署名オプションの定義

アプリケーションは、Androidデバイスまたはエミュレータにデプロイする前に、署名する必要があります。Androidでは、認証局は不要です。アプリケーションは自己署名できます。

デプロイメントにおけるADFモバイル・アプリケーションの署名方法の定義は、2つの手順で構成されます。まず、「ADFモバイル」の「プラットフォーム」プリファレンス・ページで、Androidアプリケーションの署名に使用されるキーのデバッグおよびリリース・プロパティを定義します。デバッグおよびリリースの署名プロパティは、一度構成するのみでかまいません。これらのオプションを定義したら、デプロイメント・プロファイルを構成して、デバッグ・モードとリリース・モードのどちらでアプリケーションをデプロイするかを指定します。

始める前に:

詳細は、Android開発者のWebサイト(http://developer.android.com/tools/publishing/app-signing.html)で、リリース・モードとデバッグ・モードでの署名の説明を参照してください。

デバッグ・モードまたはリリース・モードのキー・オプションを構成するには:

1. 「ツール」→「プリファレンス」→「ADFモバイル」を選択します。

2. 「プラットフォーム」を選択します。

3. 「デバッグ」タブ(図16-7を参照)を選択します。

図16-7 デバッグ・デプロイメントの構成

4. 「キーとキーストア・パスワード」フィールドに、デバッグ・デプロイメントに必要なキーストア・ファイルとキーを作成するためにデプロイメントで使用されるパスワードを入力します。Androidデバイスまたはエミュレータへのデプロイメント用のキーストアとキーファイルを生成するこのパスワードには、6文字以上の長さであれば、任意の値を指定できます。デフォルトのパスワードはAndroidです。

5. 「リリース」タブ(図16-5を参照)を選択して、次を定義します。

- キーストアの場所: 秘密鍵を含むキーストアのディレクトリを入力します。

- キーストア・パスワード: キーストアのパスワードを入力します。

- キーの別名: キーの別名を入力します。別名の最初の8文字のみが使用されます。

- キー・パスワード: キーのパスワードを入力します。
これらのパラメータでは、アプリケーションの署名方法の指定に加え、R.Javaクラスのコンパイル方法も指定します。詳細は、第16.2.3.6項「AndroidエミュレータまたはAndroidデバイスにアプリケーションをデプロイする場合のJDeveloperでの処理」を参照してください。

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

Androidビルド・モードを設定するには:

1. ビルド・モードとして「デバッグ」または「リリース」を選択します。

- アプリケーションの開発やテストを行う際は「デバッグ」を選択します。このオプションを使用すると、秘密鍵を提供しなくても、Androidプラットフォーム上でアプリケーションをデプロイできます。Androidエミュレータまたはテスト用のAndroidデバイスにアプリケーションをする場合は、このオプションを使用します。

注意:

デバッグ・キーストアおよびキーで署名されたアプリケーションは公開できません。デバッグ・キーストアおよびキーは、テストのみに使用され、エンド・ユーザーへのアプリケーションの公開には使用できません。

- アプリケーションを公開する準備ができた場合は、「リリース」を選択します。このオプションは、アプリケーション・マーケットプレイス(Google Playなど)にアプリケーションを公開する準備ができた場合に使用します。

2. 「OK」をクリックします。
デバッグ・モードまたはリリース・モードで署名された.apkファイルは、デバイスまたはエミュレータにデプロイできます。

16.2.3.4 Androidアプリケーションへのカスタム・イメージの追加方法

サイズや解像度の異なるAndroidデバイス上でADFモバイル・アプリケーション・アイコンが適切に表示されるようにするには、同じイメージの低密度、中密度および高密度バージョンを用意する必要があります。ADFモバイルは、これらの表示要件を満たすデフォルトOracleイメージを提供します。ただし、アプリケーションでカスタム・アイコンが必要とされる場合は、「アプリケーション・イメージ」ページ(図16-8を参照)を使用して、アプリケーション・アイコンとスプラッシュ画面用のPNG形式のイメージを選択することで、デフォルト・イメージをオーバーライドできます。スプラッシュ画面には、縦向きと横向きのイメージを追加できます。カスタム・イメージ・ファイルを追加しない場合は、デフォルトのOracleアイコンが使用されます。カスタム・イメージを作成する際は、Android開発者のWebサイト(http://developer.android.com/guide/practices/ui_guidelines/icon_design.html)で説明されているアイコン・デザイン・ガイドラインに従ってください。

図16-8 Androidアプリケーション用の縦向きのカスタム・イメージの設定

始める前に:

Androidのテーマに適したディメンション、密度およびコンポーネントを使用することに加え、複数の画面タイプをサポートすることが可能なPNG、JPEGまたはGIFファイル形式のイメージを取得します。詳細は、Android開発者のWebサイト(http://developer.android.com/guide/practices/screens_support.html)を参照してください。

カスタム・イメージを追加するには:

1. 「アプリケーション・イメージ」をクリックします。

2. 「参照」機能を使用して、プロジェクト・ファイルからスプラッシュ画面およびアイコン・イメージ・ファイルを選択します。図16-8には、低密度、中密度、高密度および超高密度ディスプレイを装備するデバイスでの表示にアプリケーションで使用されるアプリケーション・アイコンのイメージと縦向きのスプラッシュ画面用のイメージを選択する様子が示されています。図16-9では、スプラッシュ画面イメージに対して「横」タブが選択されています。これによって、低密度、中密度、高密度および超高密度ディスプレイを装備するデバイス用にアプリケーションで使用する横向きのスプラッシュ画面イメージを追加できます。これらのファイルは、ADFモバイル・アプリケーション内の任意の場所に配置できます。

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

図16-9 横向きのスプラッシュ画面イメージの設定

16.2.3.5 JDeveloperによってAndroidアプリケーション用のイメージがデプロイされる場合の処理

デプロイメントの際、ADFモバイルにより、JDeveloperは、ソースの場所から一時デプロイメント・フォルダにイメージをコピーできます。ADFモバイル拡張機能に付属のデフォルト・イメージ(workspace_directory\Application Resources\Resources\images内)の場合は、JDeveloperはシードされた場所から、ビュー・コントローラ・プロジェクトのデプロイメント・サブディレクトリ(workspace_directory\ViewController\deploy)にコピーします。表16-2に示されているように、各イメージ・ファイルは、drawableオブジェクトにちなんで名付けられたdrawableというサブディレクトリにコピーされます。詳細は、Android開発者のWebサイト(http://developer.android.com/reference/android/graphics/drawable/Drawable.html)を参照してください。それぞれのdrawableディレクトリは、イメージ密度(ldpi、mdpi、hdpiおよびxhdpi)と向き(port、land)に対応します。これらのディレクトリ内で、JDeveloperは、各アイコン・イメージ・ファイルの名前をadfmf_icon.pngに、各スプラッシュ画面イメージの名前をadfmf_loading.pngに変更します。

表16-2 シードされたアプリケーション・イメージのデプロイメント・ファイルの場所

ソース・ファイル(...\resource\Android)

一時デプロイメント・ファイル(...ViewController\deploy)

display-ldpi-icon.png

drawable-ldpi\adfmf_icon.png

display-mdpi-icon.png

drawable-mdpi\adfmf_icon.png

display-hdpi-icon.png

drawable-hdpi\adfmf_icon.png

display-xhdpi-icon.png

drawable-xhdpi\adfmf_icon.png

display-port-ldpi-splashscreen.png

drawable-port-ldpi\adfmf_loading.png

display-port-mdpi-splashscreen.png

drawable-port-mdpi\adfmf_loading.png

display-port-hdpi-splashscreen.png

drawable-port-hdpi\adfmf_loading.png

display-port-xhdpi-splashscreen.png

drawable-port-xhdpi\adfmf_loading.png

display-land-ldpi-splashscreen.png

drawable-land-ldpi\adfmf_loading.png

display-land-mdpi-splashscreen.png

drawable-land-mdpi\adfmf_loading.png

display-land-hdpi-splashscreen.png

drawable-land-hdpi\adfmf_loading.png

display-land-xhdpi-splashscreen.png

drawable-land-xhdpi\adfmf_loading.png

カスタム・イメージの場合、JDeveloperは、アプリケーション・アイコンのセットを指定の場所から一時デプロイメントの場所の対応する密度と向きのサブディレクトリにコピーします。

16.2.3.6 AndroidエミュレータまたはAndroidデバイスにアプリケーションをデプロイする場合のJDeveloperでの処理

Androidデバイスへの実行時デプロイメントの場合、デプロイヤは次を実行します。

1. 選択されたすべてのデプロイメント・オプションを検証します。

2. このデプロイメント・プロファイルの既存のテンプレートをすべて削除します。

3. Oracle_ADFmf_Framework.zipからAndroidテンプレートを解凍します。

4. テンプレートに提供されているAndroidManifest.template.xmlファイルからAndroidManifest.xmlファイルを作成します。

5. adfmf-application.xmlファイルとadfmf-feature.xmlファイルの内容から、Androidのpreferences.xmlファイル、strings.xmlファイルおよびarrays.xmlファイルを生成します。詳細は、第B.2項「Android用のプリファレンスの変換」を参照してください。

6. Android Asset Packaging Tool(Windowsの場合はaapt.exe、Macの場合はappt)を起動して、R.javaファイルと最初のAndroidアプリケーション・パッケージ・ファイル(.apk)を生成します。

7. 外部のJDeveloperプロジェクトのコンパイル・プロセスからjavacを起動して、R.javaファイルをコンパイルします。このファイルはAndroid JVM内で実行されるので、JDKバージョン1.5以上を使用してコンパイルする必要があります。

8. 依存性を分析および評価します。JVM 1.4 JDKを使用して、ユーザーが追加した.javaコードをコンパイルします。これらのファイルはJDKでコンパイルする必要があり、JVM 1.4で実行されます。

9. .classファイルまたは.classファイルを含むアーカイブ互換ファイルからDalvikバイト・コードを生成するAndroidツール(dex.bat)を起動します。AndroidテンプレートJARファイルの内容も含まれます(phonegap.jar、container.jarおよびksoap.jar)。

10. Android Asset Packaging Tool(aapt.exe)ツールを起動して、手順6で作成されたアプリケーション・ファイルをDalvikバイト・コード・ファイルで更新します。

11. デバッグモードのデプロイメント用のキーストアとキーを作成します。

12. Androidアプリケーション・ファイルに署名します。

13. アプリケーションの位置合せを行います(リリースモードのデプロイメントの場合)。

14. Androidデバッグ・ブリッジ(Windowsの場合はadb.exe、Macの場合はadb)ツールを起動して、Androidデバイスにアプリケーションをデプロイします。

16.2.4 iOSデプロイメント・プロファイルの作成方法

iOSの場合は、デプロイメント・プロファイルのプロパティ・エディタを使用して、iOSアプリケーションのビルド構成と、スプラッシュ画面イメージおよびアプリケーション・アイコンの場所を定義できます。

始める前に:

JDeveloperも実行されているAppleコンピュータに、Xcode 4.2以降をダウンロードします。Xcodeには、Xcode IDE、パフォーマンス分析ツール、iOSシミュレータ、Mac OS XおよびiOS SDKが含まれています。Xcodeはデプロイメント時に使用されるので、JDeveloperからADFモバイル・アプリケーションをデプロイする前にAppleコンピュータにインストールする必要があります。Xcodeのダウンロードの詳細は、次を参照してください。

http://developer.apple.com/xcode/

Xcodeをダウンロードしたら、「ADFモバイル」の「プラットフォーム」プリファレンス・ページで、そのxcodebuildツールの場所を入力する必要があります。iOSシミュレータへのデプロイメントの場合は、iOSシミュレータのSDKの場所も入力します。詳細は、第3.3.1項「プラットフォームとフォーム・ファクタに応じた開発環境の構成方法」を参照してください。

ADFモバイル・アプリケーションを(iOSシミュレータではなく)iOSデバイスにデプロイするには、iOSプロビジョニング・プロファイルからプロビジョニング・プロファイルと証明書の両方を取得する必要があります。詳細は、第16.2.4.2項「デバイス署名オプションの設定」を参照してください。

デプロイメント・プロファイルを作成する手順は、次のとおりです。

1. 「iOSオプション」(図16-10を参照)を選択します。

2. デフォルト値をそのまま使用するか、次を定義します。

- アプリケーション・バンドルID: 必要な場合は、このアプリケーションで使用する、会社のドメイン名を特定するバンドルIDを入力します。アプリケーション・バンドルIDは、iOSデバイスにインストールされた各アプリケーションに対して一意であることと、『iOS Development Workflow Guide』の「Application ID Errors」の項で説明されているリバースパッケージ・スタイルのネーミング規則に従うことが必要です(つまり、com.<organization name>.<company name>)。iOS Provisioning Portalを使用したバンドル・シードIDの取得の詳細は、第16.4.4.3項「アプリケーションIDの登録」を参照してください。また、第5.3項「ADFモバイル・アプリケーションの基本情報の設定」も参照してください。

注意:

アプリケーション・バンドルIDに空白を含めることはできません。

それぞれのアプリケーション・バンドルIDは一意であるため、複数のADFモバイル・アプリケーションを同じデバイスにデプロイできます。アプリケーション・バンドルIDさえ異なっていれば、2つのアプリケーションに同じ名前を指定できます。同じデバイスにデプロイされるモバイル・アプリケーションは、それぞれ別のサンドボックスに配置されます。アプリケーションが相互に認識したり、データを共有することはありません(デバイス・スコープのみが共通になります)。

- アプリケーション・アーカイブ名: 必要な場合は、「デプロイメント・アクション」ダイアログ(図16-21を参照)で「配布パッケージにデプロイ」オプションまたは「デバイスとの同期のためにiTunesにデプロイ」オプションを選択したときにADFモバイルによって作成される.ipaファイルの名前を入力します。または、デフォルトの名前を使用します。詳細は、第16.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」と第16.4.5項「iTunesへのiOSアプリケーションの配布方法」を参照してください。
ADFモバイルのデフォルトでは、.ipaファイルの名前は、adfmf-application.xmlファイルで構成されているアプリケーションのid属性に基づいて付けられます。詳細は、第5.3項「ADFモバイル・アプリケーションの基本情報の設定」を参照してください。

- 最小iOSバージョン: アプリケーションをデプロイできるiOSバージョンの中で、最も古いものを指定します。デフォルト値は現在のバージョンです。バージョンは、インストールされているSDKのバージョンによって異なります。ADFモバイルによってサポートされる最低バージョンは5.0です。

- シミュレータ・ターゲット・バージョン: アプリケーションをデプロイするエミュレータのバージョンを選択します。使用可能なターゲット・バージョンを確認するには、iPhoneシミュレータで「Hardware」→「Version」を選択します。最低バージョンは5.0です。デフォルト設定は「最大使用可能」です。また、iOS Developer Library(http://developer.apple.com/library/ios/navigation/)から入手可能な『Tools Workflow Guide for iOS』の「Using iOS Simulator」の章も参照してください。

注意:

通常は、iOSターゲット・バージョンより古いバージョンをテスト用のシミュレータで使用できます。

- ターゲット・ファミリ: アプリケーションを実行するiOS製品ファミリを選択します。デフォルト・オプションはiPadとiPhoneの両方です。

図16-10 iOSオプションの設定

16.2.4.1 iOSビルド・オプションの定義

iOSビルド・オプションでは、デバッグまたはリリース・ビットとライブラリによりアプリケーションをデプロイできます。「オプション」ページには、iOS署名モードの構成オプション、デバッグ・モードとリリース・モードが表示されます。

始める前に:

iOSアプリケーション(.ipaファイル)をiOSデバイスにデプロイするには、インストールの必須コンポーネントであるプロビジョニング・プロファイルと、デバイス上の開発者とアプリケーションを特定する署名済証明書が必要です。これらはiOS Provisioning Portalから取得する必要があります。詳細は、第16.4.4項「iOSデバイスへのアプリケーションのデプロイについて」を参照してください。さらに、「ADFモバイル」の「プラットフォーム」プリファレンス・ページで、プロビジョニング・プロファイルの場所と証明書の名前を入力する必要があります。詳細は、第16.2.4.2項「デバイス署名オプションの設定」を参照してください。

ビルド・オプションを設定するには:

1. 「iOSオプション」を選択します(図16-10を参照)。

2. 次のいずれかのビルド・オプションを選択します。

- デバッグ: 開発用のビルドの場合はこのオプションを選択します。デバッグ・ビルドを指定すると、デバッグ・シンボルが含まれます。第18.3.1項「iOSプラットフォームでのデバッグ方法」も参照してください。

- リリース: リリース・ビットおよびライブラリを使用してビルドをコンパイルする場合に選択します。

16.2.4.2 デバイス署名オプションの設定

iOSの「ADFモバイル」の「プラットフォーム」プリファレンス・ページには、開発コンピュータ上でのプロビジョニング・プロファイルの場所と証明書の名前のフィールドが含まれています。iOSデバイスにアプリケーションをデプロイする場合は、これらのパラメータを定義する必要があります。

注意:

ADFモバイル・アプリケーションをiOSシミュレータにデプロイする場合は、証明書とプロビジョニング・プロファイルのいずれも不要です。

署名オプションを設定するには:

1. 「ツール」→「プリファレンス」→「ADFモバイル」を選択します。

2. 「プラットフォーム」→「iOS」を選択します。

3. ページの「デバイス署名」セクション(図16-11を参照)で、「プロビジョニング・プロファイル」フィールドにプロビジョニング・プロファイルの場所を入力します。

4. 「証明書」フィールドに、コードの作成者(開発者や会社など)を特定する開発者または配布証明書の名前を入力します。証明書の名前は、Keychain Accessユーティリティ(Applicationsフォルダからアクセス)を使用して表示できます。Keychain Accessユーティリティから名前全体をコピーしてください。「証明書」フィールドに入力する名前は、次の書式に従う必要があります。

iPhone Developer: John Smith (PN3ENLQ3DU)

図16-11 「ADFモバイル」の「プラットフォーム」プリファレンス・ページの「デバイス署名」セクション

注意:

プロビジョニング・プロファイルには、アプリケーションの開発バージョン用とリリース・バージョン用の両方があります。アプリケーションのリリース・バージョンに使用されるプロビジョニング・プロファイルは、あらゆるデバイスにインストールできます。一方、開発バージョン用のプロビジョニング・プロファイルは、IDがプロファイルに埋め込まれたデバイスのみにインストールできます。詳細は、iOS Developer Library(http://developer.apple.com/library/ios/navigation/)から入手可能な『Tools Workflow Guide for iOS』の「Configuring Development and Distribution Assets」の章を参照してください。

16.2.4.3 iOSアプリケーションへのカスタム・イメージの追加

「アプリケーション・イメージ」ページでは、アプリケーション・アイコンに使用するデフォルトのOracleイメージを、カスタム・イメージでオーバーライドできます。図16-13に示されているこのページのオプションでは、様々な状況、デバイスの向きおよびデバイスの解像度で使用されるカスタム・イメージの場所を入力できます。iOSアプリケーション・アイコン・イメージの詳細は、『iOS App Programming Guide』の「Application Icons」と「Providing Launch Images for Different Orientations」の項および『iOS Human Interface Guidelines』の「Custom Icon and Image Creation Guidelines」の項を参照してください。これらのドキュメントはiOS Developer Library(http://developer.apple.com/library/ios/navigation/)から入手できます。

注意:

すべてのイメージはPNG形式であることが必要です。

カスタム・イメージを追加するには:

1. 「アプリケーション・イメージ」をクリックします。

2. アイコン上部に光沢効果のあるデフォルトのiOSスタイルのアイコンを使用しない場合は、「アイコンに光沢効果を追加しない」を選択します。図16-12に光沢効果を示します。

図16-12 デフォルトの光沢効果のあるアイコン

3. 「参照」を選択して、次のイメージを選択します。

- iTunesArtwork: アイコン・イメージを参照および選択して、iTunesによって.ipaファイルに割り当てられるデフォルトのAppleイメージをオーバーライドします。このイメージはすべてのアプリケーションに必要とされ、iPhoneアプリケーションとiPadアプリケーションのどちらも512 x 512ピクセルであることが必要です。詳細は、第16.2.4.4項「iTunesArtworkについて」を参照してください。

- アプリケーション・アイコン: iPhoneとiPadのアイコン・イメージの場所か、Retinaディスプレイ搭載デバイスで使用されるこれらのイメージの場所を入力します。ファイル名は、Retinaバージョンと非Retinaバージョンのアイコンの両方で同じであることが必要です。iPhoneアイコンの場合、ADFモバイル・デプロイメント・フレームワークでは、Retinaイメージのファイル名に@2x修飾子を追加することで、この2つを区別します。iPad Retinaディスプレイの場合は、関連するイメージのディメンション(144 x 144ピクセル)を反映して、ファイル名に-144が追加されます。非Retina iPadディスプレイの場合も同様に、iPadアイコン・ファイル名に-72という修飾子を追加して、イメージのディメンション(72 x 72ピクセル)を示します。表16-3に、デバイス固有のアプリケーション・イメージに必要なディメンション(ピクセル単位)をリストします。

表16-3 アプリケーション・アイコンのディメンション

デバイス

ディメンション(ピクセル単位)

iPhone

57 x 57

iPhone Retina

114 x 114

iPad

72 x 72

iPad Retina

144 x 144

- スプラッシュ画面イメージ: アプリケーションの起動時に使用されるイメージの場所を入力します。iPhoneの場合、このイメージにはDefault.pngという名前を付ける必要があります。デバイスのタイプと向きに応じて、縦向きまたは横向きのバージョン用に選択されたイメージによってこのイメージをオーバーライドできます。ADFモバイル・デプロイメント・フレームワークでは、PortraitおよびLandscape修飾子がファイル名に追加されます。また、Retinaディスプレイで使用されるイメージのファイル名には、@2xが追加されます。表16-4に、スプラッシュ画面のイメージに必要なディメンション(ピクセル単位)をリストします。

表16-4 スプラッシュ画面のイメージのディメンション

デバイス

縦向き

横向き

iPhone

320 x 480

利用不可

iPad

768 x 1004

1024 x 748

iPad Retina

640 x 960

2048 x 1496

iPhone Retina

1536 x 2008

利用不可

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

図16-13 カスタム・イメージの追加

16.2.4.4 iTunesArtworkについて

デフォルトでは、iTunesを通してiOSデバイスにデプロイされる、またはダウンロード用のアーカイブ(.ipaファイル)としてデプロイされるADFモバイル・アプリケーションでは、別途指定されていないかぎり、図16-12に示されたデフォルトのOracleイメージが使用されます。

デプロイされるアプリケーションのアイコンとしてiTunesArtworkイメージを選択することで、デフォルトのイメージをオーバーライドします。イメージを使用してアプリケーションのバージョンを区別できます。図16-14に、デフォルト・イメージとユーザーが選択したイメージの違いを示します。Application4にはデフォルト・イメージが、Application6にはユーザーが選択したイメージ(512 x 512ピクセルにスケールを変更したOracleアイコン)が表示されています。

図16-14 カスタムとデフォルトのアプリケーション・アイコン

デプロイメント時に、ADFモバイルは、.ipaファイルのトップレベルのiTunesArtworkというファイルにそのiTunesのアートワーク・イメージを追加することで、iTunesでそのアイコンが表示されるようにします。

16.2.4.5 表示をデバイスの特定の向きに制限する方法

デフォルトで、ADFモバイルは、iPhoneとiPadの両方ですべての向きをサポートします。たとえば、iPads上で上下逆の縦向きでのみ表示する必要があるアプリケーションでは、「デバイスの向き」ページ(図16-15を参照)を使用して、アプリケーションの回転をこれらの向きのみに制限できます。

図16-15 デバイスの向きの選択

アプリケーションの表示をデバイスの特定の向きに制限するには:

1. 「デバイスの向き」を選択します(図16-15を参照)。

2. 表16-5にリストされた向きの中から、不要な向きをすべて消去します。デフォルトでは、ADFモバイルは、これらすべてのデバイスの向きにデプロイします。デフォルトでは、これらの向きがすべて選択されています。

表16-5 iPhoneデバイスの向き

アイコン

説明

iPad、縦: ホーム・ボタンは画面の下部。

iPad、上下逆: ホーム・ボタンは画面の上部。

iPad、横左: ホーム・ボタンは画面の左側。

iPad、横右: ホーム・ボタンは画面の右側。

iPhone、縦: ホーム・ボタンは画面の下部。

iPhone、上下逆: ホーム・ボタンは画面の上部。

iPhone、横左: ホーム・ボタンは画面の左側。

iPhone、横右: ホーム・ボタンは画面の右側。

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

16.2.4.6 デバイスの向きを選択解除する場合の処理

デバイスの向きを選択解除すると、ソース.plistファイルが更新されます。

16.3 Androidアプリケーションのデプロイ

デプロイメント・プロファイルを定義したら、「デプロイメント・アクション」ダイアログ(図16-16を参照)を使用してAndroidプラットフォームにADFモバイル・アプリケーションをデプロイできます。このダイアログを使用すると、完了したアプリケーションを、Androidエミュレータまたはテスト用のAndroidデバイスにデプロイできます。アプリケーションのテストとデバッグが完了したら、このダイアログを使用して、ADFモバイル・アプリケーションをAndroidアプリケーション・パッケージ・ファイル(.apk)としてバンドルできます。これによって、アプリケーション・マーケットプレイス(Google Playなど)を通して、アプリケーションをエンド・ユーザーに公開することが可能になります。

ヒント:

「デプロイメント・アクション」ダイアログのかわりに、OJDeployコマンドライン・ツールを使用してADFモバイル・アプリケーションをAndroidプラットフォームに手動でデプロイすることもできます。詳細は、第16.6項「コマンドラインからのADFモバイル・アプリケーションのデプロイ」を参照してください。

図16-16 Androidアプリケーションの「デプロイメント・アクション」ダイアログ

16.3.1 AndroidエミュレータへのAndroidアプリケーションのデプロイ方法

ADFモバイル・アプリケーションはAndroidエミュレータに直接デプロイできます。

始める前に:

Androidエミュレータにデプロイするには、次を行う必要があります。

- 「ADFモバイル」の「プラットフォーム」プリファレンス・ページ(「ツール」→「プリファレンス」→「ADFモバイル」を選択してアクセス)で、デバッグ・パスワードを構成します。

注意:

Android 4.0.nプラットフォーム(API 14以降)をインストールする必要があります。

- Android Virtual Deviceインスタンスの構成にARMシステム・イメージが反映されていることを確認します。

- デプロイメント・プロファイルの「Androidオプション」ページで、次を行います。

1. 「デバッグ」が選択されていることを確認します。

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

注意:

「ADFモバイル」の「プラットフォーム」プリファレンス・ページは、デバッグ・モードのデプロイメント用のキーストアとキーの生成に使用されるパスワードで構成する必要があります。詳細は、第16.2.3.3項「Android署名オプションの定義」を参照してください。

- アプリケーションをデプロイする前にAndroidエミュレータを起動します。
エミュレータは、Android Virtual Device Manager(図16-17を参照)またはコマンドラインを使用して起動できます。コマンドラインから起動する場合は、toolsディレクトリ(Android\android-sdk内)に移動し、emulator -avdに続けてエミュレータ名を入力することで(例: -avd AndroidEmulator1)、エミュレータを起動します。

注意:

デプロイメント時にはAndroidエミュレータを1つのみ実行できます。

図16-17 Android Virtual Device Managerを使用したエミュレータの起動

アプリケーションをAndroidエミュレータにデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、Androidデプロイメント・プロファイルを選択します。

2. 「アプリケーションのエミュレータへのデプロイ」→「次へ」を選択します。

3. 「サマリー」ページ(図16-2を参照)をレビューし、「戻る」を選択して別のデプロイメント・アクティビティを選択するか、「終了」を選択します。「サマリー」ページには、デプロイメント・プロファイルの次のパラメータが表示されます。

- アプリケーション・バンドルID: アプリケーションを特定する、Java言語のような一意のパッケージ名。

注意:

図16-18の「サマリー」ページには、アプリケーション・バンドルIDが、エミュレータへのデプロイメントの成功に必要なリバースパッケージ書式であることが示されています。リバースパッケージ書式に従わないアプリケーションをデプロイすると、エミュレータが停止して、デプロイメントを完了できなくなります。

- ファイル: Androidターゲットにデプロイされる.apkの名前。

- デプロイ・モード: ビルド・モード。この値は、デプロイメント・プロファイルに設定されている値に応じて、「リリース」と「デバッグ」のいずれかになります。

図16-18 Androidエミュレータ・デプロイメントのサマリー

4. デプロイメント・ログをレビューします(図16-19を参照)。デプロイメント・ログには、デプロイヤがAndroidエミュレータの実行中インスタンスを検出し、Androidデバッグ・ブリッジ・サーバーを起動したことが示されます。第16.3.6項「Androidデバッグ・ブリッジの使用方法について」も参照してください。

図16-19 デプロイメント・ログ

16.3.2 Androidデバイスへのアプリケーションのデプロイ方法

ADFモバイル・アプリケーションは、2.n (APIレベル9)以降のプラットフォーム上で動作するAndroidデバイスに直接デプロイできます。

始める前に:

第3.5.3項「Androidデバイスの設定方法」の説明に従って、JDeveloperをホストする開発コンピュータにデバイスを接続します。

デプロイメント・オプション・ページ(図16-6を参照)で、ビルド・モードとして「デバッグ」を選択します。図16-7に示されているように、デバッグ署名資格証明が「ADFモバイル」の「プラットフォーム」ページで構成されていることを確認します。

Androidデバイスにアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、Androidデプロイメント・プロファイルを選択します。

2. 「アプリケーションのデバイスへのデプロイ」→「次へ」を選択します。

3. 「概要」ページを確認します。「戻る」または「次へ」をクリックします。

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

16.3.3 Androidアプリケーションの公開方法

第18章「ADFモバイル・アプリケーションのテストとデバッグ」の説明に従ってアプリケーションのテストとデバッグが完了したら、Android開発者のWebサイト(http://developer.android.com/tools/publishing/publishing_overview.html)の説明に従ってアプリケーション・マーケットプレイス(Google Playなど)にアプリケーションを公開できます。

始める前に:

デプロイメント・プロファイルの「Androidオプション」ページで、ビルド・モードとして「リリース」を選択します。

注意:

「ADFモバイル」の「プラットフォーム」プリファレンス・ページ(「ツール」→「プリファレンス」→「ADFモバイル」を選択してアクセス)で、署名オプションを構成する必要があります。詳細は、第16.2.3.3項「Android署名オプションの定義」を参照してください。

.apkファイルとしてアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、Androidデプロイメント・プロファイルを選択します。

2. 「アプリケーションのパッケージへのデプロイ」→「次へ」を選択します。

3. 「サマリー」ページ(図16-18を参照)をレビューします。「戻る」または「次へ」をクリックします。

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

5. アプリケーション・マーケットプレイスにアプリケーションを公開します。

16.3.4 .apkファイル作成時のJDeveloperでの処理

アプリケーションをデプロイすると、次のものが.apkファイルにデプロイされます。

- adfmsrcの内容

- .adfフォルダの内容

- adfmf-application.xmlファイルとadfmf-feature.xmlファイル

- logging.propertiesファイル

- JVM 1.4ファイル

表16-6 .apkファイルの内容

内容

.apkファイル内の場所

.adfフォルダの内容

Androidアプリケーション・ファイルのルート・フォルダ([apkRoot]\.adf)

adfmsrcフォルダの内容

デプロイメントでは、adfmsrcフォルダの内容が、userフォルダ([apkRoot]\user)内のデフォルトJARファイルにパッケージ化されます。このJARファイルはAndroid Asset Packaging Tool (AAPT)を使用して.apkに追加され、ANDROID_MOBILE_NATIVE_archiveNという書式のデフォルト名を持ちます。デフォルト名のNは、何番目のAndroid作成プロファイルであるかを示します(この名前はプロファイルの作成時にオーバーライドできます)。

このJARファイルには次が含まれます。

- .javaファイルから生成された任意の.classファイル。これは、ビュー・コントローラ・プロジェクトとadfmsrcの内容に追加されます。.javaファイルはJVM 1.4 JDK javacツールを使用してコンパイルされます。

- データ・バインディングおよびpagedefメタデータ・ファイルが含まれます。

このJARファイルはDalvik仮想マシンによって処理されません。.classファイルはJDK内で実行されるので、Dalvikバイトコード形式(.dex)への変換は不要です。

adfmf_application.xmlファイルとadfmf_feature.xmlファイル

Configurationというファイル([apkRoot]\Configuration)内にあります。

logging.propertiesファイル

アプリケーション・ファイルのルートにあります。

JVM 1.4ファイル

JVMファイルは次の2つの別個のフォルダにパッケージ化されます。

- テンプレート内のライブラリ・ファイル(\framework\build\java_res\libs\)は、APK - [apkRoot]\lib内のlibフォルダにパッケージ化されます。

- \framework\build\java_res\assets\storageファイルは、APK - [apkRoot]\assets\storage内のassets\storageディレクトリにパッケージ化されます。

16.3.5 最近使用されたデプロイメント・プロファイルの選択

デプロイメント・アクションを選択すると、JDeveloperによって「デプロイ」メニューにショートカットが作成されます。このショートカットを使用すると、同じデプロイメント・アクションを使用してアプリケーションを簡単に再デプロイできます。

16.3.6 Androidデバッグ・ブリッジの使用方法について

デプロイメントでは、デバイス(デバイスにデプロイする場合)またはエミュレータ(Androidエミュレータにデプロイする場合)が検出されるまで、Androidデバッグ・ブリッジ・サーバーが5回再起動されます。どちらも検出されない場合、図16-20に示すとおり、デプロイメント・プロセスは終了します。

図16-20 終了されたデプロイメント

デプロイメント前にAndroidデバッグ・ブリッジ・コマンドライン・ツールを使用する場合は、デプロイメントの完了後に同じコマンドを再度入力する必要があります。たとえば、デプロイメントの前にエミュレータまたはデバイスのロギング情報を表示するためにadb logcatと入力した場合、ロギング出力の取得を再開するには、アプリケーションがデプロイされた後で再度adb logcatと入力する必要があります。Androidデバッグ・ブリッジ・コマンドライン・ツールは、Android SDKインストールのplatform-toolsディレクトリ内に配置され、ここから実行されます。このツールの詳細は、Android開発者のWebサイト(http://developer.android.com/tools/help/adb.html)を参照してください。

16.4 iOSアプリケーションのデプロイ

図16-21に示された「デプロイメント・アクション」ダイアログでは、iOSアプリケーションを直接iOSシミュレータにデプロイするか、iTunesを通してデバイスにデプロイできます。iOSアプリケーションはAppleコンピュータからのみデプロイできます。

図16-21 「デプロイメント・アクション」ダイアログ(iOSアプリケーション用)

ヒント:

「デプロイメント・アクション」ダイアログのかわりに、OJDeployコマンドライン・ツールを使用してADFモバイル・アプリケーションをAndroidプラットフォームに手動でデプロイすることもできます。詳細は、第16.6項「コマンドラインからのADFモバイル・アプリケーションのデプロイ」を参照してください。

16.4.1 iOSシミュレータへのiOSアプリケーションのデプロイ方法

「デプロイメント・アクション」ダイアログでは、iOSアプリケーションを直接iOSシミュレータにデプロイできます。

始める前に:

iOSシミュレータへのデプロイメントを可能にするには、次のタスクを実行する必要があります。

- 「ADFモバイル」の「プラットフォーム」プリファレンス・ページで、iOSシミュレータのSDKの場所を設定します(図16-23を参照)。

- デプロイメント・プロファイルの「iOSオプション」ページで、「デバッグ」を選択し、「OK」をクリックします。

注意:

「ADFモバイル」の「プラットフォーム」ページ(「ツール」→「プリファレンス」→「プラットフォーム」を選択してアクセス)で、プロビジョニング・プロファイルの場所と証明書の名前を入力する必要があります。詳細は、第16.2.4.2項「デバイス署名オプションの設定」を参照してください。

- Xcodeをインストールして実行し、ライセンス契約を受諾して、指示に従ってインストール後のその他のタスクを実行します。

注意:

アプリケーションをiOSシミュレータにデプロイする前に、最低1回はXcodeを実行する必要があります。これを行わないと、デプロイメントに失敗します。

『iOS Development Workflow Guide』の「Using iOS Simulator」の項を参照してください。iOSシミュレータはXcodeとともにインストールされます。実際のデバイスへのデプロイメントについては、『iOS Development Workflow Guide』の「Managing Devices and Digital Identities」の項を参照してください。

- iOSシミュレータが実行されている場合は、これを停止します。

iOSシミュレータにアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、iOSデプロイメント・プロファイルを選択します。

2. 「アプリケーションのシミュレータへのデプロイ」→「次へ」を選択します。

3. 「サマリー」ページ(図16-22を参照)をレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- アプリケーション・バンドルID: iOS Provisioning Portalから生成されたバンドル・シードが先頭に付加されたJava言語のようなパッケージ名(com.<organization name>.<application name>)を含む一意の名前。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- 証明書: アプリケーションを作成した開発者または会社。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

注意:

iOSシミュレータへのデプロイメントでは、証明書とプロビジョニング・プロファイルの値を定義する必要はありません。このデプロイメント・シナリオでは、「サマリー」ページでこれらの値について<指定なし>と表示されます。

図16-22 デプロイメント・アクションの「サマリー」ダイアログ

16.4.2 iOSデバイスへのアプリケーションのデプロイ方法

「デバイスとの同期のためにiTunesにデプロイ」オプションを使用すると、ADFモバイル・アプリケーションをデバッグおよびテスト用のAppleデバイスにデプロイできます。

始める前に:

JDeveloperからiOSデバイスにアプリケーションを直接デプロイすることはできません。アプリケーションは、Apple iTunesのApplicationsフォルダからデプロイする必要があります。そのためには、次のタスクを実行する必要があります。

- 開発コンピュータにApple iTunesをダウンロードし、ADFモバイルのプラットフォームのプリファレンス・ページでAutomatically Add to iTunesフォルダの場所(アプリケーションのデプロイメントに使用される場所)を設定します(図16-23を参照)。

ヒント:

ユーザーのホーム・ディレクトリ(/User/<username>/Music/iTunes/iTunes Media/Automatically Add to iTunes)は、iTunes Mediaフォルダのデフォルト・ディレクトリですが、このフォルダの場所は次のように変更できます。

1. iTunesで、「Edit」→「Preferences」→「Advanced」を選択します。

2. 「Change」をクリックし、新しい場所を参照します。

3. ライブラリを統合します。

4. 元のiTunes Mediaフォルダを削除します。

手順の詳細は、Apple Support(http://support.apple.com)を参照してください。

「ADFモバイル」の「プラットフォーム」プリファレンス・ページでも場所を更新する必要があります。

- xcodebuildツールが起動されるXcodeフォルダの場所を設定します(例: 図16-23の/Developer/usr/bin)。

図16-23 iTunes Mediaフォルダとxcodebuildシステムの場所の設定

- 証明書の名前とプロビジョニング・プロファイルの場所を、「ADFモバイル」の「プラットフォーム」プリファレンス・ページで入力します。iOS Provisioning Portalによって、iOSデバイスへのデプロイメントまたはApp Storeや内部ダウンロード・サイトへの.ipaファイルの公開に必要な証明書とプロビジョニング・プロファイルが生成されます。

注意:

デバイスまたはアーカイブにデプロイするようにiOSプロビジョニング・プロファイルと証明書を設定しないと、デプロイメントは失敗します。ADFモバイルでは、このような状況でデプロイできなかったアプリケーションがログに記録されます。詳細は、第16.4.4項「iOSデバイスへのアプリケーションのデプロイについて」を参照してください。

- デプロイメント・プロファイルの「iOSオプション」ページで、ビルド・モードとして「デバッグ」を選択し、「OK」を選択します。

iOSデバイスにアプリケーションをデプロイするには:

1. 「アプリケーション」→「デプロイ」を選択し、iOSデプロイメント・プロファイルを選択します。

2. 「デバイスとの同期のためにiTunesにデプロイ」→「次へ」を選択します。

3. 「サマリー」ページをレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- アプリケーション・バンドルID: iOS Provisioning Portalから生成されたバンドル・シードが先頭に付加されたJava言語のようなパッケージ名(com.<organization name>.<application name>)を含む一意の名前。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- 証明書: アプリケーションを作成した開発者(または会社)。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

注意:

証明書とプロビジョニング・プロファイルの値を<指定なし>とすることはできません。iTunesへのデプロイメントを可能にするには、「オプション」ページでこれらの値を指定する必要があります。

4. iOSデバイスを開発コンピュータに接続します。

5. iTunesを開いてデバイスを同期化します。

16.4.3 iOSデバイスにアプリケーションをデプロイする場合の処理

デプロイメントに成功すると、図16-14のようにアプリケーションがiTunesの「Apps」フォルダに表示されます。

16.4.4 iOSデバイスへのアプリケーションのデプロイについて

iOS Development Programのメンバーのみがアクセス可能なiOS Provisioning Portalを使用して最初にプロビジョニング・プロファイルを作成しないかぎり、iOSアプリケーション(つまり、.ipaファイル)をiOSデバイスにデプロイしたり、App Storeまたは内部のホストされたダウンロード・サイトに公開することはできません。第16.2.4.2項「デバイス署名オプションの設定」の説明に従って、「オプション」ページでプロビジョニング・プロファイルの場所と証明書の名前を入力します。

『Tools Workflow Guide for iOS』の「Distributing Apps」の章で説明されているように、プロビジョニング・プロファイルによって開発用証明書、デバイスおよびアプリケーションIDが関連付けられます。iOS Provisioning Portalでは、これらのエンティティとプロビジョニング・プロファイルを作成できます。

ヒント:

プロビジョニング・プロファイルをダウンロードしたら、このファイルをダブルクリックしてLibrary/MobileDevice/Provisioning Profileディレクトリに追加してください。

図16-24 iOS Provisioning Portal

16.4.4.1 iOS開発用証明書の作成

証明書は、開発者のアイデンティティに関する情報と公開鍵および秘密鍵が結合された電子的なドキュメントです。iOS開発用証明書がOS開発者として識別し、デプロイメントのためのアプリケーションの署名を有効にするので、証明書をダウンロードしたら、基本的に開発者自身のアイデンティティを開発コンピュータにインストールします。iOSオペレーティング環境では、すべての証明書がKeychainによって管理されます。

iOS Provisioning Portalの「Certificates」ページを使用して、CSR(証明書署名リクエスト)をログに記録します。CSRを完了すると、iOS Provisioning PortalによってiOS開発用証明書が発行されます。

16.4.4.2 テストおよびデバッグ用のAppleデバイスの登録

開発コンピュータに証明書をインストールしたら、「Current Available Devices」タブ(iOS Provisioning Portalの「Devices」ページ内)をレビューして、開発者自身(またはその会社)がテストやデバッグに使用するAppleデバイスを特定します。シリアル番号のような一意のデバイス識別子(UDID)によって各デバイスを識別するこのリストにデバイスが含まれていないかぎり、アプリケーションはデプロイできません。

16.4.4.3 アプリケーションIDの登録

アプリケーションIDは、デバイス上のアプリケーションの一意の識別子です。アプリケーションIDは、第5.3.1項「モバイル・アプリケーションのIDおよび表示動作の設定方法」で説明されている書式の、バンドルIDと呼ばれる管理者が作成したリバース・ドメイン名の前に、バンドル・シードと呼ばれるAppleが生成した10文字の英数字文字列が付加された構成になります。図16-25には、他のアプリケーションとファイルやKeychainを共有しない、一意のアプリケーションIDが示されています。

図16-25 明示的なアプリケーションID

一方、ファイルやKeychainを共有する(またはKeychainを使用しない)アプリケーションの場合は、アプリケーション名にワイルドカード文字(*)を使用します(例: 8E549T7128.com.oracle.*)。この書式を使用すると、一連のアプリケーションで1つのアプリケーションIDを共有できます。たとえば、iOS Provisioning Portal上で管理者がcom.oracle.ADF.*という名前を付けた場合は、異なるアプリケーション(com.oracle.ADF.application1とcom.oracle.ADF.application2)を指定できます。

16.4.5 iTunesへのiOSアプリケーションの配布方法

iOSデバイス上でのアプリケーションのテストとデバッグが終了したら、App Storeまたは内部ダウンロード・サイトを通してより広範なオーディエンスにアプリケーションを配布できます。iTunesにアプリケーションを公開するには、.ipaファイルをiTunes Connectに送信する必要があります。これによって、.ipaファイルをiTunesに追加して、アプリケーションを更新し、テスト・ユーザーを作成することが可能になります。

始める前に:

アプリケーションを配布する前に、次のタスクを実行する必要があります。

- 実際のiOSデバイス上でアプリケーションをテストします。第16.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」を参照してください。

- iOS Provisioning Portalを通して配布証明書を取得します。

注意:

配布証明書を作成できるのは、チーム・エージェントのみです。

- .ipaファイルをiTunesに配布するための、iTunes Connectアカウントを取得します。詳細は、iOS Development CenterのApp Store Resource Centerにある『Prepare App Submission』を参照してください。具体的には、『App Store Review Guidelines』を確認して、App Review Teamに確実に受け入れられるようにしてください。

- 必要に応じて、『Tools Workflow Guide for iOS』の「Distributing Apps」の項と『iTunes Connect Developer Guide』の両方を確認してください。どちらのガイドも、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)から入手できます。

- デプロイメント・プロファイルの「iOSオプション」ページで、ビルド・モードとして「リリース」を選択し、「OK」をクリックします。

iOSアプリケーションをiTunesに配布するには:

1. 「アプリケーション」→「デプロイ」を選択し、iOSデプロイメント・プロファイルを選択します。

2. 「配布パッケージにデプロイ」を選択します。

3. 「サマリー」ページをレビューします。このページには、次の値が表示されます。「終了」をクリックします。

- アプリケーション・バンドルID: iOS Provisioning Portalから生成されたバンドル・シードが先頭に付加されたJava言語のようなパッケージ名(com.<organization name>.<application name>)を含む一意の名前。

- ファイル: iOSターゲットにデプロイされる最終イメージのファイル名。

- 証明書: アプリケーションの作成者。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

- プロビジョニング・プロファイル: 1つ以上の開発用証明書とデバイスをアプリケーションIDと関連付けるプロビジョニング・プロファイルの名前。デプロイメント・プロファイルの「オプション」ページでこの値が構成されていない場合、「サマリー」ページには<指定なし>と表示されます。

注意:

証明書とプロビジョニング・プロファイルの値は、<指定なし>にはできません。.ipaファイルがiTunesで受け入れられるようにするには、「オプション」ページでこれらの値を指定する必要があります。

4. iTunes Connectにログインします。

5. 『iTunes Connect Developer Guide』の「Adding New Apps」と「Using Application Loader」の項で説明されているManage Your ApplicationsモジュールとApplication Loaderを使用して、検討用に.ipaファイルをiTunes Connectに送信します。

6. アプリケーションが承認されたら、『iTunes Connect Developer Guide』の「Creating Test Users」の項でManage Usersモジュールの使用方法を参照してください。多言語アプリケーションをテストするには、アプリケーションのローカライズ対象地域のテスト・ユーザー・アカウントを作成します。

7. Managing Your Applicationモジュールを使用したバイナリの更新については、『iTunes Connect Developer Guide』の「Editing and Updating App Information」の項を参照してください。

16.4.5.1 iOSシミュレータまたはiOSデバイスにアプリケーションをデプロイする場合のJDeveloperでの処理

デプロイメント・ウィザードを完了すると、JDeveloperによって次のタスクが実行されます。

1. 前提条件として必要なソフトウェアがインストールされていることを検証します。このようなタスクには、たとえば次のようなものがあげられます。

1. 「プリファレンス」で設定されたiOS SDKへのパスが有効でアクセス可能であることを検証します。

2. 「プリファレンス」で設定されたxcodebuildツール(「ADFモバイル」の「プラットフォーム」ページで設定)へのパスが有効でアクセス可能であることを検証します。xcodebuildツールは、iOSプロジェクトをコンパイルするAppleユーティリティです。

3. 必要に応じて他の検証を実行します。

2. このデプロイメント・プロファイルの既存のテンプレートをすべて削除して、新しいデプロイメントで前のデプロイメントの構成セットが使用されないようにします。

3. アプリケーションおよび、アプリケーションとプロジェクトの両方のXMLコンテンツをすべて検証します。

4. 初回(または、「ビルド」→「クリーン」を選択した後)のデプロイメントの場合、JDeveloeprはiOSのOracle_ADFmc_Container_Templateファイルを一時的な場所に解凍します。つまり、modules\adf-mobile\dist\jdev\extensions\oracle.adf.mobile\Oracle_ADFmc_Container_Template.zipが、deployディレクトリ内の、プロファイルのサブディレクトリにパッケージ解除されます。

ヒント:

「ビルド」→「クリーン」を選択すると、Xcodeプロジェクト設定を変更できます。この設定によって、JDeveloperで利用可能な追加オプションが提供されます。

また、JDevelopeは、modules\adf-mobile\dist\jdev\extensions\oracle.adf.mobile\Oracle_ADFmc_Framework_Libraries.zipからの必要なADFモバイル・ライブラリを、前に解凍されたテンプレートのFrameworkディレクトリに解凍します。

注意:

デプロイメントのタイプ(つまり、デバッグやリリースあるいは、シミュレータやデバイスへのデプロイメントやアーカイブとしてのデプロイメント)に依存するすべてのライブラリは、後でテンプレートに追加されます。

5. テンプレートの場所に、ユーザーが選択したカスタム・イメージをコピーします。デプロイメント・プロファイルでカスタム・イメージが選択されている場合、JDeveloperはこれらのイメージをコピーし、適切な名前に変更します。iOSテンプレートでは、アプリケーション・アイコン名およびスプラッシュ画面名として、icon.png、icon-2x.png、icon-72.png、Default.png、Default-Landscape.pngおよびDefault-Portrait.pngという名前が内部的に使用されます。イメージがカスタマイズされていない場合は、JDeveloperによってデフォルト・イメージがテンプレートにコピーされます。

6. テンプレートの場所にWebコンテンツ(機能に関連するイメージを含む)をコピーします。この結果、ADFモバイル・プロジェクト内のpublic_htmlフォルダとそのサブディレクトリが、テンプレートのwwwフォルダにコピーされます。

7. メタデータ・ファイルをテンプレートの場所にコピーします。

1. adfmf-application.xmlファイルをコピーします。

2. adfmf-feature.xmlのすべてのファイルを1つのファイルに結合し、テンプレートに配置します。

8. .plistファイルを作成し、更新します。第B.3項「iOS用のプリファレンスの変換」も参照してください。

1. メタデータ・ファイルから、プリファレンスの.plistファイルを作成します。これらのファイルによって、iOS設定アプリケーションから利用できるプリファレンスが作成されます。

2. アプリケーション名、バンドルID、バージョンおよび事前にレンダリングされたアイコンの使用を決定するフラグによって、root.plistファイルを更新します。アプリケーション名、バンドルIDおよびバージョンは、図16-10「iOSオプションの設定」に示す「iOSオプション」ページとadfmf-application.xmlファイルから取得されます。

9. 選択されたデプロイメント用の適切なフラグを使用して、xcodebuildユーティリティを実行します。たとえば、iOSシミュレータ(バージョン5.0)にデプロイされるデバッグのビルドは次のようになります。

xcodebuild clean install -configuration Debug -sdk iphonesimulator5.0

10. 新たにビルドされたアプリケーションを適切な場所にデプロイします。

1. iOSシミュレータへのデプロイメントの必要に応じて、iOSアプリケーション・バンドルを、一意のアプリケーション・ディレクトリにコピーします。

2. xcrunコマンドを実行し、アプリケーションを.ipaファイルにパッケージ化します。このコマンドによって、アプリケーションを含むPayloadというフォルダを持つ.ipaが作成されます。また、プロビジョニング・プロファイルが追加されて、開発者の名前でアプリケーションが署名されます。xcrunコマンドの例を次に示します。

/usr/bin/xcrun -sdk iphoneos PackageApplication -v "%PROJECT_BUILDDIR%/SampleApp.app" -o "SampleApp.ipa" --sign "iPhone Developer: John Doe (A1BC2DEFGH)" --embed "/Users/jdoe/Desktop/my_profile.mobileprovision"

11. デバイスへのデプロイメントの場合、JDeveloperは.ipaファイルをiTunes Media/Automatically Add to iTunesディレクトリに移動します。

16.5 機能アーカイブ・ファイル(FAR)のデプロイ

ADFモバイルのビュー・コントローラ・プロジェクトによる再利用を可能にするために、アプリケーション機能(一般的に、ADFモバイルAMXまたはローカルHTMLとして実装されるもの)は、機能アーカイブ(FAR)というアーカイブにバンドルされます。FARは基本的に、ADFモバイル・アプリケーションによって使用できる、アプリケーション機能要素(例: アイコン・イメージ、リソース・バンドル、HTML、JavaScriptまたは他の実装固有のファイル)の自己完結型コレクションです。(FARには、Javaクラスを含めることも可能ですが、これらのクラスはコンパイルする必要があります。)例16-1に、1つのadfmf-feature.xmlファイルと1つのconnections.xmlファイルを含むFARの内容を示します。connections.xmlの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のconnections.xmlに関する項とアプリケーション・コンポーネントの再利用に関する項を参照してください。

例16-1 機能アーカイブ・ファイルの内容

connections.xml (or some form of connection metadata)

META-INF
adfm.xml
adfmf-feature.xml
MANIFEST.MF
task-flow-registry.xml

oracle
application1
mobile
Class1.class
DataBindings.cpx
pageDefs
view1PageDefs

model
adfc-mobile-config.adfc.diagram
ViewController-task-flow.adfc.diagram

public_html
adfc-mobile-config.xml
index.html
navbar-icon.html
springboard-icon.html
view1.amx
ViewController-task-flow.xml

機能アーカイブ・ファイルでの作業は、次のタスクから構成されます。

1. 機能アーカイブ・ファイルの作成: 機能アプリケーションをライブラリJARファイルとしてデプロイすることで機能アーカイブを作成します。

2. ADFモバイル・アプリケーション作成時の機能アーカイブ・ファイルの使用: これにはFARのインポートと、インポートされた接続の再マッピングが含まれます。

3. FARの機能を含むADFモバイル・アプリケーションのデプロイ: これには、デプロイメント・テンプレート内の一意の名前が付けられたフォルダへのFARの解凍が含まれます。

注意:

デプロイメント・プロセス時に、ADFモバイルによってFARが生成されます。別のアプリケーションでこのFARを使用する場合は、ビュー・コントローラ・プロジェクトのみをデプロイすればすみます。

16.5.1 機能アーカイブのデプロイメント・プロファイルの作成方法

「デプロイメント・プロファイルの作成」ダイアログを使用します(図16-9を参照)。

図16-26 ADFモバイル機能の作成のダイアログ

始める前に:

アプリケーションの適切な接続を作成します。『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の接続のネーミングの考慮事項に関する項を参照してください。

機能アーカイブのデプロイメント・プロファイルを作成するには:

1. ビュー・コントローラ・プロジェクトを右クリックし、「新規」→「デプロイ」→「新規デプロイメント・プロファイル」を選択します。

注意:

アプリケーションレベルの別個のデプロイメント・プロファイルを作成する必要はありません。

2. 「デプロイメント・プロファイルの作成」ダイアログで「ADFモバイル機能アーカイブ」を選択します。

3. プロファイル名を入力するか、デフォルトを受け入れて、「OK」をクリックします。

注意:

プロファイルには適切な名前を付けてください。そうしないと、アーカイブ名が同じアプリケーション機能を複数アップロードしたときに、問題が発生する可能性があります。詳細は、第5.12.3項「機能アーカイブ・リソースの再使用の有効化について」を参照してください。

4. 機能アーカイブJARファイルに含める接続を選択します(図16-27を参照)。

図16-27 FARの接続の選択

5. 「次へ」をクリックしてオプションをレビューし、「終了」をクリックします。

16.5.2 機能アーカイブのデプロイメント・プロファイルのデプロイ方法

「デプロイメント・アクション」ダイアログでは、FARをJARファイルとしてデプロイできます。図16-28に示すこのダイアログには、「機能アーカイブJARファイルへデプロイします。」という1つのデプロイメント・オプションのみがあります。

図16-28 デプロイメント・アクション

機能アーカイブのデプロイメント・プロファイルをデプロイするには:

1. ビュー・コントローラ・プロジェクトを右クリックして、機能アーカイブのデプロイメント・プロファイルを選択します。

2. 「終了」をクリックします。「サマリー」ページ(図16-29を参照)に、機能アーカイブ・ファイルのJARパスがデプロイされるフルパスが表示されます。

図16-29 デプロイメントの「サマリー」ページ

16.5.3 機能アーカイブ・ファイルのデプロイメント・プロファイルをデプロイする場合の処理

「デプロイメント・アクション」ダイアログを完了すると、ADFモバイルによって、「サマリー」ページに示されたパスにライブラリJARが作成されます。他のアプリケーションでこのJARを使用できるようにするには、最初に、図16-30に示す「リソース・パレット」(第5.12.1項「ADFモバイル・アプリケーションでのFARコンテンツの使用方法」で説明)で機能アーカイブJARの場所への接続を作成することでこれを利用可能にする必要があります。図16-30は、ファイル・システム接続によりADFモバイル・アプリケーション使用可能となる機能アーカイブを示します。詳細は、『Oracle Fusion Middleware Oracle JDeveloperユーザーズ・ガイド』のリソース・パレットの操作に関する項を参照してください。

図16-30 「リソース・パレット」のデプロイされた機能アーカイブJAR

16.6 コマンドラインからのADFモバイル・アプリケーションのデプロイ

JDeveloper IDEを起動しなくても、OJDeployコマンドライン・ツールを使用して、JDeveloperからiOSまたはAndroidデプロイメント・ファイルをデプロイできます。コマンドラインのデプロイメントは、テストのためのツールとして機能すると同時に、スクリプトを使用したアプリケーションのデプロイ方法として機能します。

デプロイメント・プロファイルのプロパティ・エディタを使用してiOSまたはAndroidデプロイメント・ファイルを作成したら、OJDeployを使用してiOSシミュレータと(iTunes経由で)iOSデバイスに、またはiOSバンドル(.ipaファイル)として、あるいは機能アーカイブJARファイルとして、アプリケーションをデプロイできます。同様に、OJDeployを使用すると、AndroidエミュレータとAndroidデバイスの両方に、またはAndroidアプリケーション・パッケージ・ファイル(.apkファイル)として、あるいは機能アーカイブJARファイルとして、アプリケーションをデプロイできます。OJDeployの詳細は、『Oracle Fusion Middleware Oracle JDeveloperユーザーズ・ガイド』のコマンドラインからのデプロイに関する項を参照してください。

注意:

OJDeployをMac上で使用するには、次の行をojdeploy.confファイルに追加してください。

SetSkipJ2SDKCheck true

このファイルはjdev_install/jdeveloper/jdev/binにあります。

16.6.1 OJDeployを使用したADFモバイル・アプリケーションのデプロイ

次のコマンドを使用して、ADFモバイルのデプロイメント・プロファイルをデプロイできます。

- deployToDevice: iOSデバイスまたはAndroidデバイスにアプリケーションをデプロイします。iOSアプリケーションの場合、このコマンドは、iTunesを使用してアプリケーションがデバイスにデプロイされるデバッグ・シナリオで使用されます。詳細は、第16.4.5項「iTunesへのiOSアプリケーションの配布方法」を参照してください。

- deployToSimulator: iOSシミュレータまたはAndroidエミュレータにアプリケーションをデプロイします。ADFモバイル・アプリケーションはAppleコンピュータ上のiOSシミュレータにのみデプロイできます。

- deployToPackage: iOSアプリケーションを.ipaファイルとして、またはAndroidアプリケーションを.apkファイルとしてデプロイします。アプリケーションは、Appleコンピュータでのみ、.ipaファイルとしてパッケージ化できます。

- deployToFeatureArchive: 機能アーカイブをJARファイルにデプロイします。

これらのコマンドは、ojdeployコマンドライン・ツール、OJDeployの引数およびそのオプションとともに、次のように使用します。

ojdeploy deployToSimulator -profile <profile name> -workspace <jws file location>

注意:

OJDeployコマンドと引数では大文字と小文字が区別されます。

表16-7に、ADFモバイルのデプロイメント・コマンドを変更するために使用するOJDeploy引数をリストします。

ヒント:

-helpオプションを任意のコマンドで使用すると(例: ojdeploy deployToSimulator -help)、使用方法と構文に関する情報を取得できます。

表16-7 ADFモバイルのデプロイメント用のOJDeploy引数

引数

説明

-profile

AndroidまたはiOSデプロイメント・プロファイルの名前。たとえば、次のようになります。

ojdeploy deployToSimulator -profile iosDeployProfile ...

-workspace

ADFモバイル・アプリケーション・ファイル(.jws)へのフルパス。たとえば、次のようになります。

... -workspace /usr/jsmith/mywork/Application1/Application1.jws

-project

deployToFeatureArchiveコマンドの場合は、機能アーカイブのデプロイメント・プロファイルを含むプロジェクト(ビュー・コントローラ・プロジェクト)の名前を指定する必要があります。たとえば、次のようになります。

ojdeploy deployToFeatureArchive -profile farProfileName -project ViewController ...

表16-7にリストされた引数に加えて、『Oracle Fusion Middleware Oracle JDeveloperユーザーズ・ガイド』のコマンドの使用方法に関する項で説明されているOJDeployオプションも使用できます。

注意:

次のオプションはサポートされていません。

- -forcerewrite

- -nocompile

- -nodatasources

- -nodepdendents

- -outputfile

- -updatewebxmlejbrefs

表16-8に、ADFモバイルのデプロイメント・コマンドでOJDeployオプションを使用する方法の例を示します。

表16-8 ADFモバイルのデプロイメント用のOJDeployオプション

オプション

説明

-clean

コンパイルの前に、プロジェクト出力ディレクトリからすべてのファイルを削除します。たとえば、次のようになります。

ojdeploy deployToSimulator -profile iosDeployProfile
-workspace /usr/jsmith/jdeveloper/mywork/Application1.jws -clean

-stdout, -stderr

標準出力とエラー・ロギングのストリームを、それぞれのプロファイルとプロジェクトのファイルにリダイレクトします。たとえば、次のようになります。

ojdeploy deployToSimulator -profile iosDeployProfile
-workspace /usr/jsmith/jdeveloper/mywork/Application1.jws -clean
-stdout /usr/jsmith/stdout/stdout.log
-stderr /usr/jsmith/stderr/stderr.log

17 ADFモバイル・アプリケーションのセキュリティ

この章では、ADFモバイル内のセキュリティ・フレームワークの概要と、セキュリティが適用されるようにADFモバイル・アプリケーションを構成する方法について説明します。

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

- 第17.1項「ADFモバイル・アプリケーションのセキュリティの概要」

- 第17.2項「ユーザー・ログイン・プロセスの概要」

- 第17.3項「認証の概要」

- 第17.4項「ADFモバイル・アプリケーションのセキュリティの構成」

- 第17.5項「プライベート証明書の追加」

17.1 ADFモバイル・アプリケーションのセキュリティの概要

ADFモバイル・ランタイムは、保護されたアプリケーション機能がWebビュー内に表示されようとしているときやオペレーティング・システムがアプリケーション機能をフォアグラウンドに戻したときなど、保護されたアプリケーション機能がアクティブ化されたときに、エンド・ユーザーを認証します。こうした場合、ADFモバイルは、アプリケーション機能へのアクセスで認証が必要かどうかを判断し、ユーザーにログイン・ページを提示します。ADFモバイルは、ユーザーが有効な資格証明を入力した場合のみ、目的のWebビュー、UIコンポーネントまたはアプリケーション・ページをレンダリングします。

ADFモバイルは、JavaScript、PhoneGapプラグインおよびネイティブのPhoneGapコマンド・ハンドラを使用します。これらは併せて、ログイン・ページとの対話、アプリケーション機能間のナビゲーション、およびOracle Identity ConnectのIDM Mobile SDKとの対話を処理し、そのクラスとプロトコルはユーザーの資格証明を検証します。ネイティブのPhoneGapコマンド・ハンドラ・メソッドは、PhoneGapプラグインを介して実行されます。メソッドの結果は、要求されたアプリケーション機能または認証プロセスが開始されたWebビューのいずれかに移動する、対応するJavaScriptコールバック関数に返送されます。

注意:

ログイン・プロセス全体がADFモバイル内で実行されます。埋込みJavaは必要ありません。

ADFモバイル・アプリケーションでは、デフォルト・ページまたはHTMLで記述されたカスタマイズ済のログイン・ページのいずれかが使用されます。

17.2 ユーザー・ログイン・プロセスの概要

(adfmf-feature.xmlファイル内の)アプリケーション機能定義のcredential属性がリモートまたはローカルに指定されており、かつユーザーがタイムアウト期間内に認証されなかった場合は、ログインが必要です。エンド・ユーザーの視点からは、ログイン・プロセスは次のようなものになります。

1. ADFモバイルでは、図17-1に示されているような、ログイン・ページのWebビューが表示されます。このログイン・ページには、認証を必要とするアプリケーション機能の名前、feature1が示されています。

図17-1 ログイン・ページ

注意:

第17.4.10項「カスタム・ログイン・ページの指定時の処理」で説明されているとおり、ADFモバイルでは、ログイン・ページが提供されるだけでなく、カスタム・ログイン・ページもサポートされています。

2. ユーザーがユーザー名とパスワードを入力し、「OK」をクリックします。

注意:

ADFモバイルでは、複数のユーザーが、再起動せずに同じアプリケーションを実行することはできません。あるユーザーがタイムアウトのためにログアウトした後、別のユーザーがアプリケーションにログインしようとすると、ADFモバイルでは、最初のユーザーの名前とパスワードを入力するか、アプリケーションを再起動することを求めるメッセージが表示されます。ログオフは通常、アプリケーションを自動的に終了するため、ユーザーは、ログオフすることでアプリケーションを再起動できます。エンド・ユーザーが、ログイン画面からログオフすることで、アプリケーションを終了できるようにする必要があります。

ユーザーがアプリケーションを終了せずに、そのアプリケーションからログオフできるようにするためのAdfmfJavaUtilitiesクラスのコール・メソッドについては、第17.4.11項「ログイン・ページについて」を参照してください。

3. ユーザー名とパスワードが検証されると、ADFモバイルによって、目的のWebビュー、ページまたはUIコンポーネントが表示されます。

4. ADFモバイルは、ユーザーが正常にログインするまで、ユーザー名とパスワードの入力を求めます。ユーザーがログインできない場合、別のアプリケーション機能に移動することのみが可能です。

注意:

アプリケーション機能が最後にアクティブ化されて以降、事前定義された時間が経過すると、認証はタイムアウトになります。ADFモバイルでは、認証サーバーへの接続を使用するアプリケーション機能のいずれかがアクティブ化されたときのみ、アイドル・タイムアウトのタイマーの期限が更新されます。

17.3 認証の概要

ADFモバイルでは、Oracle Access Management (OAM) Identity Serverなどの認証サーバーに対して認証が行われます。

注意:

ADFモバイルは、どの基本認証サーバーに対しても認証できます。

ADFモバイルがリモート・サーバーに対する認証を処理する場合、セキュリティのフローは次のようなものになります。

1. ADFモバイルによって、図17-1に示されているようなデフォルト・ログイン・ページまたはカスタム・ログイン・ページがユーザーに表示されます。adfmf-application.xmlおよびadfmf-feature.xmlファイルで構成されているセキュリティ関連のパラメータにより、デプロイ済のアプリケーションに対するログイン・ページが表示されます。詳細は、第17.4項「ADFモバイル・アプリケーションのセキュリティの構成」を参照してください。

2. Oracle Identity Connect IDM Mobile SDK APIは、リモート認証サーバーに対する認証と、デバイス上の資格証明ストア(保存済のユーザー・オブジェクトが格納されている場合も、格納されていない場合もあります)に対する認証の両方を処理します。認証の成功または失敗に応じて、APIは、ADFモバイルに有効なユーザー・オブジェクトまたは失敗のいずれかを戻します。

3. ログインに成功すると、ADFモバイルは、Cookieで使用されるOAMトークンを受け取ります。各ログイン接続にCookieが設定されます。

注意:

少なくとも1つの保護されたアプリケーション機能にuser.rolesまたはuser.privileges制約が含まれている場合、エンド・ユーザーは、アプリケーションの起動時に、アプリケーション・ログイン・サーバーに対して認証される必要があります。そうでない場合は、デフォルトのアプリケーション機能が表示されます。デフォルトのアプリケーション機能にセキュリティが適用され、エンド・ユーザーは、アプリケーション機能に関連付けられているログイン接続に対する認証を求められます。エンド・ユーザーは、認証を行わずに、別のアプリケーション機能に移動することも可能です。詳細は、第14.2.3.1項「ユーザー制約」を参照してください。

4. Oracle Identity Connect IDM Mobile SDK APIによって、デバイスの資格証明ストアに資格証明が保存されます。

5. ログインに失敗した場合、ログイン・ページが表示されたままになり、ユーザーは先に進むことができません。

17.4 ADFモバイル・アプリケーションのセキュリティの構成

セキュリティは、adfmf-feature.xmlおよびadfmf-application.xmlファイルの概要エディタを使用して、アプリケーション機能レベルとモバイル・アプリケーション・レベルの両方で構成されます。アプリケーション機能レベルでは、リモート・ログイン・サーバーに対する認証、またはリモート・ログイン・サーバー用のユーザーのログイン資格証明が格納されているデバイス上の資格証明ストアに対する認証を必要とする任意のアプリケーション機能に関するセキュリティ要件を指定します。前者の場合、モバイル・アプリケーションでは、Oracle ADF Fusion Webアプリケーションによって使用されるOracle Access Managerに対するユーザー認証を求めることができます。ユーザーが同じアプリケーション・セッション内(つまり、アプリケーション実行のライフサイクル内)で認証サーバーに対して認証されると、認証コンテキストがローカルに格納され、以降の認証は、このローカルの認証コンテキストに対して実行されます。ローカルの認証コンテキストで問題なくユーザーを認証できる場合、以降の認証では、認証サーバーへの接続は試行されません。最初の認証ではリモート・ログイン・サーバーへの接続が必要ですが、ローカル認証のためにそのサーバーに頻繁にアクセスする必要はありません。さらに、ローカル資格証明ストアに対する認証は、リモート・ログイン・サーバーに対する認証よりも高速で実行できます。

アプリケーション機能のセキュリティが指定されると、JDeveloperによって、credential属性がそのアプリケーション機能の<adfmf:feature>要素に移入されます。そのようなアプリケーション機能をモバイル・アプリケーションに埋め込む場合、ログインおよびログアウト・サーバー接続情報を構成し、ユーザーにADFモバイルが提供するデフォルト・ログイン・ページを提示するか、カスタマイズされたページを提示するかを指定します。これらの要件は、<adfmf:login>要素の属性で設定されます。

(adfmf-feature.xmlファイル内の)アプリケーション機能定義の資格証明属性がリモートまたはローカルに指定されており(第17.4.1項「認証を要求するようにアプリケーション機能を設定する方法」を参照)、かつユーザーがタイムアウト期間(図17-7に示されている「ADFモバイル・ログイン接続の作成」ダイアログで設定)内に認証されなかった場合は、ログインが必要です。第17.1項「ADFモバイル・アプリケーションのセキュリティの概要」も参照してください。

注意:

ログイン・サーバーを介してリモートで、または格納されている資格証明のセットを使用してローカルにセキュリティが適用されるアプリケーション機能用に、アプリケーション・ログイン・サーバーへの接続を少なくとも1つ定義する必要があります。アプリケーション・ログイン・サーバーへの定義済の接続が存在しないと、無効な構成になります。その結果、アプリケーションは正しく機能しません。

17.4.1 認証を要求するようにアプリケーション機能を設定する方法

ADFモバイル・アプリケーションのセキュリティの構成は、アプリケーション機能レベルから始まります。ここでは、ログイン・サーバーまたはローカル資格証明ストアに対する認証をユーザーに求めるアプリケーション機能を指定します。セキュリティが適用されるように各アプリケーション機能を定義する必要があります。

図17-2に示されているadfmf-feature.xml概要エディタの「資格証明」タブでは、セキュリティを適用するアプリケーション機能と、それが要求する認証のタイプを指定できます。

図17-2 アプリケーション機能に対するユーザー資格証明オプションの指定

アプリケーション機能に対するユーザー・アクセスを指定するには:

1. アプリケーション機能を選択するか、「追加」をクリックしてアプリケーション機能を追加します。

2. ログインが必要なアプリケーション機能の「機能セキュリティの有効化」をクリックし、次の認証オプションのいずれかを選択します。

- ローカル: アプリケーションが、デバイス上にローカルに格納されている資格証明に対してユーザーを認証できるようにする場合は、これを選択します。ユーザーが最初にリモート・サーバーに対して正常に認証されると、ADFモバイルは、資格証明をデバイスの資格証明ストア内にローカルに保持します。アプリケーション機能への以降のアクセスでは、それらの資格証明が使用されます。第17.4.9項「Webサービス・セキュリティについて」も参照してください。

- リモート: アプリケーションが、Oracle Access Manager (OAM) Identity Serverなどのリモート・ログイン・サーバーまたは保護されているWebアプリケーションでの認証を要求する場合は、これを選択します。ユーザーがログインするたびに、リモート・サーバーに対する認証が求められます。デバイスがサーバーに接続できない場合、ユーザーは、前回は正常に認証されていても、アプリケーションにログインすることはできません。

図17-2に示されている概要エディタに加えて、図17-3に示す「プロパティ・インスペクタ」でセキュリティ・オプションを構成できます。

図17-3 「プロパティ・インスペクタ」でのユーザー資格証明オプションの指定

概要エディタで指定できるローカルおよびリモートのオプションに加えて、「プロパティ・インスペクタ」では、セキュリティが適用されないアプリケーション用に、「なし」と「デフォルト(なし)」のオプションも用意されています。「なし」を選択すると、概要エディタの「機能セキュリティの有効化」オプションがクリアされ、<adfmf:feature>がcredentials="none"で更新されます。「デフォルト(なし)」を選択した場合も、「機能セキュリティの有効化」がクリアされ、<admf:feature>からcredentials属性が削除されます。<admf:feature>は、デフォルトではcredentials属性を持ちません。

17.4.2 ログイン・ページの指定方法

アプリケーション機能のセキュリティを指定したら、図17-4に示されているadfmf-application.xml概要エディタの「セキュリティ」ページを使用して、セキュリティが適用される各アプリケーション機能に対して、ログイン・ページの構成およびログイン・サーバーへの接続の作成と割当てを行います。このページにリストされているすべてのアプリケーション機能は、adfmf-feature.xmlファイルで、セキュリティが必要なものとして指定されています。通常、アプリケーション機能のグループは、同じログイン・サーバー接続で保護され、ユーザーは、ADFモバイルからさらにログインを求められることなく、これらのアプリケーションをどれでも開くことが可能です。ただし、場合によっては、あるアプリケーション機能のセットを保護しているログイン・サーバーと、別のアプリケーション機能のセットを保護しているログイン・サーバーが異なるため、アプリケーション機能で要求される資格証明がそれぞれ異なる可能性があります。このような状況に対応するために、ADFモバイル・アプリケーション用のログイン・サーバーへの接続をいくつも定義できます。adfmf-application.xmlファイルでは、機能参照に関連付けられている認証サーバー接続は、次のようにloginConnRefId属性を使用して指定されます。

<adfmf:featureReference id="feature1" loginConnRefId="Connection_1"/>
<adfmf:featureReference id="feature2" loginConnRefId="Connection2"/>

ADFモバイル・アプリケーションは、HTTPまたはHTTPS経由の基本認証をサポートしている標準のログイン・サーバーなら、どのログイン・サーバーに対しても認証を受けることが可能です。ADFモバイルはまた、Oracle Identity Managementに対する認証もサポートしています。特定のアプリケーション機能用のカスタム・ログイン・ページを選択することもできます。

図17-4 「セキュリティ」ページ

始める前に:

ADFモバイル・アプリケーションでカスタム・ログイン・ページを使用する場合は、アプリケーション・コントローラ・プロジェクトのpublic_htmlディレクトリ(JDeveloper\mywork\Application\ApplicationController\public_html)にファイルを追加して、図17-5に示されているように「アプリケーション・ナビゲータ」の「Webコンテンツ」ノードからそれを使用できるようにします。第5.9.2項「外部リソースの選択について」も参照してください。

図17-5 カスタム・ログイン・ページの追加

ログイン・ページを指定するには:

1. 「セキュリティ」をクリックします。

2. ログイン・ページのタイプを選択します。

- デフォルト: 選択されたすべての埋込みアプリケーション機能で使用されるデフォルト・ログイン・ページ。詳細は、第17.4.11.1「デフォルト・ログイン・ページ」を参照してください。デフォルト・ログイン・ページは、ADFモバイルによって提供されているものです。

- カスタム: フォーマット(HTML)を選択し、「参照」をクリックして、アプリケーション・コントローラ・プロジェクト内のファイルのパスの場所を検索します。または、「新規」をクリックして、アプリケーション・コントローラ・プロジェクト内にHTMLページを作成します。詳細は、第17.4.11.2項「カスタム・ログイン・ページ」および第17.4.11.3項「iOSデバイス用のカスタム・ログインHTMLページの作成」を参照してください。

ヒント:

「参照」機能を使用してログイン・ページの場所を検索するのではなく、「アプリケーション・ナビゲータ」からログイン・ページをフィールドにドラッグできます。

リモート・サーバーへの接続を設定するには:

まず、次のように認証関連の接続を作成する必要があります。

1. 図17-6に示されているように、「セキュリティが有効な機能」の表で、アプリケーション機能のサーバー接続フィールドを選択し、「追加」をクリックします。

図17-6 サーバー接続の追加

注意:

アプリケーション・ログイン・サーバー接続を定義し、それをデフォルトのアプリケーション機能に割り当てる必要があります(デフォルトのアプリケーション機能が保護されている場合)。また、アプリケーション・ログイン・サーバーで使用される資格証明は、アクセス制御サービス(ACS)を介してユーザー、ロールおよびサービスを検索するためにも使用されます。第17.4.6項「アクセス制御サービスについて」も参照してください。

2. 「ADFモバイル・ログイン接続の作成」ダイアログの「認証」タブに、次のとおり情報を入力します。

- 名前: 接続の名前を入力します。

- ログインURL: 認証サーバーのログインURLを入力します。

- ログアウトURL: 認証サーバーのログアウトURLを入力します。

- アイドル・タイムアウト: ADFモバイルがアプリケーション機能のアクティブ化を検出しなくなって以降、アプリケーション機能をアイドル状態にしておく時間を入力します。この時間が経過すると、このログイン接続によって保護されているすべてのアプリケーション機能がタイムアウトになります。ユーザーにはその後、ADFモバイルによってログイン・ページが表示されます。デフォルトでは、アプリケーションが300秒(5分)アイドルのままである場合、ユーザーにログイン・ページが表示されます。

注意:

ADFモバイルは、アイドル・タイムアウト後、ローカル資格証明ストアに対して認証を行いますが、セッション・タイムアウト後にこの認証を行うことはありません。

- セッション・タイムアウト: ユーザーがアプリケーション機能にログインした状態のままでいられる時間を秒単位で指定します。セッションが期限切れになった後、アイドル・タイムアウト期間が経過していない場合、ADFモバイルは、ユーザーにログイン・ページを表示します。デフォルトでは、ユーザー・セッションは28,800秒(8時間)継続します。

注意:

connections.xmlを編集して、ユーザーに許可されるログイン試行の失敗の回数を設定する必要があります。詳細は、第17.4.4項「失敗したログイン試行に対応するようにADFモバイルを構成することについて」を参照してください。

- Cookie: 保護されたアプリケーション機能のリモート・ログインで使用します。格納された後に基本認証を有効にするCookie名のリストを入力します。ADFモバイルでは、Cookieがブラウザに格納されるため、ユーザーは1回ログインするだけですみます。これらのCookieと、Cookie内に格納される資格証明は、システム管理者によって提供されます。Cookie名では、大文字と小文字が区別されます。

- RESTコールにログイン・サーバーのCookieを含める: リモート認証を使用するアプリケーション機能の場合(つまり、第17.4.1項「認証を要求するようにアプリケーション機能を設定する方法」で説明されているように、<adfmf:feature>要素にcredentials="remote"が含まれている場合)、ログイン・サーバーが生成したユーザー・セッションCookieを使用してログイン・サーバーに格納されている認可済のユーザーのデータを取得するために、これを選択してREST Webサービスを有効にします。詳細は、第17.4.8項「CookieをREST Webサービス・コールに挿入することについて」を参照してください。

注意:

CookieをREST Webサービス・コールに挿入できるようにするには、次の点に注意してください。

- アプリケーション機能では、リモート認証を使用する必要があります。ADFモバイルは、ユーザー資格証明をローカルに格納するアプリケーション機能に対するCookieの挿入をサポートしていません。

- 「ログインURL」に入力されるドメインは、REST Webサービスのエンド・ポイントのドメインと同じである必要があります。

- REST Webサービスで求められるCookie(「Cookie」フィールドに入力されるもの)は、ユーザーがアプリケーション機能にログインしたときにログイン・サーバーによって戻されるCookieと同じである必要があります。

図17-7 「ADFモバイル・ログイン接続の作成」ダイアログ

注意:

図17-7は、Oracle WebLogic Serverに対するHTTP基本認証で使用される、JSESSIONIDのCookieを示しています。他の認証メカニズムでは別のCookieが必要なため、ネットワーク・トレースまたはHTTPアナライザによってCookie名を取得できます。これについては、『Oracle Fusion Middleware Oracle JDeveloperユーザーズ・ガイド』のHTTPアナライザを使用したHTTPの監視に関する項を参照してください。

ヒント:

OAM以外のリソースに対して認証を行う場合は、認証リソースのURLとして「ログインURL」と「ログアウトURL」の両方を構成し、CookieとしてJSESSIONIDを入力します。

3. アプリケーション機能に、たとえば、マネージャというロールが付与されているユーザーがクリックした場合のみtrueにレンダリングされるEL式で構成された送信ボタンがある経費レポート・アプリケーションなど、保護されているコンポーネントが含まれている場合は、「ADFモバイル・ログイン接続の作成」ダイアログの「認可」タブに情報を入力します(図17-8を参照)。このタブのフィールドに値を入力すると、アプリケーション機能によってチェックされる特定のユーザー・ロールの取得が可能になります。
アプリケーション・ログイン・サーバーによって付与されるアクセス制御は、第14.2.3.1項「ユーザー制約」で説明されているとおり、そのアプリケーション機能用に構成されているuser.rolesおよびuser.privileges制約の評価に基づきます。たとえば、manager_roleロールを持つユーザーにのみアプリケーション機能へのアクセスを許可するには、adfmf-feature.xml内の<adfmf:constraints>要素を次のように定義する必要があります。

<adfmf:constraint property="user.roles"
operator="contains"
value="manager_role"/>
</adfmf:constraints>

アプリケーションの起動時、アプリケーション・ログイン・サーバー接続のために、アクセス制御サービス(ACS)として知られているRESTful Webサービスが呼び出され、そのユーザーに割り当てられているロールと権限がフェッチされます。その後、ADFモバイルは、アプリケーション・ログイン・サーバー接続に対してログインするようにユーザーに要求します。

ADFモバイルは、取得されたユーザー・ロールと権限に照らして各アプリケーション用に構成されている制約を評価し、関連付けられているすべての制約を満たすユーザーのみがアプリケーション機能を使用できるようにします。

認可要件を次のように指定します。

- アクセス制御URL: 図17-8に示されているように、アクセス制御サービスのエンドポイントであるURLを入力します。

- ユーザー・ロールのフィルタ・リスト: アプリケーション機能によってチェックされるユーザー・ロールを入力します。セキュリティ・システムには、数千もの定義済のユーザー・ロールおよび権限が存在する可能性があるため、アプリケーション機能に固有のロールが記載されているマニフェスト(これは、アプリケーション機能の開発者によって提供されます)を使用して、このリストを作成します。

- 権限のフィルタ・リスト: アプリケーション機能によってチェックされる権限を入力します。

図17-8 アクセス制御の構成

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

注意:

デフォルトでは、保護されているすべてのアプリケーション機能が同じ接続を共有します。この接続は、図17-4に示されているように、<application login server>と表示されます。「機能参照」の「プロパティ・インスペクタ」では、このデフォルト・オプションが「ログイン・サーバー接続」ドロップダウン・メニューに<default> application login serverと表示されます。「ADFモバイル・ログイン接続の作成」ダイアログ使用して、ADFモバイル・アプリケーション用に定義されている他の接続を選択できます。

17.4.3 ADFモバイル接続作成時の処理

ADFモバイルでは、connections.xmlファイル内のすべての接続情報が集約されます(このファイルは、「アプリケーション・ナビゲータ」の「アプリケーション・リソース」パネルの「ディスクリプタ」および「ADF META-INF」ノードの下にあります)。このファイル(例17-1を参照)は、アプリケーションにバンドルすることも、構成サービス用にホスティングすることもできます。後者の場合、ADFモバイルは、アプリケーションが起動されるたびに、更新済の構成情報があるかどうかをチェックします。

例17-1 connections.xml内に定義されているADFモバイル接続

<?xml version = '1.0' encoding = 'UTF-8'?>
<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="Connection_1"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="Connection_1"
partial="false"
manageInOracleEnterpriseManager="true"
deployable="true"
xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://10.0.0.0/SecuredWebServicelogin/login.jsf"/>
<logout url="http://10.0.0.0/SecuredWebServicelogout/logout.jsf"/>
<accessControl url="http://10.0.0.0/Identity/Authorize"/>
<idleTimeout value="300"/>
<sessionTimeout value="28800"/>
<cookieNames>
<cookie name="JSESSIONID"/>
</cookieNames>
<injectCookiesToRESTHttpHeader value="true"/>
<userObjectFilter>
<role name="manager"/>
<privilege name="account manager"/>
<privilege name="supervisor"/>
<privilege name=""/>
</userObjectFilter>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>
</References>

詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のconnections.xmlに関する項を参照してください。

17.4.4 失敗したログイン試行に対応するようにADFモバイルを構成することについて

例17-2に示されているように、connections.xmlファイルにmax_retries属性を追加することで、そのユーザーに許可されるログイン試行の失敗の最大回数を設定できます。この属性が構成されない場合、ADFモバイルは、10回の再試行を許可します。ユーザーがログイン試行の設定回数を超えると、アプリケーションは自動的に終了します。

デフォルトでは、ADFモバイルは、ユーザーに3回のログイン試行の失敗を許可します。それを超えると、ローカルに格納されているそのユーザーの資格証明をクリアし、以降のログイン試行では、リモート・ログイン・サーバーに接続します。例17-2に示されているように、connections.xmlファイルにmaxFailuresBeforeCredentialCleared属性を追加することで、ローカルに格納されている資格証明が消去されるまでにユーザーに許可されるログイン試行の回数を変更できます。

注意:

adfmf-feature.xmlファイル内でアプリケーション機能がローカル認証を使用するように構成されている場合でも、ADFモバイルは、ローカルに格納されているユーザー資格証明をクリアします。

例17-2 connections.xmlにおける最大再試行回数の構成

<?xml version = '1.0' encoding = 'UTF-8'?>
<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="MyAuth"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="MyAuth"
partial="false"
manageInOracleEnterpriseManager="true"
deployable="true" xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://10.0.0.0:7777/SecuredWeb1-ViewController-context-root/
faces/view1.jsf"/>
<logout url="http://10.0.0.0:7777/SecuredWeb1-ViewController-context-root/
faces/view1.jsf"/>
<accessControl url="http://myhost.us.example.com:7777/
UserObjects/jersey/getUserObjects" />
<idleTimeout value="10"/>
<sessionTimeout value="36000"/>
<cookieNames>
<cookie name="JSESSIONID"/>
</cookieNames>
<max_retries value="6"/>
<maxFailuresBeforeCredentialCleared value="3"/>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>
</References>

17.4.5 セキュリティ構成時のJDeveloperでの処理

adfmf-feature.xml概要エディタで「機能セキュリティの有効化」オプションを選択し、認証のタイプを選択すると、<adfmf:feature>要素が定義済のcredentials属性で更新されます。たとえば、次のようになります。

<adfmf:feature id="feature1" name="feature1" credentials="remote">
<adfmf:feature id="feature2" name="feature2" credentials="local">

注意:

セキュリティを必要としないアプリケーション機能(つまり、これらのセキュリティ・オプションが選択されていないもの)は、ADFモバイル・アプリケーションのすべてのユーザーが使用可能です。それらのアプリケーションでは、credentials属性が定義されていないか(これはデフォルト設定であり、図17-2に示されているようにadfmf-feature.xml概要エディタで「機能セキュリティの有効化」を選択する前はこの状態です)、またはcredentials="none"(「機能セキュリティの有効化」をクリアすると、自動的に移入される属性)が含まれています。

セキュリティが適用されるようにアプリケーション機能が指定されると、JDeveloperは、図17-4に示されているように、対応する機能参照で「セキュリティが有効な機能」の表を更新します。参照される各アプリケーション機能が、connections.xmlファイル内に定義されている同じログイン・サーバー接続に対して認証を行うと、JDeveloperは、defaultConnRefId属性を使用して定義されている単一の<adfmf:login要素(<adfmf:login defaultConnRefId="Connection_1"など)でadfmf-application.xmlファイルを更新します。connections.xmlファイル内に定義されている別のログイン・サーバー接続を使用するように構成されているアプリケーション機能の場合は、JDeveloperは、参照される各アプリケーション機能をloginConnReference属性(<adfmf:featureReference id="feature2" loginConnRefId="Connection2"/)で更新します。詳細は、第17.4.1項「認証を要求するようにアプリケーション機能を設定する方法」を参照してください。また、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスも参照してください。

17.4.6 アクセス制御サービスについて

アクセス制御サービス(ACS)は、ユーザーが単一のHTTP POSTメッセージを介して自身のユーザー・ロールと権限をダウンロードできるようにするRESTful Webサービスです。これは、特定のユーザーのロールまたは権限(あるいはその両方)を戻すリクエスト・メッセージです。必要なロールと権限のリストを提供することで、特定のロールと権限を戻すこともできます。リクエスト・メッセージは、次のもので構成されています。

- リクエスト・ヘッダー・フィールド: If-Match、Accept-Language、User-Agent、Authorization、Content-Type、Content Length。

- リクエスト・メッセージ本文: ユーザー情報のリクエスト。

- 次のものが含まれている、リクエストされたJSONオブジェクト:

- userId: ユーザーID。

- filterMask: ユーザー・ロールと権限のいずれのフィルタを使用する必要があるのかを判断するために使用される"role"要素と"privilege"要素の組合せ。

- roleFilter: ユーザー情報をフィルタ処理するために使用されるロールのリスト。

- privilegeFilter: ユーザー情報をフィルタ処理するために使用される権限のリスト。

注意:

すべてのロールを戻す必要がある場合は、filterMask配列に"role"要素を含めないでください。

すべての権限を戻す必要がある場合は、filterMask配列に"privilege"要素を含めないでください。

例17-3は、HTTP POSTメッセージを示しています。この例では、JSONオブジェクトをペイロードとして識別し、John Smithというユーザーに割り当てられているすべてのフィルタとロールをリクエストします。

例17-3 ユーザー・ロールおよび権限のACSリクエスト

Protocol: POST
Authoization: Basic xxxxxxxxxxxx
Content-Type: application/json

{
"userId": "johnsmith",
"filterMask": ["role", "privilege"],
"roleFilter": [ "role1", "role2" ],
"privilegeFilter": ["priv1", "priv2", "priv3"]
}

レスポンスは、次のもので構成されています。

- 次のフィールドを持つレスポンス・ヘッダー: Last-Modfied、Content-TypeおよびContent-Length。

- ユーザー情報の詳細を含むレスポンス・メッセージ本文。

- 戻されるJSONオブジェクト。これには次のものが含まれます。

- userId: ユーザーのID。

- roles: ユーザー・ロールのリスト。これは、リクエスト内のroleFilter配列を定義することでフィルタ処理できます。フィルタ処理しない場合は、そのユーザーに割り当てられているロールのリスト全体が戻されます。

- privileges: ユーザーの権限のリスト。これは、リクエスト内のprivilegeFilter配列を定義することでフィルタ処理できます。フィルタ処理しない場合は、そのユーザーに割り当てられている権限のリスト全体が戻されます。

例17-4は、戻されたJSONオブジェクトを示しています。これには、ユーザー名およびJohn Smithというユーザーに割り当てられているロールと権限が含まれています。

例17-4 戻されたJSONオブジェクト

Content-Type: application/json

{
"userId": "johnsmith",
"roles": [ "role1" ],
"privileges": ["priv1", "priv3"]
}

注意:

Webサービスでは、ログイン画面はありません。かわりに、ADFモバイルによってユーザー・アクセスが有効化され、Webサービスのヘッダーに自動的に資格証明が追加されます。詳細は、第10.5.3項「資格証明の挿入について」を参照してください。

17.4.7 REST Webサービス・コールへのCookieの挿入を可能にする場合の処理

ADFモバイル・アプリケーションがREST Webサービスを要求するたびに、ADFモバイルのセキュリティ・フレームワークは、REST Webサービスのトランスポート・レイヤーが、REST WebサービスのURLエンドポイントに関連付けられているログイン接続に対してCookieの挿入が可能かどうかをチェックできるようにします。(つまり、例17-1に示されているように、connections.xmlファイルに<injectCookiesToRESTHttpHeader value="true"/>が含まれている必要があります。)接続でCookieの挿入が許可されており、ログイン・サーバーとREST Webサービス・エンドポイントのドメインが同じである場合、セキュリティ・フレームワークは、ユーザーがアプリケーション機能にログインしたときに格納されたCookieを取得し、"<cookie name1>=<cookie value1>;<cookie name2>=<cookie value2>;...<cookie nameN>=<cookie valueN>"というフォームの文字列を戻します。ログイン・サーバー用に構成されているドメインがREST WebサービスのURLエンドポイントと同じである場合のみ、セキュリティ・フレームワークは、Cookieヘッダーを作成し、この文字列をそれに挿入します。さらに、格納されているCookieの文字列(これらのCookieはREST Webサービスで必要とされます)は、ログイン・サーバーから戻されたものと一致している必要があります。

注意:

ADFモバイルは、IDM Mobile SDK APIをコールすることで、Cookie文字列を作成します。IDM Mobile SDK APIは、プラットフォーム固有のCookieストアから名前でCookieを戻します。IDM Mobile SDKは、認証サーバーによって戻されたCookieを管理します。それらの名前は、connections.xmlファイルで定義されます。

17.4.8 CookieをREST Webサービス・コールに挿入することについて

ユーザーがADFモバイル・アプリケーションによって正常に認証されると、ログイン・サーバーは、そのユーザーのセキュリティ・コンテキストを作成し、ユーザー・セッションを追跡するCookieを生成します。図17-2に示されているように、「ADFモバイル・ログイン接続の作成」ダイアログで「RESTコールにログイン・サーバーのCookieを含める」オプションを選択すると、ADFモバイルは、ログイン・サーバーによって送信されたこのユーザー・セッションCookieを取得し、それをADFモバイル・アプリケーションから開始されたREST WebサービスのHTTPヘッダーに挿入します。CookieをWebサービス・コールに伝播することで、ログイン・サーバーに格納されているユーザーのセキュリティ・コンテキストを取得し、ADFモバイル・アプリケーションがREST Webサービスを使用して、そのユーザーに対して認可されているアプリケーション・データにアクセスできるようになります。ユーザー・セッションCookieが期限切れになると、ADFモバイルは、ユーザーに資格証明を要求し、ユーザーを再認証します。再認証されたユーザーは、引き続き、REST Webサービス・コールを介して認可済のアプリケーション・データにアクセスできます。

17.4.9 Webサービス・セキュリティについて

Webサービスでは、ログイン画面はありません。かわりに、ADFモバイルによってユーザー・アクセスが有効化され、Webサービスのヘッダーに資格証明が挿入されます。Webサービスは、ローカルに格納されている資格証明(認証サーバーへの最初のログインの成功後、ADFモバイルによって保持されている資格証明)を使用してアプリケーション・データにアクセスします。ローカル資格証明ストアの名前は、ログイン・サーバー接続のadfCredentialStoreKey属性によって示されます(例17-1ではadfCredentialStoreKey="Connection_1")。Webサービスがこの資格証明ストアを使用できるようにするには、SOAPまたはREST Webサービス接続のcredentialStoreKey属性に対して定義されている名前が、ログイン・サーバーのadfCredentialStoreKey属性に対して定義されている名前と一致する必要があります。

注意:

connections.xmlファイルの概要エディタはないため、「プロパティ・エディタ」を使用して、<Reference>要素のcredentialStoreKey属性をログイン・サーバー接続のadfCredentialStoreKey属性用に構成されている名前で更新できます。または、「ソース」エディタを使用して属性を追加または更新できます。

詳細は、第10.5.3項「資格証明の挿入について」を参照してください。

17.4.10 カスタム・ログイン・ページの指定時の処理

選択したアプリケーション機能用のカスタム・ログイン・ページを追加すると、JDeveloperは、例17-5に示されているように、<adfmf:login>要素を追加し、その子要素<adfmf:LocalHTML>を移入します。すべての<adfmf:LocalHTML>要素と同様に、そのurl属性は、public_htmlディレクトリ内の場所を参照します。

例17-5 ログイン要素

<adfmf:login defaultConnRefId="Connection_1">
<adfmf:localHTML url="newlogin.html"/>
</adfmf:login>

<adfmf:localHTML要素の詳細は、Oracle Fusion Middleware Oracle ADFモバイルのタグ・リファレンスを参照してください。第5.9.2項「外部リソースの選択について」も参照してください。

17.4.11 ログイン・ページについて

アプリケーション機能への認証プロセスのエントリ・ポイントは、activateライフサイクル・イベントです(第5.6.2項「モバイル・アプリケーション・イベントのタイミング」を参照)。アプリケーション機能がアクティブ化される(つまり、アプリケーション機能のactivateイベント・ハンドラがコールされる)たびに、アプリケーション機能のログイン・プロセスが実行されます。このプロセスは、ログイン・ページ(デフォルトまたはカスタムのログイン・ページのいずれか)に移動し、そこでユーザー認証が必要かどうかを判断します。ただし、プロセスがログイン・ページに移動する前に、本来意図されていたアプリケーション機能をADFモバイルに登録する必要があります。認証が成功すると、ログイン・ページは、ADFモバイルから本来意図されていた宛先を取得し、そこに移動します。

17.4.11.1 デフォルト・ログイン・ページ

デフォルトのユーザー・インタフェースは、ログイン・ボタンおよびユーザー名とパスワードの入力テキスト・フィールドを提供するHTMLファイルです。

17.4.11.2 カスタム・ログイン・ページ

カスタム・ログイン・ユーザー・インタフェースは、adfmf-application.xmlファイルで指定されているログイン・ページで実装できます。ユーザー認証メカニズムおよびナビゲーション制御は、デフォルト・ログイン・ページと同じです。

ADFモバイルは、関連するセキュリティ機能にアクセスするためのJavaScript APIを提供します。HTMLページとしてカスタム・ログイン・ページを実装するので、表17-1に示されているように、adf.mf.api.invokeSecurityメソッドへのコールを追加することで、ADFモバイルがユーザー・コマンドを処理できるようにすることが可能です。

表17-1 adf.mf.api.invokeSecurityMethod

セキュリティ・メソッド

戻り値

渡されるパラメータ

機能

adf.mf.api.invokeSecurityMethod("login", username, password)

なし

username、password

ユーザーを認証し、認証の結果に応じて適切なプログラム・フローを実行します。

ログアウトを可能にするには、次のようにAdfmfJavaUtilitiesクラスのlogoutメソッドをコールします。たとえば、次のようになります。

import oracle.adfmf.framework.api.AdfmfJavaUtilities;
...
AdfmfJavaUtilities.logout();

例17-6に示されているように、adfmfJavaUtilitiesクラスのclearPasswordCredentialメソッドを使用して、アプリケーションに固有の資格証明(リモートまたはローカルに格納されているもの)を無効にできます。

例17-6 ユーザー資格証明のクリア

import oracle.adfmf.framework.api.AdfmfJavaUtilities;
...
AdfmfJavaUtilities.clearPasswordCredential(adfCrendentialStorykey, username);

adfCredentialStorykeyパラメータは、connections.xmlファイル内のadfCredentialStoreKeyパラメータに対して定義されている値からStringとして戻されます。メソッドのusernameパラメータは、Stringとして戻され、資格証明ストアからその資格証明が削除されるユーザーを表します。

この資格証明セットをクリアすることで、ユーザーは、保護されている他のアプリケーション機能でセッションを維持したり、ADFモバイル・アプリケーションを終了せずに、保護されていないアプリケーション機能を開くことが可能になります。

AdfmfJavaUtiltiesクラスおよびkeyパラメータの使用方法の詳細は、Oracle Fusion Middleware Oracle ADFモバイルJava APIリファレンスを参照してください。

17.4.11.3 iOSデバイス用のカスタム・ログインHTMLページの作成

デプロイメントの一環として生成されるアーティファクトであるadf.login.iphone.htmlページを使用してカスタム・ログイン・ページを作成できます。

始める前に:

デフォルト・ログイン・ページを使用するADFモバイル・アプリケーションをデプロイします。

カスタム・ログイン・ページを作成するには:

1. デフォルト・ログイン・ページadf.login.iphone.html (application_folder/deploy/deployment profile name/temporary_xcode_project/www/adf.login.iphone.htmlにあります)を、アプリケーション・コントローラ・プロジェクトのpublic_htmlディレクトリ内の場所(JDeveloper\mywork\Application Name\ApplicationController\public_htmlなど)にコピーします。

2. adf.login.iphone.htmlファイルの名前を変更します。

3. adfmf-application.xmlファイルの概要エディタの「セキュリティ」ページで、「カスタム」を選択し、「参照」をクリックしてログイン・ページの場所を検索します。

17.5 プライベート証明書の追加

第4.2.2.1項「アプリケーション・レベルのリリースについて」に示されているように、JDeveloperは、アプリケーション・リソースのSecurityフォルダ内にcacerts証明書ファイルを作成します(JDeveloper\mywork\Mobile Application\resources\Security\cacertsにあります)。このファイルにより、信頼できる既知のソースからの一連の証明書がJVM 1.4に対して識別され、デプロイメントが可能になります。カスタム証明書を必要とするアプリケーションでは(RSA暗号化が使用されていない場合など)、アプリケーションをデプロイする前にプライベート証明書を追加する必要があります。

始める前に:

cacertsファイルおよびkeytoolユーティリティの使用方法については、Java SEテクニカル・ドキュメント(http://download.oracle.com/javase/index.html)を参照してください。

プライベート証明書を追加するには:

1. プライベート証明書を作成します。たとえば、new_certという証明書ファイルを作成します。

2. 次のようにして、プライベート証明書をアプリケーションに追加します。

1. シードされたcacertsファイル(cp cacerts cacerts.org)のコピーを作成します。

2. Java SE keytoolユーティリティを使用して、cacertsファイルに証明書を追加します。例17-7は、new_certというcacertsファイルへの証明書の追加を示しています。

例17-7 keytoolユーティリティを使用した証明書の追加

keytool -importcert
-keystore cacerts
-file new_cert
-storepass changeit
-noprompt

例17-7は、単一の証明書の追加方法を示しています。各証明書に対して同じ手順を繰り返します。表17-2は、keytoolのオプションを示しています。

表17-2 証明書の追加に関するオプション

オプション

説明

-importcert

証明書をインポートします。

-keystore cacerts file

インポートされた証明書のファイルの場所を特定します。

-file certificate file

新しい証明書を含むファイルを特定します。

-storepass changeit

cacertsファイルのパスワードを提供します。デフォルトでは、パスワードはchangeitです。

-noprompt

証明書を信頼するかどうかを(stdinを介して)ユーザーに確認しないように、keytoolに指示します。

3. 新しいcacertsファイルの内容を目で見て調べて、すべてのフィールドが正しいことを確認します。次のコマンドを使用します。

keytool -list -v -keystore cacerts | more

4. 証明書が指定のホスト名に対するものであることを確認します。

注意:

証明書の共通名(CN)は、ホスト名と正確に一致している必要があります。

5. JVM 1.4が読み取れるようにするために、カスタマイズされた証明書ファイルはSecurityディレクトリ(JDeveloper\mywork\Mobile Application\resources\Security)に確実に配置してください。

3. アプリケーションをデプロイします。

注意:

デプロイメント時、証明書ファイルがSecurityディレクトリに存在している場合、ADFモバイルは、それをAndroidまたはXcodeテンプレート・プロジェクトにコピーし、cacertsファイルのデフォルト・コピーを置き換えます。

4. 保護されているリソースにSSL経由でアクセスできることを確認します。

18 ADFモバイル・アプリケーションのテストとデバッグ

この章では、iOSとAndroidの両方のプラットフォーム用に開発されたADFモバイル・アプリケーションのテストとデバッグを行う方法について説明します。

この章では、次の項目について説明します。

- 第18.1項「ADFモバイル・アプリケーションのテストとデバッグの概要」

- 第18.2項「ADFモバイル・アプリケーションのテスト」

- 第18.3項「ADFモバイル・アプリケーションのデバッグ」

- 第18.4項「デバッグ・モードの使用方法」

- 第18.5項「ロギングの使用方法と構成」

18.1 ADFモバイル・アプリケーションのテストとデバッグの概要

ADFモバイル・アプリケーションのテストとデバッグを開始する前に、そのアプリケーションを次のいずれかにデプロイする必要があります。

- iOSデバイス

- iOSデバイス・シミュレータ

- Androidデバイス

- Androidデバイス・エミュレータ

ADFモバイル・アプリケーションは、デプロイしないと実行できません。詳細は、第16章「ADFモバイル・アプリケーションのデプロイ」を参照してください。

ADFモバイル・アプリケーションのテストとデバッグを行うには、通常、次の手順を実行します。

1. スプラッシュ画面、アプリケーション機能のナビゲーション、認証、プリファレンスなど、アプリケーションのインフラストラクチャをテストして、うたわれているすべてのアプリケーション機能が使用可能であることを確認します。

2. アプリケーションにADFモバイルAMXコンテンツが含まれている場合は、このアプリケーション機能のロジック、ページ・フロー、データ・コントロールおよびUIコンポーネントをテストします。

3. 必要に応じてアプリケーションに変更を加えます。

4. モバイル・デバイスを再接続するか、シミュレータを再起動し、さらなるテストおよびデバッグのためにアプリケーションをデプロイして実行します。

詳細は、次の項を参照してください。

- 第18.3項「ADFモバイル・アプリケーションのデバッグ」

- 第18.2項「ADFモバイル・アプリケーションのテスト」

18.2 ADFモバイル・アプリケーションのテスト

ADFモバイル・アプリケーションをテストするには、次の2つの方法があります。

1. モバイル・デバイス上でのテスト: この方法では常に、最も正確な動作が提供されます。アプリケーションのパフォーマンスを測定する場合も、この方法をとる必要があります。ただし、テスト実行者がテスト対象のすべてのデバイスを入手できるとはかぎらないため、デバイスのテストは確実なものとは言えません。

2. モバイル・デバイス・エミュレータまたはシミュレータ上でのテスト: この方法は通常、よりよいパフォーマンスとより高速なデプロイを提供し、便利です。ただし、デバイスのエミュレータまたはシミュレータは、対応する物理デバイスに近似したものであるとは言え、動作の相違やエミュレートできる機能の制限が存在する場合があります。

通常、両方の方法を組み合せて使用することで、最良の結果が得られます。

18.2.1 iOSデバイス上でアクセシビリティのテストを実行する方法

iOSデバイス用に開発されたADFモバイル・アプリケーションのアクセシビリティをテストするには、次の方法を組み合せて使用してください。

- iOSデバイス・シミュレータ上でアクセシビリティ・インスペクタを使用してテストする。
詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)にある『Accessibility Programming Guide for iOS』の「Testing the Accessibility of Your iPhone Application」を参照してください。

- iOSデバイス上でVoiceOverを使用してテストする。
詳細は、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)にある『Accessibility Programming Guide for iOS』の「Using VoiceOver to Test Your Application」を参照してください。

18.3 ADFモバイル・アプリケーションのデバッグ

JDeveloperには、Javaプログラムをデバッグ・モードで実行し、標準のブレークポイントを使用してOracle ADFアプリケーションの実行を監視および制御することを可能にするデバッグ・メカニズムが備わっています。詳細は、『Oracle Fusion Middleware Oracle JDeveloperユーザーズ・ガイド』のアプリケーションのデバッグに関する項を参照してください。

ADFモバイル・アプリケーションはJDeveloper内部で実行できないため、デバッグの方法が異なります。JDeveloperデバッガを使用して、モバイル・デバイスまたはシミュレータ上のJava仮想マシン(JVM) 1.4インスタンスに接続し、デプロイ済のADFモバイル・アプリケーションのJavaの部分を制御します。

JDeveloperを使用してADFモバイル・アプリケーション内のJavaコードをデバッグするために実行する必要のある手順は、次のとおりです。

1. リモート・デバッグ用のプロジェクト・プロパティを構成します。この手順では、次のようにADFモデルのデバッグ構成を作成します。

1. JDeveloperのメイン・メニューで、「アプリケーション」→「プロジェクト・プロパティ」をクリックして、「プロジェクト・プロパティ」ダイアログを開きます。

2. 「プロジェクト・プロパティ」ダイアログで、「実行/デバッグ/プロファイル」ノードを選択します。

3. 「実行/デバッグ/プロファイル」ダイアログの「実行構成」ペインを使用して、新しい構成を作成するか、「編集」をクリックして既存の構成を変更します。

4. 「実行構成の編集」→「起動設定」ダイアログで、「リモート・デバッグ」を選択します。

5. 「実行構成の編集」ダイアログの「ツール設定」ノードを開き、「デバッガ」を開いて、「リモート」を選択します。

6. 図18-1に示す「実行構成の編集」→「リモート」ダイアログで、次の構成を行います。
- プロトコルを「JPDAにアタッチ」に設定します。

- ホストを次のいずれかに設定します。1) シミュレータまたはエミュレータでのデバッグの場合は、localhostに設定します。2) デバイスでのデバッグの場合は、開発コンピュータからネットワーク経由でそのデバイスにアクセスできることを確認し(pingコマンドを使用してネットワーク・アクセスをテストできます)、デバイスのIPアドレスを入力します。

- ポートを適切なポート番号に設定します。

- タイムアウトを2に設定します。

図18-1 リモート・デバッグの構成

2. モバイル・デバイスまたはシミュレータにアプリケーションをデプロイします(第18.3.1項「iOSプラットフォームでのデバッグ方法」または第18.3.2項「Androidプラットフォームでのデバッグ方法」を参照)。

3. cvm.propertiesファイルで次のデバッグ・パラメータを指定します。

java.debug.enabled=true
java.debug.port=4000

ポート番号は、JDeveloperで設定したものと一致している必要があります。

詳細は、第18.3.4項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。

4. アプリケーションをモバイル・デバイスまたはシミュレータに再デプロイします。

5. アプリケーション・アイコンをクリックして、モバイル・デバイスまたはシミュレータでアプリケーションを起動します。

6. 次のようにして、JDeveloperからデバッガを起動します。

1. JDeveloperのメイン・メニューのデバッグ・アイコンを使用して、実行構成(手順3でこのプロジェクトに対して定義したもの)を選択します。

2. デバッガのJPDAデバッガにアタッチダイアログを確認します。

注意:

タイムアウト(20秒)を回避するには、モバイル・デバイスまたはシミュレータ上でアプリケーションを起動したら、ただちにデバッガを起動します。

デバッグでモバイル・デバイスを使用する場合は、WiFiを介して接続する必要があります。

詳細は、次を参照してください。

- 第16.1.1.2項「JVM 1.4ライブラリのデプロイメント」

- 『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFコンポーネントのテストとデバッグに関する項

18.3.1 iOSプラットフォームでのデバッグ方法

iOSプラットフォームでJDeveloperを使用してADFモバイル・アプリケーションをデバッグするには、第18.3項「ADFモバイル・アプリケーションのデバッグ」で説明されている一般的なデバッグ手順に従います。

iOSデバイスまたはシミュレータの構成方法、およびデバッグのためのADFモバイル・アプリケーションのデプロイ方法については、次を参照してください。

- 第16.4.1項「iOSシミュレータへのiOSアプリケーションのデプロイ方法」

- 第16.4.2項「iOSデバイスへのアプリケーションのデプロイ方法」

- 第16.4.4.2項「テストおよびデバッグ用のAppleデバイスの登録」

18.3.2 Androidプラットフォームでのデバッグ方法

AndroidプラットフォームでJDeveloperを使用してADFモバイル・アプリケーションをデバッグするには、第18.3項「ADFモバイル・アプリケーションのデバッグ」で説明されている一般的なデバッグ手順に従います。

Androidデバイスまたはエミュレータの構成方法、およびデバッグのためのADFモバイル・アプリケーションのデプロイ方法については、第16.3.1項「AndroidエミューレータへのAndroidアプリケーションのデプロイ方法」を参照してください。

USBを介して接続されたAndroidデバイス上で、またはAndroidデバイス・エミュレータ上でJavaコードをデバッグする場合、端末で次のコマンドを実行することでTCPポートをフォワードする必要があります。

- デバイスでのデバッグの場合:
adb -d forward tcp:<host port> tcp:<target port>

- エミュレータでのデバッグの場合:
adb -e forward tcp:<host port> tcp:<target port>

たとえば、adb -d forward tcp:4510 tcp:4510を実行すると、デバイスのTCPポート4510がホストのTCPポート4510にフォワードされます。実行時、cvm.propertiesファイルのデバッグ設定(第18.3.4項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照)は、次のように定義する必要があります。

java.debug.enabled=true

java.debug.port=4510

注意:

接続がWi-Fiを介して行われる場合は、この接続が正しいことを確認してください。デバッガとターゲットの両方を、仮想プライベート・ネットワーク(VPN)を使用せずに、同じネットワーク上に配置することをお薦めします。

18.3.3 ADFモバイルAMXコンテンツのデバッグ方法

ADFモバイル・アプリケーションにADFモバイルAMXコンテンツが含まれている場合は、デバイスまたはエミュレータの構成後、WebベースのADF Facesアプリケーションをデバッグするときと同じように、ブレークポイントの設定、変数の内容の表示およびメソッド・コール・スタックのインスペクトを行うことができます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFコンポーネントのテストとデバッグに関する項を参照してください。

注意:

デバッグできるのは、JavaコードおよびJavaScriptのみです(第18.3.4項「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照)。EL式または他の宣言要素のデバッグはサポートされていません。

18.3.4 JavaコードおよびJavaScriptのデバッグを有効にする方法

cvm.propertiesファイルでは、JVMの起動パラメータおよびADFモバイルのWebビューを指定して、JavaコードおよびJavaScriptのデバッグを有効にできます。cvm.propertiesファイルは、自動的に作成され、プロジェクトのDescriptors/META-INFディレクトリに配置されます(第18.5項「ロギングの使用方法と構成」を参照)。

cvm.propertiesファイルで次のデバッグ・プロパティを使用できます。

- java.debug.enabled: ADFモバイルでのJavaのデバッグを有効または無効にします。有効な値は、trueとfalseです。

注意:

java.debug.enabledがtrueに設定されている場合、JVMは、デバッガが接続を確立するのを待ちます。デバッガが接続に失敗すると、ADFモバイルAMXアプリケーション機能のロードが失敗します。

- java.debug.port: デバッグ時に使用するポートを指定します。有効値は整数です。

- javascript.debug.enabled: アプリケーションがデバイス・シミュレータで実行されている場合、JavaScriptのデバッグを有効または無効にします。有効な値は、trueとfalseです。

- javascript.debug.feature: ADFモバイルでのJavaScriptのデバッグの有効化をトリガーするアプリケーション機能を指定します。この値の形式はfeatureId:portです。ポートを指定する必要があります(これは当初、プレースホルダ値に設定されています)。

cvm.propertiesファイルの内容は、次のようなものです。

java.debug.enabled=true
java.debug.port=8000
javascript.debug.enabled=true
javascript.debug.feature=products:8888

cvm.propertiesファイルがJavaScriptをデバッグするように構成されたら、次のURLに異動して、ADFモバイルでデバッグ可能なすべてのロード済ページのリストを確認できます。

http://localhost:9999

注意:

iOSデバイス・シミュレータの複数のインスタンスによって共有されているコンピュータ上でJavaScriptをデバッグすると、問題が発生することがあります。iOSデバイス・シミュレータの複数のインスタンスが実行されている場合、特定のインスタンスに接続することはできない可能性があるため、デバッグ・ページを表示できません。

JDeveloperを使用してJavaコードをデバッグする方法については、第18.3項「ADFモバイル・アプリケーションのデバッグ」を参照してください。

18.4 デバッグ・モードの使用方法

アプリケーションのデプロイメント・プロファイルを使用して、ADFモバイル・アプリケーションの実行モードをリリースまたはデバッグのいずれかに指定します。デバッグ・モードでは、コンパイル時に特殊なデバッグ・ライブラリおよびシンボルを含めることが可能です。

図18-2は、Android上のデバッグ・モード・オプションの設定方法を示しています。

図18-2 Android用のデバッグ・モードの設定

図18-3は、iOS上のデバッグ・モード・オプションの設定方法を示しています。

図18-3 iOS用のデバッグ・モードの設定

詳細は、次の項を参照してください。

- 第16.2.3項「Androidデプロイメント・プロファイルの作成方法」

- 第16.2.4.1項「iOSビルド・オプションの定義」

- 第16.4.4.1項「iOS開発用証明書の作成」

18.5 ロギングの使用方法と構成

ADFモバイル・アプリケーションでは、JavaScriptと埋込みコードによって、AndroidおよびiOSプラットフォームでのロギングを有効にできます。これにはすべて単一の構成が使用され、System.out.printlnおよびSystem.err.println文によって生成される出力を含め、ログ出力は単一のファイルにまとめられます。

デフォルトのADFモバイルのロギング・プロセスは、次のとおりです。

- アプリケーションの起動時、ロギングが開始されます。

- アプリケーションの以前の実行で生成された既存のログ・ファイルが削除され、現在の実行の内容のみが使用可能になります。

- iOSデバイス・シミュレータ上でアプリケーションを実行している場合、すべてのロギング出力はコンソールに送られます。コンソールには、開発コンピュータのApplication/Utilitiesディレクトリからアクセスできます。
iOSデバイス上でアプリケーションを実行している場合、コンソール出力は、アプリケーションのDocuments/logsディレクトリにあるapplication.logファイルにリダイレクトされます。

Androidでは、出力は、アプリケーションと同じ名前のテキスト・ファイルにフォワードされます。出力ファイルの場所は/sdcardです。この場所が存在していないか、読取り専用として構成されている場合、ログ出力は、アプリケーションの書込み可能データ・ディレクトリに再ルーティングされます。

- logging.propertiesファイルが、/.adf/META-INFディレクトリに作成され、アプリケーション・リソースの下のアプリケーションに追加されます(第4.2.2.1項「アプリケーション・レベルのリソースについて」を参照)。このファイルでは、すべてのログ出力でcom.sun.util.logging.ConsoleHandlerおよびSimpleFormatterを使用することが定義され、ログ・レベルがSEVEREに設定されます。このファイルを編集して、別のロギング動作を指定できます(第18.5.1項「プロパティ・ファイルを使用したロギングの構成方法」を参照)。

注意:

ADFモバイル・アプリケーションでは、java.util.loggingパッケージからのログ出力を使用することはできません。

ADFモバイルのログ出力は、次のとおりoracle.adfmf.util.Utilityクラスで宣言されます。

public static final String APP_LOGNAME = "oracle.adfmf.application";
public static final Logger ApplicationLogger = Logger.getLogger(APP_LOGNAME);

public static final String FRAMEWORK_LOGNAME = "oracle.adfmf.framework";
public static final Logger FrameworkLogger = Logger.getLogger(FRAMEWORK_LOGNAME);

ADFモバイル・アプリケーションで使用するログ出力は、ApplicationLoggerです。

oracle.adfmf.util.logging.Traceクラスのメソッドを使用することもできます。

詳細は、Oracle Fusion Middleware Oracle ADFモバイルJava APIリファレンスを参照してください。

18.5.1 プロパティ・ファイルを使用したロギングの構成方法

例18-1は、ロギングの構成で使用するlogging.propertiesファイルを示しています。

例18-1 logging.propertiesファイル

# default - all loggers to use the ConsoleHandler
.handlers=com.sun.util.logging.ConsoleHandler
# default - all loggers to use the SimpleFormatter
.formatter=com.sun.util.logging.SimpleFormatter

oracle.adfmf.util.logging.ConsoleHandler.formatter=
oracle.adfmf.util.logging.PatternFormatter
oracle.adfmf.util.logging.PatternFormatter.pattern=
[%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE%

#configure the framework logger to only use the adfmf ConsoleHandler
oracle.adfmf.framework.useParentHandlers=false
oracle.adfmf.framework.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.adfmf.framework.level=SEVERE

#configure the application logger to only use the adfmf ConsoleHandler
oracle.adfmf.application.useParentHandlers=false
oracle.adfmf.application.handlers=oracle.adfmf.util.logging.ConsoleHandler
oracle.adfmf.application.level=SEVERE

oracle.adfmf.util.logging.ConsoleHandlerは、カスタム・フォーマッタの受信者としての役割を果たします。

oracle.adfmf.util.logging.PatternFormatterでは、ログ・メッセージの出力を可能にする、次の高度なフォーマット・トークンが許可されています。

- %LEVEL%: ロギング・レベル。

- %LOGGER%: 出力が書き込まれるログ出力の名前。

- %CLASS%: ログに記録されるクラス。

- %METHOD%: ログに記録されるメソッド。

- %TIME%: ロギング・メッセージが送信された時間。

- %MESSAGE%: 実際のメッセージ。

使用可能なロギング・レベルは、次のとおりです。

- SEVERE: 重大な障害を示すメッセージ・レベルです。

- WARNING: 潜在的な問題を示すメッセージ・レベルです。

- INFO: 情報メッセージのメッセージ・レベルです。

- FINE: トレース情報を提供するメッセージ・レベルです。

- FINER: このレベルは、かなり詳細なトレース・メッセージを示します。

- FINEST: このレベルは、非常に詳細なトレース・メッセージを示します。

注意:

ロギング・レベルの詳細度を選択するときは、SEVERE、WARNINGおよびINFOレベルで出力の詳細度を上げると、アプリケーションのパフォーマンスに悪影響を及ぼすことに留意してください。

logging.propertiesファイルで定義されているログ出力は、oracle.adfmf.util.Utilityクラスから取得されるログ出力と一致します(第18.5項「ロギングの使用方法と構成」を参照)。ロギング・レベルも一致します。INFOよりも詳細なロギング・レベルを使用する場合は、ConsoleHandlerのロギング・レベルを、例18-2に示されているものと同じレベルに変更する必要があります。

例18-2 非常に詳細なロギング・レベルの設定

oracle.adfmf.util.logging.ConsoleHandler.formatter=
oracle.adfmf.util.logging.PatternFormatter
oracle.adfmf.util.logging.ConsoleHandler.level=FINEST
oracle.adfmf.util.logging.PatternFormatter.pattern=
[%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE%

18.5.2 JavaScriptのロギングの使用方法

JavaScriptは、console.log or.error/.warn/.infoに出力を書き込みます。この出力は、System.outユーティリティによってファイルにリダイレクトされます。

メッセージを指定することで、ログの出力をカスタマイズできます。次のJavaScriptコードでは、"Message from JavaScript"出力が生成されます。

<script type="text/javascript" charset="utf-8">
function test_function() { console.log("Message from JavaScript"); }
</script>

ロギング・ファイルに定義されているプロパティを利用するには、adf.mf.logパッケージ、およびそれによって提供されるApplicationログ出力を使用する必要があります。

使用可能なロギング・レベルは、次のとおりです。

- adf.mf.log.level.SEVERE

- adf.mf.log.level.WARNING

- adf.mf.log.level.INFO

- adf.mf.log.level.CONFIG

- adf.mf.log.level.FINE

- adf.mf.log.level.FINER

- adf.mf.log.level.FINEST

ロギングをトリガーするには、adf.mf.log.Applicationログ出力のlogpメソッドを使用し、そのメソッドのパラメータで次のものを指定します。

- ロギング・レベル

- 文字列としての現在のクラス名

- 文字列としての現在のメソッド

- 文字列としてのメッセージ文字列

例18-3は、ADFモバイル・アプリケーションでのlogpメソッドの使用方法を示しています。

例18-3 ロギング・メソッドの使用方法

adf.mf.log.Application.logp(adf.mf.log.level.WARNING,
"myClass",
"myMethod",
"My Message");

logpメソッドを実行すると、次の出力が生成されます。

[WARNING - oracle.adfmf.application - myClass - myMethod] My Message

18.5.3 埋込みロギングの使用方法

埋込みロギングでは、例18-4に示されているとおり、com.sun.util.logging.Loggerを使用します。

例18-4 埋込みロギングの使用方法

import com.sun.util.logging.Level;
import com.sun.util.logging.Logger;
import oracle.adfmf.util.logging.*;
...
Utility.ApplicationLogger.logp(Level.WARNING,
EmbeddedClass.class.getName(),
"onTestMessage",
"embedded warning message 1");
Logger.getLogger(Utility.APPLICATION_LOGNAME).logp(Level.WARNING,
this.getClass().getName(),
"onTestMessage",
"embedded warning message 2");
Logger.getLogger("oracle.adfmf.application").logp(Level.WARNING,
this.getClass().getName(),
"onTestMessage",
"embedded warning message 3");

このコードによって生成される出力は、次のとおりです。

[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 1
[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 2
[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 3

第VII部

付録

第VII部は、次の付録で構成されます。

- 付録A「トラブルシューティング」

- 付録B「デプロイメントでのプリファレンスの変換」

- 付録C「ADFモバイル・アプリケーションの使用方法」

- 付録D「XMLの解析」

- 付録E「サンプルのADFモバイル・アプリケーション」

A トラブルシューティング

この付録では、ADFモバイル・アプリケーションの様々な側面の問題、およびそれらの問題の診断方法と解決方法について説明します。

A.1 iOSシミュレータでの入力コンポーネントの問題

問題:

iOSシミュレータにデプロイされたADFモバイル・アプリケーションでは、マウスを使用してあるフィールドから別のフィールドに移動すると、<amx:inputText>コンポーネント・フィールドに入力されたテキストが、その別のフィールドに入力されたテキストの先頭に添付されます。たとえば、名、ミドル・ネーム、姓を入力するテキスト・フィールドがあるページで、名のフィールドにJohnと入力し、ミドル・ネームのフィールドをクリックしてPと入力すると、テキストはJohnPと表示されます。同様に、姓のフィールドをクリックしてSmithと入力すると、そのフィールドのテキストは、図A-1に示されているように、JohnPSmithと表示されます。

図A-1 以降の<amx:inputText>フィールドにおけるテキスト値の連結

注意:

この動作は、iOSシミュレータとWebページでのみ発生し、実際のデバイスでは発生ません。

解決策:

シミュレータで、入力テキスト・フィールド間を移動する場合は、マウスではなく、キーボードを使用します。

B デプロイメントでのプリファレンスの変換

この付録では、デプロイメント時、ADFモバイルがどのようにユーザー・プリファレンスを変換するかについて説明します。

このドキュメントには次の項が含まれます。

- 第B.1項「プリファレンスのネーミング・パターン」

- 第B.2項「Android用のプリファレンスの変換」

- 第B.3項「iOS用のプリファレンスの変換」

B.1 プリファレンスのネーミング・パターン

デプロイメント・ターゲットが呼び出されると、ADFモバイル・アプリケーション・プリファレンスの、モバイル・プラットフォーム表現への変換が行われます。変換後、表B-1で説明されているネーミング・パターンにより、モバイル・プラットフォーム上で各プリファレンスを一意に識別できるようになります。adfmf-application.xmlおよびadfmf-feature.xmlファイル内の各プリファレンス要素は、デプロイメントの前に、その兄弟要素の範囲内で一意に識別される必要があります。

識別子値の例は、次のとおりです。

- application.gen.gps.trackGPS

- feature.f0.gen.gps.trackGPS

表B-1は、完全修飾されたプリファレンス識別子の生成方法を示しています。

表B-1 プリファレンスに対するADFモバイルのネーミング・パターン

Expression

説明

Syntax

PreferenceIdentifier

モバイル・プラットフォーム表現に変換されたプリファレンス要素の識別子値を表します。

ApplicationPreferences | FeaturePreferences

ApplicationPreferences

adfmf-application.xmlファイルから生成されるプリファレンス識別子値をビルドするには、この式を使用します。

application.ApplicationElementPath

ApplicationElementPathは、最上位の親要素である<adfmf:preferences>で始まり、識別対象の要素で終わる、id属性値のドット区切りのリストを表します。adfmf-application.xmlファイルの次のセグメントで、生成されたこの識別子は、application.gen.gps.trackGPSとしてコメント内に示されています。

<adfmf:preferences>
<adfmf:preferenceGroup id="gen">
<adfmf:preferenceGroup id="gps">
<!-- The mobile-platform identifier would be "application.gen.gps.trackGPS" -->
<adfmf:preferenceBoolean id="trackGPS"/>
</adfmf:preferenceGroup>
</adfmf:preferenceGroup>
</adfmf:preferences>

FeaturePreferences

adfmf-feature.xmlファイルから生成されるプリファレンス識別子値をビルドするには、この式を使用します。

feature.FeatureElementPath

FeatureElementPathは、最上位の親要素である<adfmf:feature>で始まり、識別対象の要素で終わる、id属性値のドット区切りのリストを表します。adfmf-feature.xmlファイルの次のセグメントで、生成されたこの識別子は、feature.f0.gen.gps.trackGPSとしてコメント内に示されています。

<adfmf:feature id="f0">
<adfmf:preferences>
<adfmf:preferenceGroup id="gen">
<adfmf:preferenceGroup id="gps">
<!-- The mobile-platform identifier would be "feature.f0.gen.gps.trackGPS" -->
<adfmf:preferenceBoolean id="trackGPS"/>
</adfmf:preferenceGroup>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:feature>

表B-1のコード例で引用されている<adfmf:preferences>要素にはid属性がなく、そのため、これはどのプリファレンス識別子でも表されません。

B.2 Android用のプリファレンスの変換

ADFモバイルのデプロイメントでは、XMLとXLSを使用して、アプリケーション機能とADFモバイル・アプリケーション・レベルの両方で定義されているユーザー・プリファレンス・ページを、次の3つのXMLドキュメントに変換します。

- preferences.xml

- arrays.xml

- strings.xml

B.2.1 Preferences.xml

このファイルには、adfmf-feature.xmlとadfmf-application.xmlの両方のファイルからの変換済のプリファレンスが含まれています。

B.2.1.1 プリファレンス要素のマッピング

表B-2は、ADFモバイルのプリファレンス定義の、Androidテンプレート・プリファレンスおよびAndroidネイティブ・プリファレンスへのマッピングを示しています。

表B-2 ADFモバイル・プリファレンスの、Androidプリファレンスへのマッピング

ADFモバイル・プリファレンス定義

テンプレート・カスタムまたはAndroidネイティブ・プリファレンス定義(デプロイメントで使用される)

Androidネイティブ・プリファレンス定義(デプロイメントで使用されない)

<adfmf:preferenceBoolean>

oracle.adfmf.preferences.AdfMFPreferenceBoolean

CheckBoxPreference

<adfmf:preferenceNumber>

oracle.adfmf.preferences.AdfMFPreferenceText

EditPreferenceText

<adfmf:preferenceText>

oracle.adfmf.preferences.AdfMFPreferenceText

EditTextPreference

<adfdmf:preferenceList>

oracle.adfmf.preferences.AdfMFPreferenceList

ListPreference

<adfmf:PreferenceGroup>

PreferenceCategory

PreferenceCategory

<adfmf:PreferencePage>

PreferenceScreen

PreferenceScreen

B.2.1.2 プリファレンス属性のマッピング

Preferences.xmlファイルには、strings.xmlとarrays.xmlの両方に格納されている文字列リソースへの参照が含まれています。Android SDKでは、XMLファイル内のリソースの構文を@[<package_name>:]<resource_type>/<resource_name>と定義しています。このファイルには、文字列値への参照だけでなく、リスト・プリファレンスの名前と値のペアも含まれています。XSLは、文字列とリスト・プリファレンスに対して次のものを作成します。

- <package_name> は、リソースが存在するパッケージの名前です(同じパッケージのリソースを参照するときは必要ありません)。参照のこのコンポーネントは使用されません。

- <resource_type>は、リソース・タイプのRサブクラスです。このコンポーネントは、文字列参照の作成時はstring、リスト・プリファレンスの作成時はarrayの値を持ちます。

- <resource_name>は、XML要素内のandroid:name属性値です。android:title属性を指定する場合、このコンポーネントの値は、<PreferenceIdentifier>_titleになります(<PreferenceIdentifier>の定義については、第B.1項「プリファレンスのネーミング・パターン」を参照してください)。

表B-3と表B-4は、特定のADFモバイル・プリファレンスに対するADFモバイル属性の、Androidプリファレンスへのマッピングを示しています。

この表では、

- {X}というフォームのエントリ(表B-3の{default}など)は、Xという名前のADFモバイル属性の値を示しています。

- <PreferenceIdentifier>があるエントリは、第B.1項「プリファレンスのネーミング・パターン」で説明されているとおり、プリファレンス識別子の値を示しています。

- アスタリスク(*)が付いている属性は、ADFモバイルの名前空間で定義されているカスタムのテンプレート属性であり、preferences.xmlにadfmf:<attributeName>というフォームで存在している必要があります。それ以外の属性は、Androidの名前空間の一部であり、preferences.xmlにandroid:<attributeName>として存在している必要があります。

表B-3 ADFモバイル・プリファレンス属性の、Androidプリファレンスへのマッピング

ADFモバイル属性定義

テンプレート・カスタムまたはAndroidネイティブ・プリファレンス属性

Android属性値

適用対象

id

key

<PreferenceIdentifier>

AdfMFPreferenceBoolean、AdfMFPreferenceText、AdfMFPreferenceList、PreferenceScreen、PreferenceCategory

default

defaultValue

{default}

AdfMFPreferenceBoolean、AdfMFPreferenceText、AdfMFPreferenceList

label

title

指定された{label}値が文字列リソース・バンドルへの参照でない場合は、@string/<PreferenceIdentifier>___title。指定された{label}を持つ、strings.xml内の文字列を参照します。

AdfMFPreferenceBooleanAdfM、FPreferenceNumber、AdfMFPreferenceText、AdfMFPreferenceList、PreferenceScreen、PreferenceCategory

secret

password

{secret}

AdfMFPreferenceText

min

min*

{min}

AdfMFPreferenceText

max

max*

{max}

AdfMFPreferenceText

name

entryValues

@array/<PreferenceIdentifier>___entryValues

AdfMFPreferenceList

value

entries

@array/<PreferenceIdentifier>___entries

AdfMFPreferenceList

B.2.1.3 属性のデフォルト値

次の場合、adfmf-application.xmlおよびadfmf-feature.xmlファイル用の概要エディタでは、XMLからの属性名と値は除外されます。

- 属性タイプがxsd:booleanである。

- 属性値に<default>値オプションがある。

- ユーザーが値として<default>を指定している。

XSLは、ブール・タイプのADFモバイル属性と、対応するデフォルト値を認識している必要があります。XSLはその後、適切なAndroidまたはテンプレート・カスタム属性値を指定します(ユーザーによって選択された場合)。

表B-4は、変換されるADFモバイル・プリファレンスにdefault属性が含まれていない場合に、デプロイメントでandroid:defaultValue属性に対して指定されるものを示しています。

表B-4 デフォルト以外の値を持つ属性の変換

ADFモバイル・プリファレンス要素

等価のAndroidプリファレンス

デフォルトの属性値

preferenceBoolean

AdfMFPreferenceBoolean

false

preferenceText

AdfMFPreferenceText

空の文字列

preferenceList

AdfMFPreferenceList

空の文字列

B.2.1.4 プリファレンス画面ルート要素

preferences.xmlには、<PreferenceScreen>要素と呼ばれるルート要素があります。Androidテンプレートでは、この要素に次のXML名前空間定義が存在している必要があります。

xmlns:adfmf="http://schemas.android.com/apk/res/<Application Package Name>

ここで、<Application Package Name>は、AndroidManifest.xmlファイル内にあるものと同じアプリケーション・パッケージ名です。<Android Package Name>は、AndroidManifest.xmlで指定されているAndroidパッケージ名を定義します。詳細は、第5.3.1項「モバイル・アプリケーションのIDおよび表示動作の設定方法」を参照してください。

デプロイメントでは、Androidデプロイメント・プロファイルのアプリケーション・バンドルID値が使用されます(存在する場合)。プロファイルにアプリケーション・バンドルID値が存在しない場合は、adfmf-application.xmlファイルに含まれているアプリケーションの表示名およびアプリケーションIDからこの値が取得されます。デプロイメントJavaコードは、この値をXSLドキュメントにパラメータとして渡します。

例B-1は、adfmf-feature.xmlファイルに含まれているADFモバイル・プリファレンスを示しています。例B-1は、対応するpreferences.xmlファイルを示しています。

例B-1 adfmf-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/jdev/adfmf">
<adfmf:feature id="oracle.hello" name="Hello"
icon="oracle.hello/navbar-icon.png"
image="oracle.hello/springboard-icon.png">
<adfmf:content id="Hello.Generic">
<adfmf:localHTML url="oracle.hello/index.html"/>
</adfmf:content>
<adfmf:preferences>
<adfmf:preferenceGroup id="prefGroup"
label="preference group">
<adfmf:preferenceBoolean id="boolPref"
label="boolPref perference"
default="true"/>
<adfmf:preferenceNumber id="numPref"
label="numPref preference"
default="1"
min="1"
max="10"/>
<adfmf:preferenceText id="textPref"
label="textPref preferences"
default="Foo"/>
<adfmf:preferenceList id="listPref"
label="listPref preference"
default="value2">
<adfmf:preferenceValue name="name1"
value="value1"/>
<adfmf:preferenceValue name="name2"
value="value2"/>
</adfmf:preferenceList>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:feature>
</adfmf:features>

B.2.2 arrays.xml

このファイルは、preferences.xmlファイルから参照されるリスト・プリファレンスの名前と値を列挙する文字列配列要素で構成されています。adfmf-application.xmlおよびadfmf-feature.xmlファイルに含まれている各<preferenceList>は、2つの文字列配列要素(1つは名前用、もう1つは値用)に変換されます。たとえば、例B-2に記載されているADFモバイルのpreferenceList定義は、例B-3に示されているように、arrays.xmlファイル内の<string-array name="feature.oracle.hello.prefGroup.MyList___entry_values">および<string-array name="feature.oracle.hello.prefGroup.MyList___entries">に変換されます。

例B-2 adfmf-feature.xmlファイルにおけるPreferenceList定義

<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/jdev/adfmf">

<adfmf:feature id="oracle.hello" name="Hello" icon="oracle.hello/navbar-icon.png" image="oracle.hello/springboard-icon.png">
...
<adfmf:preferences>
<adfmf:preferenceGroup id="prefGroup">
<adfmf:preferenceList id="MyList" label="My List">
<adfmf:preferenceValue name="name1" value="value1"/>
<adfmf:preferenceValue name="name2" value="value2"/>
<adfmf:preferenceValue name="name3" value="value3"/>
</adfmf:preferenceList>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:feature>
...

例B-3 arrays.xmlにおける、<string-array>要素に変換されたプリファレンス・リスト

<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:adfmf="http://schemas.android.com/apk/res/oracle.myandroidapp">

<string-array name="feature_oracle_hello_prefGroup.MyList___entry_values">
<item>name1</item>
<item>name2</item>
<item>name3</item>
</string-array>

<string-array name="feature_oracle_hello_prefGroup.MyList___entries">
<item>value1</item>
<item>value2</item>
<item>value3</item>
</string-array>
</resources>

例B-4は、preferences.xmlで参照されている<string-arrays>を示しています。

例B-4 preferences.xmlファイルからのPreferenceList参照

<oracle.adfmf.preferences.AdfMFPreferenceList android:key="feature.oracle.hello.MyList"
android:title="@string/feature_oracle_hello_prefGroup.MyList___title"
android:entries="@array/feature_oracle_hello_prefGroup.MyList___entries"
android:entryValues="@array/feature_oracle_hello_prefGroup.MyList___entry_values" />

B.2.3 Strings.xml

例B-5で示されているstrings.xmlファイルは、preferences.xmlファイルによって参照される文字列要素、およびadfmf-application.xmlおよびadfmf-feature.xmlファイルで定義されているリソース・バンドル参照で構成されています。各文字列要素には、文字列および文字列値を一意に識別するname属性があります。

例B-5 strings.xmlファイル

<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:adfmf="http://schemas.android.com/apk/res/oracle.myandroidapp">
...
<string name="feature.PROD.bundle.FeatureName">Products</string>
<string name="feature.oracle.hello.prefGroup.MyBooleanPreference___title">My feature boolean pref</string>
...
</resources>

文字列のソースがリソース・バンドル文字列への参照でない場合、name属性のネーミング規則は<PreferenceIdentifier>___<androidAttributeName>です。

例B-6 adfmf-feature.xmlファイルで定義されているリソース・バンドル参照

<adfmf:features xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:adfmf="http://xmlns.oracle.com/jdev/adfmf">
<adfmf:loadBundle basename="mobile.ViewControllerBundle" var="bundle"/>
<adfmf:feature id="oracle.hello" name="Hello"
icon="oracle.hello/navbar-icon.png"
image="oracle.hello/springboard-icon.png">
<adfmf:feature id="PROD"
name="#{bundle.FeatureName}"
icon="openMore.png"
image="G.png"
credentials="none">
...
<adfmf:preferences>
<adfmf:preferenceGroup id="prefGroup">
<adfmf:preferenceBoolean default="true" id="MyBooleanPreference" label="My feature boolean pref"/>
</adfmf:preferenceGroup>
</adfmf:preferences>
</adfmf:feature>

B.3 iOS用のプリファレンスの変換

iOSデプロイヤは、表B-4に記載されているADFモバイル・プリファレンスを、iOS Settingsアプリケーションで必要なプリファレンス・リスト(.plist)ファイル表現に変換します。

表B-5 ADFモバイル・プリファレンスと、対応するiOS表現

ADFモバイル・プリファレンス・コンポーネント

iOS表現

<adfmf:preferencePage>

PSChildPaneSpecifier

<adfmf:preferenceGroup>

PSGroupSpecifier

<adfmf:preferenceBoolean>

PSToggleSwitchSpecifier

<adfmf:preferenceList>

PSMultiValueSpecifier

<adfmf:preferenceText>

PSTextFieldSpecifier

<adfmf:preferenceNumber>

PSTextFieldSpecifier

プリファレンス・リスト(.plist)ファイルのiOS要件については、iOS Developer Library (http://developer.apple.com/library/ios/navigation/)にある『iOS Application Programming Guide』の「Implementing Application Preferences」を参照してください。

例B-7は、ADFモバイル・プリファレンスのスタンザを示しています。

例B-7 adfmf-application.xmlファイルに基づいたXML

<adfmf:preferences>
<adfmf:preferenceGroup id="gen" label="Oracle Way Cool Mobile App">
<adfmf:preferenceGroup id="SubPage01" label="Child Page">
</adfmf:preferenceGroup>
</adfmf:preferences>

C ADFモバイル・アプリケーションの使用方法

この付録には、ADFモバイルのユーザーの操作性に関する初歩的な情報が記載されています。

この付録では次の項について説明します。

- 第C.1項「ADFモバイル・アプリケーションの使用方法の概要」

- 第C.2項「モバイル・デバイスへのADFモバイル・アプリケーションのインストール」

- 第C.3項「エンド・ユーザーによるアプリケーション機能間のナビゲーション」

- 第C.4項「プリファレンスの設定」

- 第C.5項「アプリケーションの使用方法の制限」

C.1 ADFモバイル・アプリケーションの使用方法の概要

ADFモバイル・アプリケーションをインストールしたら(第C.2項「モバイル・デバイスへのADFモバイル・アプリケーションのインストール」を参照)、エンド・ユーザーは、モバイル・デバイスのホーム画面でアプリケーション・アイコンを選択して(図C-1を参照)、ADFモバイル・アプリケーションの使用を開始できます。アプリケーションの起動時、ホーム画面にはスプラッシュ画面が表示されます。起動が完了したら、エンド・ユーザーは、アプリケーション機能間を移動したり(第C.3項「エンド・ユーザーによるアプリケーション機能間のナビゲーション」を参照)、プリファレンスを設定したり(第C.4項「プリファレンスの設定」を参照)、他のすべてのタスクを実行することが可能になります。

図C-1 iPhone上のアプリケーション・アイコン

C.2 モバイル・デバイスへのADFモバイル・アプリケーションのインストール

エンド・ユーザーは、通常のアプリケーション・プロビジョニング・メカニズムを通じてADFモバイル・アプリケーションをダウンロードおよびインストールできます。

インストール時、アプリケーションのプリファレンスにはデフォルト設定が移入されます。デフォルトの変更方法については、第C.4項「プリファレンスの設定」および第C.2.2項「エンド・ユーザーがAndroidデバイスにADFモバイル・アプリケーションをインストールする方法」を参照してください。

モバイル・デバイスからADFモバイル・アプリケーションを削除することは、他のアプリケーションのアンインストールと変わりません(第C.2.3項「エンド・ユーザーがADFモバイル・アプリケーションをアンインストールする方法」を参照)。

C.2.1 エンド・ユーザーがiOSデバイスにADFモバイル・アプリケーションをインストールする方法

iOSデバイスのユーザーは、次の方法でADFモバイル・アプリケーションをダウンロードおよびインストールします。

- エンタープライズ固有の配布メカニズムから

- iTunesを使用

- iPhone構成ユーティリティを通じてデプロイ

- Webサーバー上でワイヤレスにホスティング

- AppleのApp Storeから

C.2.2 エンド・ユーザーがAndroidデバイスにADFモバイル・アプリケーションをインストールする方法

アプリケーション・マーケットプレイスで利用可能なADFモバイル・アプリケーションをインストールすることに加えて、エンド・ユーザーは、アプリケーション・マーケットプレイスの外部で利用可能なアプリケーションをダウンロードできます。これを実行する方法については、Webで情報を検索することをお薦めします。

C.2.3 エンド・ユーザーがADFモバイル・アプリケーションをアンインストールする方法

ADFモバイル・アプリケーションは、他のアプリケーションと同様にモバイル・デバイスから削除されます。アンインストール・プロセスでは、アプリケーションとともにすべてのアプリケーション・データおよびすべての外部プリファレンスが削除されます。

C.3 エンド・ユーザーによるアプリケーション機能間のナビゲーション

各アプリケーション機能へのアクセスを提供するために、ADFモバイル・アプリケーションは、ナビゲーション・バーまたはSpringboardを使用して、有効なアプリケーション機能間のナビゲーションを可能にします。

アプリケーション開発時のナビゲーションの構成については、第5.4項「Springboardとナビゲーション・バーの動作の構成」を参照してください。

C.3.1 エンド・ユーザーがiOSデバイスでアプリケーション機能間を移動する方法

図C-2は、iPhone上に表示されるADFモバイルのUI要素を示しています。

図C-2 iPhone上のUI要素

UIは、ナビゲーション・アイテム(アイコン)が移入されたナビゲーション・バーで構成されています。最初のナビゲーション・アイテムは強調表示されており、これが選択されていることを示しています。

注意:

アプリケーションに対してSpringboardが定義されている場合は、オーバーレイ形式で「ホーム」ナビゲーション・ボタンがナビゲーション・バーの上に表示されますが、このボタンはその一部ではありません。このボタンにより、エンド・ユーザーは、アプリケーション・コンテンツからSpringboardに戻ることができます。

アプリケーションに対してSpringboardが指定されていない場合、「ホーム」アイコンは表示されません。

詳細は、第5.4項「Springboardとナビゲーション・バーの動作の構成」を参照してください。

図C-2で示されている例のナビゲーション・バーには、6つのナビゲーション・アイテムが含まれていますが、iPhone上のスペースが限られているため、すべてのナビゲーション・アイテムを同時に表示することはできません。そのため、5つ目のアイコンは、「次へ」機能になっています。「次へ」機能がアクティブ化されると、ナビゲーション・バーが展開され、残りのナビゲーション・アイテムが表示されます。iPad上では、すべてのナビゲーション・アイテムが表示されます。ナビゲーション・バーの上のコンテンツ領域には、この特定のソリューションに固有のコンテンツが表示されます。前述の例では、アプリケーションにバンドルされている発注の承認ツールです。

注意:

ナビゲーション・バーに少なくとも1つのアプリケーション機能のアイコンが表示されている場合、エンド・ユーザーに対して、「非表示」ボタン(ナビゲーション・バーが表示されている場合にそれを非表示にするボタン)と「表示」ボタン(ナビゲーション・バーが非表示の場合にそれを表示するボタン)が表示されます。

アプリケーションXMLファイル(adfmf-application.xml)で1つのアプリケーション機能のみが定義されている場合、または制約(または条件)で1つのアプリケーション機能のみの表示が許可されている場合、ナビゲーション・バーは非表示になります。

adfmf-application.xmlファイルで、ナビゲーション・バーに表示されるアプリケーション機能が参照されていない場合、「非表示」と「表示」のボタンがエンド・ユーザーに表示されず、ナビゲーション・バーが最初は非表示になっている可能性があります。この場合、Springboardが定義されているときは、それがアプリケーションに対する唯一のナビゲーション・ツールになります。

詳細は、第C.3.1.2項「単一機能アプリケーションについて」を参照してください。

図C-3は、「次へ」アイコンがアクティブ化され、残りのナビゲーション・アイテムがリストとして表示された後のiPhone UIを示しています。

図C-3 iPhone上のすべてのナビゲーション・アイテムの表示

アプリケーションの起動時にナビゲーション・バーに表示されるナビゲーション・アイテムを変更するには、図C-4に示すとおり、「編集」を選択して「構成」モードにします。

図C-4 iPhone上の「構成」モード

「構成」モードでは、コンテンツ領域からアイコンをドラッグし、それをナビゲーション・バーにドロップできます。この例では、図C-5に示すとおり、ナビゲーション・バーで「送信」ナビゲーション・アイテムがGleナビゲーション・アイテムに置き換えられ、「送信」は「次へ」アイテムの下にリストされています。構成モードを終了するには、「終了」を選択して「次へ」画面に戻ります。

図C-5 iPhone上のナビゲーション・バー表示の変更

エンド・ユーザーがナビゲーション・バーで新たに再配置されたGleナビゲーション・アイテムを選択すると、図C-6に示すとおり、コンテンツ領域にGleページが表示されます。

図C-6 iPhone上の再配置されたナビゲーション・アイテムのアクティブ化

C.3.1.1 Springboardを使用したナビゲーションについて

ADFモバイルでは、デフォルトでSpringboardナビゲーションは無効になっています。これは、開発時にadfmf-application.xmlファイルを構成することで有効化されます(第5.4項「Springboardとナビゲーション・バーの動作の構成」を参照)。

Springboardを使用したナビゲーションに対してADFモバイル・アプリケーションが有効である場合、アプリケーションの起動時、エンド・ユーザーに、図C-7に示すような画面が表示されます。

図C-7 Springboard画面

上の図では、ADFモバイルで提供されているデフォルトのSpringboardがデフォルトの縦レイアウトでiPhone上に表示されています(開発時にカスタムのSpringboardを作成する方法については、第5.4項「Springboardとナビゲーション・バーの動作の構成」を参照してください)。エンド・ユーザーが利用可能なアプリケーション・コンテンツ機能が3ページあり、画面の下部に3つのドットで示されています。エンド・ユーザーは、3つのページの最初のページを表示しています。最初のドットが明るく示されており、ユーザーが最初のページを表示していることがわかります。

機能の2番目のページを開く(図C-8を参照)には、iPhoneの画面を右から左にスワイプします。すると、最初のページが左に移動し、右から2番目のページが現れます。最初のページが左に移動してフェードアウトし、2番目のページが現れてフェードインします。

図C-8 Springboard: 2番目のページ

上の図では、エンド・ユーザーは3つのページの2番目のページを表示しています。2番目のドットが明るく示されていることで、それがわかります。

エンド・ユーザーがモバイル・デバイスを横方向に回転すると、それに応じてSpringboardアイコンの位置が変わります(図C-9を参照)。

図C-9 横表示のSpringboard画面

表示の方向が変わってもページは変わらず、ページ2が表示されていることに注意してください。

横方向の表示になっている間に機能の最初のページに戻る(図C-10を参照)には、iPhoneの画面を左から右にスワイプします。すると、2番目のページが右に移動し、左から最初のページが現れます。

図C-10 横表示のSpringboard: 最初のページ

1ページ目にある特定の機能(「コンタクト先」など)を表示するには、「コンタクト先」アイコンまたは該当するテキストをタッチします。

iOSデバイスでは、エンド・ユーザーは、デバイス・シェイク・ジェスチャーによって、どのアプリケーション機能からもSpringboardに戻ることができます。

Androidデバイスでは、エンド・ユーザーは、メニュー項目を使用していつでもSpringboardに戻ることができます。

C.3.1.2 単一機能アプリケーションについて

アプリケーションには、単一の機能しか持たないものもあります。その機能は、Springboardまたはナビゲーション・バーに表示されるようには構成されません。この場合、その単一の機能のみがエンド・ユーザーに表示され、ナビゲーション・バーの表示を制御したり、Springboardに戻ったりするための特殊なボタンは表示されません。

C.3.2 Androidデバイス上での移動方法

Androidデバイスでの機能のナビゲーションは、「次へ」機能を除いて、iOSデバイスでのナビゲーションとほぼ同じです(第C.3.1項「エンド・ユーザーがiOSデバイスでアプリケーション機能間を移動する方法」を参照)。Androidデバイスでは、「次へ」機能がアクティブ化されると、残りのナビゲーション・アイテムのリストが表示されます。ナビゲーション・バーの外観は変わりません。

C.4 プリファレンスの設定

エンド・ユーザーは、モバイル・プラットフォームによって規定されている方法でアプリケーションのプリファレンスを構成できます。

アプリケーション開発時のプリファレンスの構成については、第13章「ユーザー・プリファレンスの有効化」を参照してください。

C.4.1 iOSデバイスでのプリファレンスの設定方法

エンド・ユーザーは、iOSデバイスで「設定」アプリケーションを開き、ADFモバイル・アプリケーションの「設定」アイコンを選択して、そのアプリケーションで使用可能なすべての設定にアクセスできます。変更された設定は、「設定」アプリケーションを終了すると有効になります。これは、iOSデバイス上のすべてのアプリケーションの通常の動作です。

起動時、プリファレンスにはデフォルト値が移入されています。それらの値は、adf-feature.xmlファイルで定義されています。プリファレンスの値を設定するための標準的な方法に加えて、次の方法で値を定義できます。

- 値のリストから選択する。

- 読取り不可の値として(パスワードなどを入力する場合)。

- バイナリ値として。

プリファレンスは、カスケード・ページに表示されます。変更可能なプリファレンスと変更できないプリファレンスは、容易に区別できます。

プリファレンスを使用して、ユーザーの資格証明をグローバルに設定できます(第17章「ADFモバイル・アプリケーションのセキュリティ」を参照)。

C.4.2 Androidデバイスでのプリファレンスの設定方法

Androidデバイスでのプリファレンスの設定は、iOSデバイスでのプリファレンスの設定と同じです(第C.4.1項「iOSデバイスでのプリファレンスの設定方法」を参照)。プリファレンスには、「プリファレンス」メニュー項目からアクセスできます。

注意:

そのアプリケーションに対して定義されているプリファレンスが存在しない場合は、メニューに「プリファレンス」メニュー項目が表示されることはありません。

C.5 アプリケーションの使用方法の制限

一般的なADFモバイル・アプリケーションの様々なモジュールの使用方法には、多くの制限があります。

C.5.1 リスト・ビュー・コンポーネントの制限

ADFモバイルAMXリスト・ビュー・コンポーネントを使用する際に(第8.2.7項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照)エンド・ユーザーが留意する必要がある制限は、次のとおりです。

1. リスト・ビュー・コンポーネントが編集モードの場合、エンド・ユーザーが実行可能なのは、(リスト・アイテム・コンポーネントによって表示されている)行の並替えのみであり、行を選択またはハイライトすることはできません。

2. リスト・ビュー・コンポーネントが編集モードの場合、そのコンポーネントで区切りが有効になっていても、エンド・ユーザーは、それらを使用できません。区切りを使用すると、予期しない結果を招くおそれがあります。

C.5.2 データ視覚化コンポーネントの制限

地理マップ(第8.5.14項「地理マップ・コンポーネントの使用方法」を参照)を除いて、ADFモバイルAMXデータ視覚化コンポーネントは、Android 2.nプラットフォームで相互作用をサポートしていません。

C.5.3 Androidプラットフォームでのデバイスの「戻る」ボタンの制限

Android 4.0.3では、ADFモバイル・アプリケーションの実行時、デバイスの「戻る」ボタンは無効になります。

D XMLの解析

この付録では、XMLの解析で使用できるライブラリについて説明します。

この付録では、次の内容を説明します。

- 第D.1項「kXMLライブラリを使用したXMLの解析」

D.1 kXMLライブラリを使用したXMLの解析

コアADFモバイル・ライブラリの1つであるkXMLは、XMLの解析に使用できるAPIを提供します。このライブラリは、JDKプロファイラ・インタフェース(JVMPI)を通じてアプリケーションに公開されます。

詳細は、kXMLのドキュメントを参照してください。

- http://kxml.sourceforge.net/kxml2

- http://kxml.sourceforge.net/kxml2/javadoc

E サンプルのADFモバイル・アプリケーション

この付録では、サンプルのADFモバイル・アプリケーションについて説明します。

E.1 サンプルのADFモバイル・アプリケーションの概要

ADFモバイルは、基本的なアーティファクトの作成、デバイス・ネイティブな機能(SMSや電子メールなど)へのアクセス、ローカルのSQLiteデータベース上でのCRUD (作成/読取/更新/削除)操作の実行など、様々な開発シナリオを提供するサンプル・アプリケーションのセットとともに出荷されています。これらのアプリケーションは、開発コンピュータのJDeveloperインストール・ディレクトリ内の次の場所に存在するPublicSamples.zipファイルにあります。

jdev_install/jdeveloper/jdev/extensions/oracle.adf.mobile/Samples

これらのアプリケーションを表示するには、PublicSamples.zipファイルをJDeveloper作業ディレクトリ(これは通常、User Home Directory/jdeveloper/myworkです)に抽出します。

注意:

デフォルトのSpringboardを含むサンプル・アプリケーションをSamplesディレクトリに抽出して開く必要があります。第5.4.1項「アプリケーションのナビゲーションの構成方法」の説明に従って、これらのアプリケーション用のadfmf-application.xmlファイルを更新して、Springboardがクラスパスに追加されるようにする必要もあります。

デフォルトのSpringboardを使用するサンプル・アプリケーションを適切に実行できるようにする手順は次のとおりです。

1. Samplesディレクトリからアプリケーションを開きます。

2. adfmf-application.xmlファイルの概要エディタの「アプリケーション」ページで、Springboardオプションを「デフォルト」から「なし」に変更します。

3. Springboardオプションとして「デフォルト」を選択します。

4. 「すべて保存」をクリックします。

5. アプリケーションをデプロイします。

これらのアプリケーションについては、すべて表E-1で説明されています。他に説明されていないかぎり、これらのアプリケーションは、第3章「ADFモバイル環境の設定」の説明に従って開発環境を構成した後、シミュレータにデプロイできます。

ヒント:

ADFモバイル・アプリケーションの作成方法について理解するには、これらのアプリケーションを表E-1に記載されている順番で確認してください。

表E-1 サンプルのADFモバイル・アプリケーション

推奨する使用順

アプリケーション名

説明

サンプル・アプリケーションの実行に必要な追加のリソース

1

HelloWorld

フレームワークの基本的な構造を示す、ADFモバイルのhello worldアプリケーション。この基本アプリケーションには、ローカルのHTMLファイルによって実装される単一のアプリケーション機能があります。このアプリケーションを使用して、開発環境が、アプリケーションのコンパイルとデプロイのために正しく設定されていることを確認します。第4.2.2項「ADFモバイル・アプリケーション作成時の処理」も参照してください。

2

CompGallery

このアプリケーションは、これらのコンポーネントのすべてを示すことによって、ADFモバイルAMX UIコンポーネントを紹介する役割を果たします。このアプリケーションを使用して、これらのコンポーネントの属性を変更し、その変更の効果をリアルタイムで確認できます。変更を行うたびにアプリケーションを再コンパイルして再デプロイする必要はありません。一般的な情報については、第8章「ADFモバイルAMXユーザー・インタフェースの作成」を参照してください。

3

LayoutDemo

このアプリケーションは、ユーザー・インタフェース・レイアウトと、モバイル・アプリケーションで一般的に使用される様々なリストおよびボタン・スタイルの作成方法を示します。また、ポップアップ・コンポーネントのアクション・シート・スタイルの作成方法、および様々なチャートおよびゲージ・コンポーネントの使用方法も示します。第8.3項「UIコンポーネントの作成と使用方法」および第8.5項「データ視覚化の指定」を参照してください。

このアプリケーションは、Samplesディレクトリから開く必要があります。「デフォルト」のSpringboardオプションは、adfmf-application.xml概要エディタの「アプリケーション」ページでいったんクリアし、再度選択する必要があります。

4

JavaDemo

このアプリケーションは、ユーザー・インタフェースをJava Beanにバインドする方法を示します。また、指定されたユーティリティ・クラスを使用して、JavaレイヤーからELバインディングを起動する方法についても示します。第8.10項「イベント・リスナーの使用方法」および第9.2項「ELサポートの理解」も参照してください。

5

Navigation

このアプリケーションは、バインドされたタスク・フローやルーターを含む、ADFモバイルの様々なナビゲーション技術を示します。様々なページ遷移についても示します。第7.2項「タスク・フローの作成」も参照してください。

このアプリケーションは、Samplesディレクトリから開く必要があります。「デフォルト」のSpringboardオプションは、adfmf-application.xml概要エディタの「アプリケーション」ページでいったんクリアし、再度選択する必要があります。

6

LifecycleEvents

このアプリケーションは、ADFモバイル・アプリケーション自体およびその埋込みアプリケーション機能にライフサイクル・イベント・ハンドラを実装します。このアプリケーションは、アプリケーションがライフサイクルの特定の時点で自身のロジックを実行できるようにするためのコードを挿入する場所を示します。第5.6項「ライフサイクル・イベント・リスナーについて」も参照してください。

iOSの場合、LifecycleEventsサンプル・アプリケーションは、/Applications/Utilities/Console.appにあるコンソール・アプリケーションにデータを記録します。

7

DeviceDemo

このアプリケーションは、DeviceFeaturesデータ・コントロールを使用して、地理的位置、電子メール、SMS、コンタクト先などのデバイス機能を公開する方法、およびデバイスにそのプロパティを問い合せる方法を示します。第9.5項「DeviceFeaturesデータ・コントロールの使用方法」も参照してください。

SMSおよび一部のデバイス・プロパティはiOSシミュレータまたはAndroidエミュレータ上で機能しないため、このアプリケーションを実際のデバイス上で実行することも必要です。

8

GestureDemo

このアプリケーションは、ADFモバイル・アプリケーションにおいてジェスチャーをどのように実装および使用できるかを示します。第8.4項「ジェスチャーの有効化」も参照してください。

9

StockTracker

このアプリケーションは、データ変更イベントがどのようにJavaを使用して、データ変更をユーザー・インタフェースに反映できるかを示します。また、様々なレイアウト・ユースケース、ジェスチャーおよび基本的なモバイル・パターンもあります。第9.7項「データ変更イベント」も参照してください。

10

HR

この人事管理アプリケーションは、現実の様々なアプリケーション技術を示すCRUDアプリケーションです。これは、ローカルのSQLiteデータベースを使用して、そのデータを格納します。このアプリケーションでは、各起動間でデータの一貫性が保たれます。このアプリケーションは、すべてのOracleデータベースとともに出荷されるデフォルトのHRスキーマに基づいています。一般的な情報については、第11章「ローカル・データベースの使用方法」を参照してください。

iPad用とiPhone用の両方のレイアウトを提供することで、このアプリケーションは、様々なタイプのユーザー・インタフェースがどのようにして同じデータ・モデルを共有できるかを示します。このアプリケーションでは、様々な他のパターンも同様に示されます。

11

Skinning

このアプリケーションでは、提供されているスタイル・シートをオーバーライドするか、独自のスタイル・シートを使用して拡張することで、アプリケーションにスキンを適用し、固有のルック・アンド・フィールを追加する方法を示します。また、このアプリケーションは、スキンがどのようにして、デバイスのタイプに基づいてADFモバイルAMX UIコンポーネントのスタイルを制御するかも示します。第5.11項「ADFモバイル・アプリケーションのスキニング」も参照してください。

12

PrefDemo

このアプリケーションは、アプリケーション全体のユーザー設定ページおよびアプリケーション機能固有のユーザー設定ページを示します。一般的な情報については、第13章「ユーザー・プリファレンスの有効化」を参照してください。

Copyright © 2012, Oracle and/or its affiliates. All rights reserved.