好的我正在尝试这样做,以便当用户启动我的航空应用程序时,它会自行定位并将其自身调整为上次打开时的大小。
这是我的代码:
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;
}
}
这确实有效,但是,我收到用户的抱怨,有时当他们启动应用程序时,它无处可寻(屏幕外),他们可以右键单击任务栏项并最大化它以取回它,但这不应该是必要的。
我只能假设此问题是由于我尝试保存应用程序的位置而引起的。我不知道会发生什么问题,或者我怎么解决这个问题?
也许是一种方法来判断应用程序在定位后是否处于屏幕外,并在屏幕上移动它,如果是这样的话?不知道我怎么能这样做?
有什么想法吗?
感谢!!!
答案 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没有这些调用。