AIR/Flex: 2010年11月アーカイブ

AIR アプリでメニューバーを表示する場合、Mac OS X と、Windows や Unix(まあ、Unix の場合は Window Manager の役目だが)とで処理が異なる。

アプリケーション毎のメニューを、Mac OS X は画面上部のメニューバーに一元化しているが、Windows や Unix では Window 毎のウィンドウメニューバーに表示する。仕掛けがまったく違うわけだ。

ということで、Action Script では OS 毎の記述の違いをなるべく吸収しているが、メニューバーのセットについては、以下のように NativeApplication.supportsMenu が有効(Mac OS X)か、NativeWindow.supportsMenu(Windows や Unix)が有効かでメニューをセットする先がかわってくる。

        //================================================================
        // メニューバーセット
        //================================================================
        private function buildMenu():void {

            var root:NativeMenu = new NativeMenu();

            var item:NativeMenuItem = new NativeMenuItem("hogehoge");
            root.addItem(item);

            if (NativeApplication.supportsMenu) { // Mac OS X
                nativeApplication.menu = root;
            }
            else if (NativeWindow.supportsMenu) { // Windows
                nativeWindow.menu = root;
            }

        }

で、この場合、ウィンドウメニューバーを表示しないよう ADF ファイルでシステムクロームの設定を "none" にしていると、

Error: Illegal window settings. Window menus are only supported when systemChrome is set to "standard".

と怒られてしまう。

でも、Mac OS X の場合はメニューバーは必ず表示れているわけで、その内容だけは編集したい場合もあるだろう。
その時は、

        //================================================================
        // メニューバーセット
        //================================================================
        private function buildMenu():void {

            var root:NativeMenu = new NativeMenu();

            var item:NativeMenuItem = new NativeMenuItem("hogehoge");
            root.addItem(item);

            nativeApplication.menu = root; // Mac OS X

        }

これだけの記述で良い。

今回の案件に関しては、一応、物理的にメニューバーを隠す形で良いと思うんだけど、今後のこともあるから、システム的に消せればそれにこしたことはないのだが・・・

最初にテストをした Test1 アプリはメニューバーに関する制御はまったく行っておらず、Mac 標準のメニューを表示しているだけだ。(「ファイル」「編集」「ウィンドウ」ね)

「もしかしたら、アプリケーションの中でちゃんとメニューの制御(メニューの作成)を行うようにしたらよかったりして・・・」と一縷の望みをかけ、Test1 にメニュー作成処理を組み込んでみた。

ソースはこんな感じ。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    width="352" height="192" applicationComplete="buildMenu()">
    <mx:Label x="123" y="38" text="TEST" width="128" height="58" fontSize="36"/>
    <mx:Label x="109.5" y="108" text="メニューバーが消えるかテスト"/>

    <mx:Script>
    <![CDATA[

    private function buildMenu():void {

        var root:NativeMenu = new NativeMenu();

        var item:NativeMenuItem = new NativeMenuItem("Sample");
        root.addItem(item);

        if (NativeApplication.supportsMenu) {
            nativeApplication.menu = root;
        }
        else if (NativeWindow.supportsMenu) {
            nativeWindow.menu = root;
        }

    }

    ]]>
    </mx:Script>

</mx:WindowedApplication>

で、表示が以下のとおりだ。

20101109_test1_2.jpg

ま、駄目だったちゅうことね。(^^;
状況変わらず。

メニューは「Sample」だけに変わっているので、ちゃんとアプリ内で作成したメニューが反映しているのだが、やっぱりメニューバー消えねえ。
AIR アプリ内でメニューバーを触ってようが関係なかったのね・・・

やっぱ、AIR(ランタイム?)の作りが独特なのか?

Action Script 3/Flex Builder 3/AIR の神よ!是非ともわがブログに降臨を!そして神の言葉をコメントください。(^^;

20101109_test1_1.jpg

Mac OS X のメニューバーを消して、AIR アプリを全面表示したかったんだけど、駄目だねえ・・・
Mac のメニューバーって、基本的に消せないものだったのね。

一応、PresentYourApps というソフトを使って消す(隠す)ことは出来るんだけど、AIR アプリでは駄目だ。(上の写真参照。Test1 ってのが、テスト用につくった AIR アプリ)

Windows のタスクバーと違って、Mac のメニューバーは「文字通りアプリケーションのメニューがセットされるもの」なので、アプリ毎に制御が必要。
なので、PresentYourApps でアプリ毎にメニューバーを隠すかどうか設定するようになっているのだが、AIR アプリでいくら「Hide Menu Bar and Dock」を選んでも、メニューバーは隠れないのだ。
Safari とか、他のアプリではちゃんとメニューバーが隠れるので、これはもう AIR 側の仕様の問題なんだろうなあ。

他にも何か良い方法がないかググってみてるんだけど、今のところ情報にたどり付けず。
む~ん・・・

ソフトウェアのデモ展示に Mac を使いたいが、Mac であるとか、Windows であるとか、プラットフォームは内緒にしときたいのだ。

つーことで、ディスプレイの上に黒いテープ貼って、メニューバーを隠すようにしようかな。大した高さではないので、それでもかまわないと思うんだがなあ・・・

20101109_flex_builder.jpg

ほんま、Flex Builder 3 はええかげんにして欲しい。

画面デザイン中にコントロールのIDを変更した時、既にコーディングしてるソース中の名前も変更するか「ワークスペース内のすべての参照の名前をこのIDに変更しますか?」と聞いてくるのだが、ここで「はい」を選ぶと「応答無し」になって固まってしまう。
ここまでに保存してなかったものは全てパーだ。
仕方無いので、ここでは変更を行わず、後でソースを一括変換することになるのだが微妙に面倒くさい。
続けてデザイン作業をしてたら忘れちゃうこともあるしな。

まあ、確か OS を Vista に上げてから発生するようになった気もするし、Flex Builder 3 が悪いのかどうかわかんないのだが・・・

誰かこのエントリーを見て「俺も同じ症状に悩んでいたが、無事解決することが出来た!」というコメントをくれることを夢見てブログに書いとく。(笑)

このアーカイブについて

このページには、2010年11月以降に書かれたブログ記事のうちAIR/Flexカテゴリに属しているものが含まれています。

前のアーカイブはAIR/Flex: 2010年9月です。

次のアーカイブはAIR/Flex: 2010年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら