辅助功能*

Jeff Swartz

Jeff Swartz

高级技术文档撰写工程师
Adobe

出版日期:
2008 年 2 月 28 日
用户级别:
中/高级
产品:
Adobe AIR

读写 XML 首选参数文件

本范例应用程序可读写与其位置和大小相关的数据以及保存日期。另外, 还会在应用程序打开时, 根据这些数据确定窗口位置。具体而言, 本范例应用程序将演示 Adobe AIR 的以下功能:

  • 读写文本文件
  • 指定 Adobe AIR 应用程序存储目录中的文件
  • 修改 AIR 应用程序窗口的位置、大小和可见性
  • 响应 Window 对象调度的 closing 事件

XML 首选参数应用程序

图 1。通过本范例应用程序可以指定 XML 首选参数。

注意: 本范例应用程序按原样提供, 用于教学目的。

要求

若要充分利用本篇文章, 您需要以下软件和文件:

Adobe AIR

Adobe AIR SDK

范例文件:

本范例应用程序包括以下文件:

  • index.html: 应用程序主要源代码。
  • AIRAliases.js: AIR JavaScript 别名文件
  • application.xml: AIR 应用程序描述符文件
  • AIR 图标文件范例

必备知识

应具备构建 HTML 应用程序的一般经验。有关使用此快速入门指南的详细信息, 请参阅用 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() 方法还设置事件处理函数, 用于响应窗口的关闭 (此时将首选参数数据保存至文件):

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.WRITE 作为 fileMode 参数。这指定 FileStream 对象可以写入文件 (并在写入之前截断任何现有数据):

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

接下来, 调用 writeUTFBytes() 方法, 该方法 (以 UTF-8 数据的形式) 将 XML 数据的字符串版本写入文件:

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

用户关闭窗口时, NativeWindow 对象将调度 closing 事件。此事件的处理函数取消了对此事件的默认行为 (即关闭应用程序), 并调用 saveData() 方法, 该方法将保存 XML 数据。保存数据之后, 代码调用 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 拥有伊利诺斯大学乌尔班纳-香巴尼分校的计算机科学与数学专业学士学位, 并曾就读于爱丁堡大学人工智能系。旧金山湾地区附近的听众都曾“领略”过 Jeff 在长号演奏方面的艺术风采。他还曾是 Vienna Beef Ltd. 的 Big Frank (舞蹈高手)。