Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex AIR:保存应用程序位置和大小_Apache Flex_Air_Application Settings - Fatal编程技术网

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

Apache flex AIR:保存应用程序位置和大小,apache-flex,air,application-settings,Apache Flex,Air,Application Settings,好的,我正在尝试这样做,当用户启动我的air应用程序时,它会根据上次打开时的情况来定位和调整自己的大小 这是我的密码: private function init():void { gotoLastPosition(); this.nativeWindow.addEventListener( Event.CLOSING, saveAppPosition ); } private function saveAppPosition(e:Event = null):void {

好的,我正在尝试这样做,当用户启动我的air应用程序时,它会根据上次打开时的情况来定位和调整自己的大小

这是我的密码:

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;
    }
}
private function init():void
{
gotolasposition();
this.nativeWindow.addEventListener(Event.CLOSING,saveAppPosition);
}
私有函数saveAppPosition(e:Event=null):void
{
var xml:xml=新的xml(“”);
var f:File=File.applicationStorageDirectory.resolvePath(“appPosition.xml”);
var s:FileStream=newfilestream();
尝试
{
s、 打开(f,flash.filesystem.FileMode.WRITE);
s、 writeUTFBytes(xml.toXMLString());
s、 close();
}
捕获(e:错误){}
}
私有函数gotolasposition():void
{
var f:File=File.applicationStorageDirectory.resolvePath(“appPosition.xml”);
如果(f.exists)
{
var s:FileStream=newfilestream();
s、 打开(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;
}
}
这确实有效,但是,我收到了用户的投诉,他们有时在启动应用程序时,找不到任何位置(屏幕外),他们可以右键单击任务栏项目并将其最大化以取回,但这不必要

我只能假设这个问题是由于我试图保存应用程序的位置引起的。我不知道会出什么问题,或者我如何解决这个问题

也许有一种方法可以在定位应用程序后判断它是否在屏幕外,如果在屏幕上移动它?不知道我怎么能做到

有什么想法吗


谢谢

我相信您会希望将XML保存代码更改为:

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

    s.writeUTFBytes(xml.toXMLString());

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

如果发生错误,您将永远看不到它,因为catch块会忽略它。如果某些人发生错误,则流永远不会写入。此外,关闭调用也不会执行,因此文件保持打开状态。将close()调用放入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()好得多


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

这只发生在用户有多个监视器的情况下,或者当他们使用笔记本电脑插入不同分辨率的投影仪时,或者在同一个用户的单监视器情况下?我不确定,我不这么认为,一个用户正在使用他的笔记本电脑和度假,很确定它没有连接到投影仪。我现在想知道xml文件是否不知何故被破坏了。+1不确定这是否是我问题的解决方案(目前),但是关于如何更好地处理文件流的很好的解释。文件流上似乎没有flush()方法?你的意思可能是truncate()?我的API搞混了。AIR没有flush()方法。您肯定不想使用truncate()来破坏文件的内容。
var s:FileStream = new FileStream();
try {
   s.open(f,flash.filesystem.FileMode.READ);
   var xml:XML = XML(s.readUTFBytes(s.bytesAvailable));
   ...
} finally {
   s.close();
}