アクセシビリティ
デベロッパーリソース

Jeff Swartz

Jeff Swartz

シニアテクニカルライター
Adobe

作成日:
2008年2月25日
ユーザレベル:
中級, 上級
製品:
Adobe AIR

XML 環境設定ファイルの読み取りおよび書き込み

このサンプルアプリケーションは、アプリケーションの位置やサイズに関するデータと保存日時を読み取りおよび書き込みます。また、アプリケーションを開くときにそのデータに従ってウィンドウを配置します。具体的には、次の Adobe AIR 機能を示します。

  • テキストファイルの読み取りおよび書き込み
  • Adobe AIR アプリケーション格納ディレクトリにあるファイルの指定
  • AIR アプリケーションウィンドウの位置、サイズおよび表示の変更
  • Window オブジェクトから送出された closing イベントへの応答

XML Preferences アプリケーション

図 1. XML 環境設定の指定が可能なサンプルアプリケーション

注意:このサンプルアプリケーションは、説明のためにそのままの状態で提供されています。

要件

この記事に書かれた操作を行うには、次のソフトウェアとファイルが必要です。

Adobe AIR

Adobe AIR SDK

サンプルファイル:

このサンプルアプリケーションには、次のファイルが含まれています。

  • index.html:メインアプリケーションソースコード。
  • AIRAliases.js:AIR JavaScript エイリアスファイル。
  • application.xml:AIR アプリケーション記述子ファイル。
  • サンプル AIR アイコンファイル。

前提知識

HTML ベースのアプリケーション構築の経験があることが推奨されます。このクイックスタートの開始方法について詳しくは、「Building the Quick Start sample applications with HTML」を参照してください。

アプリケーションのテスト

このアプリケーションは、アプリケーションの位置やサイズに関するデータと保存日時を読み取りおよび書き込みます。また、アプリケーションを開くときにそのデータに従ってウィンドウを配置します。環境設定は、XML データを含むテキストファイルに格納されています。アプリケーションは、読み取りの場合はそのデータを XML オブジェクトに変換し、書き込みの場合は XML データをテキストに変換します。このアプリケーションをテストするには、次の手順に従います。

  1. アプリケーションを開きます。
  2. ウィンドウのサイズと位置を変更します。
  3. 「Save Preferences」ボタンをクリックして、データを XML ファイルに書き込みます。
  4. アプリケーションを再起動して、指定した環境設定が適用されていることを確認します。

コードの理解

ここでは、ファイルの HTML マークアップすべてを説明するわけではなく、AIR 固有の JavaScript コードのみ説明します。

XML ファイルからのデータの読み取り

init() メソッドは、定義済みのパスを参照するように prefsFile File オブジェクトを初期化し、データを読み取る readXML() メソッドを呼び出します。

prefsFile = air.File.applicationStorageDirectory;
prefsFile = prefsFile.resolvePath("preferences.xml");
readXML();

File.applicationStorageDirectory は AIR アプリケーションの格納ディレクトリを指します。これは AIR アプリケーションごとに定義されています。

init() メソッドは、ウィンドウの closing イベントに応答して環境設定データをファイルに保存するようにイベントハンドラも設定します。

window.nativeWindow.addEventListener(Event.CLOSING, windowClosingHandler);

readXML() メソッドは、File オブジェクトと FileStream オブジェクトを設定します。open() メソッドの呼び出しの fileMode パラメータが FileMode.READ に設定されているので、FileStream オブジェクトはファイルからデータを読み取ることができます。

stream = new air.FileStream();
if (prefsFile.exists) {
    stream.open(prefsFile, air.FileMode.READ);
    processXMLData();
}

stream オブジェクトの open() メソッドは、ファイルを同期的に開き、読み取りバッファへのデータの読み取りを開始します。

processXMLData() メソッドは、XML データを処理してファイルを閉じます。FileStream オブジェクトの bytesAvailable プロパティは、読み取りバッファのバイト数です。つまり、ファイルは同期的に読み取られるので、ファイルのすべてのバイト数です。

prefsXML = stream.readUTFBytes(stream.bytesAvailable);
stream.close();

アプリケーションウィンドウの位置とサイズの変更

processXMLData() 関数では、JavaScript DOM API を使用して XML データが処理され、ファイルが閉じられます。FileStream オブジェクトの bytesAvailable プロパティは、読み取りバッファのバイト数です。つまり、ファイルは同期的に読み取られるので、ファイルのすべてのバイト数です。

var domParser = new DOMParser();
prefsXML = domParser.parseFromString(prefsXML, "text/xml");
var windowState = prefsXML.getElementsByTagName("windowState")[0];
window.moveTo(windowState.getAttribute("x"), windowState.getAttribute("y"));
document.getElementById("xPositionField").value = windowState.getAttribute("x");
document.getElementById("yPositionField").value = windowState.getAttribute("y");
window.resizeTo(windowState.getAttribute("width"), windowState.getAttribute("height"));
document.getElementById("widthField").value = windowState.getAttribute("width");
document.getElementById("heightField").value = windowState.getAttribute("height");
document.getElementById("dateField").value = 
    prefsXML.getElementsByTagName("saveDate")[0].firstChild.nodeValue;

アプリケーションのプロパティを定義する application.xml ファイルでは、initialWindow プロパティの visible 属性が false に設定されています。ウィンドウのサイズと位置を変更してからウィンドウを表示可能にします。

readXML() メソッドは、processXMLData() メソッドが戻ったらウィンドウを表示可能にします。

window.nativeWindow.visible = true;

ファイルへの XML データの書き込み

createXMLData() は XML データを文字列に変換し、XML 宣言を文字列の先頭に追加します。さらに、行末の文字をプラットフォーム固有の行末の文字(File.lineEnding 定数で表されます)に置き換えます。

var cr = air.File.lineEnding;
prefsXML =    "<?xml version='1.0' encoding='utf-8'?>" + cr
            + "<preferences>" + cr 
            + "	<windowState" + cr    
            + "	width = '" + window.outerWidth.toString() + "'" + cr    
            + "	height = '" + window.outerHeight.toString() + "'" + cr
            + "	x = '" + window.screenLeft.toString() + "'" + cr
            + "	y = '" + window.screenTop.toString() + "'" + "/>" + cr
            + "	<saveDate>"
            +  new Date().toString() 
            + "</saveDate>" + cr
            + "</preferences>";
document.getElementById("widthField").value = window.outerWidth.toString(); 

document.getElementById("heightField").value = window.outerWidth.toString(); 

document.getElementById("xPositionField").value = window.screenLeft.toString(); 

document.getElementById("yPositionField").value = window.screenTop.toString(); 

writeXMLData() 関数では、データを書き込むための FileStream オブジェクトを作成して使用します。open() メソッドの fileMode パラメータとして FileMode.WRITE が指定されています。これにより、FileStream オブジェクトはファイルへの書き込みが可能になります。既存のデータは書き込み前に切り詰められます。

stream = new air.FileStream();
stream.open(prefsFile, air.FileMode.WRITE);

次に、文字列に変換された XML データを UTF-8 データとしてファイルに書き込む writeUTFBytes() メソッドが呼び出されます。

stream.writeUTFBytes(prefsXML);
stream.close();

ユーザがウィンドウを閉じると、NativeWindow オブジェクトから終了イベントが送出されます。このイベントのイベントハンドラでは、イベントのデフォルトの動作(アプリケーションを閉じて XML データを保存する saveData() メソッドを呼び出す)がキャンセルされます。データが保存されると、NativeApplication.nativeApplication.exit() メソッドが呼び出され、アプリケーションが閉じます。

function windowClosingHandler(event) 
{
    event.preventDefault();
    nativeWindow.removeEventListener("closing", windowClosingHandler)
    saveData();
    air.NativeApplication.nativeApplication.exit();
}

著者について

Jeff Swartzは、1992年にMacromedia(現Adobe Systems)に入社し、現在はAdobe AIR担当のテクニカルライターを務めています。Jeffは、University of Illinois at Urbana-Champaignのコンピュータサイエンス学学士号と、Edinburgh University人工知能学部での就学経験を有しています。サンフランシスコベイエリアのファンは、Jeffのトロンボーン演奏を寛大に許容しています。また、Vienna Beef Ltd.のダンシングホットドッグ、Big Frankとして活躍した経験もあります。