Air/Flexの最近のブログ記事
ちょっと必要になったので自分のためにメモ。
まずはプロジェクトプロパティのFlexコンパイラでの設定で、追加コンパイラ引数に以下のオプションを追加して、カスタム設定ファイル用テンプレートを出力する。
-dump-config myconfig.xml
出力されたファイルを編集した上で、それをコンパイル時に使用するために、上記のオプションを削除して以下のオプションを追加する。
-load-config+=myconfig.xml
良くわからないけど、とりあえず行けてるっぽいです。
Flex3でフォームアプリケーションを開発していた時に、ある画面でTABキーを押すと、アプリケーション全体がフリーズしてしまうという、不可解な現象に遭遇しました。
フリーズ中にデバッガで一時停止してみたところ、FocusManagerが、次にフォーカスを設定するコンポーネントを探すために、ひたすらループしているのが原因のようでした。
そのアプリケーションは、ひとつのMXML上にViewStackで結構な数の画面を配置してあり、コンポーネントもかなりの数に達していて、それらのコンポーネントの可視状態や有効状態などを、ひとつひとつチェックしているらしいのです。
とそこまではわかったのですが、なぜそんな挙動をしているのかがさっぱりわからず、しかも他の画面では同じ現象も発生しないので、ものすごーく悩んでいたのですが、ほんのちょっとした修正で、無事に解決に至りました。
その修正内容とは「tabIndexを指定する」ということです。
なんでこれで解決したのかはわかりませんが、Flex SDK 3.2には、FocusManager絡みのバグがあるようなので、もしかするとそれが原因なのかもしれません。
とにかくこれからは、tabIndexは必ず指定しようと、固く心に誓ったのでした。
画像一覧で、表示形式をリストとサムネイルの一覧で切り替えられるという仕様があったので、ViewStackを使ってみることにしました。
ViewStackの上にDataGridとListを配置して、切り替えボタンのクリックイベントハンドラで、ViewStackのselectedItemIndexプロパティを変更してやると(実際にはデータバインディングを使用していますが)、あっという間にリスト切り替えの実装が完了してしまいました。
あー、楽ちん。
と、ここまでは良かったのですが、画像一覧のクリックイベントを処理するために、DataGridとListの両方にクリックイベントハンドラを追加したところ、addEventListnerでNullPointerExceptionが発生してしまいました。
まさかとは思ったのですが、どうやらViewStack上に配置された初期状態で不可視状態のコンポーネントのインスタンスは、初めて表示されるタイミングで生成される仕様みたいです。
「こんなんだったらViewStackなんか使わないで自前で処理した方が早いわボケー」
と思いつつ調べてみたところ、ViewStackのcreationPolicyというプロパティをallに設定することにより、ViewStackの初期化の際に、ViewStack上に配置されたすべてのコンポーネントのインスタンスが生成されるようになり、万事解決めでたしめでたしと相成りました。
ということで無事に一件落着したわけですが、この広い野原いっぱいインターネットの世界の中で、検索の末にこの解決策を発見したのが、同じアイレットの中のH君のCTOA日記内のエントリーだったというこのなんという偶然!
なんて言ってみましたが、実際は偶然でもなんでもなく、AirやFlex関連で困った時にいろいろ検索していると、高い確率でCTOA日記に行き当たるので、即ちCTOA日記には、有益な情報がいっぱい詰まっているということです。
そんなわけで、こんなブログより7倍(当社比)ためになるCTOA日記もよろしく。
6月6日はドラえもんの日だと個人的に思っています。
AirやFlexで扱うことができるエンコーディングは、デフォルトではUTF-8ですが、サーバ側のシステムの都合などで、UTF-8以外のエンコーディングを扱う必要が出てくる場合があります。
サーバ側から返されるデータのエンコーディングがShift-JISで固定であれば、サーバからデータを取得する前に、以下の一行を追加するだけで、Shift-JISのデータを文字化けすることなく扱うことができます。
洗濯物のポケットにレシートが入っているのに気づかずに洗ってしまったとです。
ヒロシです。(あえて)
URLLoaderで取得したデータに数値文字参照が含まれていました。
表示するだけなら、LabelやTextAreaのhtmlTextプロパティにセットしてやればOKなのですが、htmlTextプロパティの無いコンポーネントへの表示や、データの編集・保存などのために直接文字に変換したいという場合のための手段としては使えませんし、Flexにもそういうメソッドは用意されていないようです。(見つけられてないだけかも?)
ということで、Unicode・16進数表記の数値文字参照限定ですが、自前の変換処理を作成して対応しました。


