1

ユーザーがエアアプリを起動したときに、最後に開いたときの位置に合わせてサイズを調整できるようにしようとしています。

これが私のコードです:

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;
    }
}

これは機能しますが、ユーザーから、アプリを起動したときにどこにも見つからない (画面外) ことがあり、タスクバー項目を右クリックして最大化して元に戻すことができるという苦情が寄せられています。必要ありません。

この問題は、アプリケーションの位置を保存しようとしたことが原因であるとしか考えられません。何が問題なのか、またはこれを修正する方法がわかりませんか?

アプリを配置した後、アプリが画面外にあるかどうかを確認し、画面上に移動する方法はありますか? どうすればそれができるのかわかりませんか?

何か案は?

ありがとう!!!

4

1 に答える 1

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ブロックはエラーを無視するため、エラーは表示されません。一部の人にエラーが発生した場合、ストリームは書き込まれません。また、close呼び出しも実行されないため、ファイルは開いたままになります。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()よりもはるかに優れています。

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

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

AIRにはこれらの呼び出しがないため、flush()への参照を削除しました。

于 2010-02-25T17:58:27.460 に答える