AIR:保存应用程序位置和大小

时间:2010-02-25 15:37:50

标签: flex air application-settings

好的我正在尝试这样做,以便当用户启动我的航空应用程序时,它会自行定位并将其自身调整为上次打开时的大小。

这是我的代码:

private function init():void
{
    gotoLastPosition();
    this.nativeWindow.addEventListener( Event.CLOSING, saveAppPosition );
}

private function saveAppPosition(e:Event = null):void
{
    var xml:XML = new XML('<position x="'+this.nativeWindow.x+'" y="'+this.nativeWindow.y+'" width="'+this.width+'" height="'+this.height+'"/>');

    var f:File = File.applicationStorageDirectory.resolvePath("appPosition.xml");
    var s:FileStream = new FileStream();
    try
    {
        s.open(f,flash.filesystem.FileMode.WRITE);

        s.writeUTFBytes(xml.toXMLString());

        s.close();
    }
    catch(e:Error){}
}

private function gotoLastPosition():void
{
    var f:File = File.applicationStorageDirectory.resolvePath("appPosition.xml");   
    if(f.exists)
    {
        var s:FileStream = new FileStream();
        s.open(f,flash.filesystem.FileMode.READ);
        var xml:XML = XML(s.readUTFBytes(s.bytesAvailable));

        this.nativeWindow.x = xml.@x;
        this.nativeWindow.y = xml.@y;
        this.width = xml.@width;
        this.height = xml.@height;
    }
}

这确实有效,但是,我收到用户的抱怨,有时当他们启动应用程序时,它无处可寻(屏幕外),他们可以右键单击任务栏项并最大化它以取回它,但这不应该是必要的。

我只能假设此问题是由于我尝试保存应用程序的位置而引起的。我不知道会发生什么问题,或者我怎么解决这个问题?

也许是一种方法来判断应用程序在定位后是否处于屏幕外,并在屏幕上移动它,如果是这样的话?不知道我怎么能这样做?

有什么想法吗?

感谢!!!

1 个答案:

答案 0 :(得分:3)

我相信你会想要改变你的XML保存代码:

try
{
    s.open(f,flash.filesystem.FileMode.WRITE);

    s.writeUTFBytes(xml.toXMLString());

    s.close();
}
catch(e:Error){}

try
{
    s.open(f,flash.filesystem.FileMode.WRITE);
    s.writeUTFBytes(xml.toXMLString());
} catch(e:Error) {
    logger.error( e );
} finally {
    s.close();
}

如果发生错误,您将永远不会看到它,因为catch块只是忽略它。如果某些人发生错误,则永远不会写入流。此外,也不会执行关闭调用,因此文件将保持挂起状态。将finally()调用放在finally块中将确保无论文件关闭成功与否。这并不能保证这是你的问题,但从理论上讲,这些可能是一些用户可能遇到的潜在缺陷。

您也可以在阅读后关闭该文件。

var s:FileStream = new FileStream();
try {
   s.open(f,flash.filesystem.FileMode.READ);
   var xml:XML = XML(s.readUTFBytes(s.bytesAvailable));
   ...
} finally {
   s.close();
}

它可能无法在退出时保存窗口位置,因为它无法打开文件进行写入,因为它仍然可以读取。

我还建议开始将这些错误写入日志文件,以查看错误是否可能是罪魁祸首。 AIR有一个非常好的日志系统,你可以使用非常类似于log4j。当人们遇到麻烦时,您可以让他们向您发送该日志文件,并获得更好的反馈,了解他们的计划中发生的情况。必须登录任何严肃的应用程序。

更不用说您可以使用XPanelOnAIR等应用程序来获取调试期间发生的日志消息。比trace()要好得多。

http://www.novio.be/blog/?p=920

http://livedocs.adobe.com/flex/3/html/help.html?content=logging_09.html

删除了对flush()的引用,因为AIR没有这些调用。