2012年8月15日水曜日

NavigationBarの有無判定


アプリケーション作成時に「NavigationBarが表示されている端末かどうか?」の判定が必要となった場合、どうすればいいか確認します。

以下のモジュールがFrameworks内にあります
 PhoneWindowManager#hasNavigationBar()
 WindoManagerService#hasNavigationBar()

このモジュールを使用しているソースがあるかどうかチェック。
アプリケーションで使えそうなモジュールはViewConfigurationというクラス。

public class ViewConfiguration {
    private ViewConfiguration(Context context) {
             :
        if (!sHasPermanentMenuKeySet) {
            IWindowManager wm = Display.getWindowManager();
            try {
                sHasPermanentMenuKey = wm.canStatusBarHide() && !wm.hasNavigationBar();
                sHasPermanentMenuKeySet = true;
            } catch (RemoteException ex) {
                sHasPermanentMenuKey = false;
            }
        }
             :
    }

    public boolean hasPermanentMenuKey() {
        return sHasPermanentMenuKey;
    }
}


hasPermanentMenuKey()というmethodは
Permanentな(常に押下できる)MenuKeyは存在する/しないか判定するmethod。

sHasPermanentMenuKeyは以下の条件で値が決定する。
wm.canStatusBarHide()は「Phone/Tabletの判定」、wm.hasNavigationBar()は「NavigationBarの有無判定」なので、
Tabletも場合、そのそもNavigationBarは非対応なので、falseとなる。
Phone ModeでかつNavigationBarがない場合、trueとなる。
Phone ModeでかつNavigationBarがある場合、falseとなる。

となる。

と、いうことでアプリ側で以下のように値を取得すればOK。

//hasPermanentMenuKey == true はNavigationBarが非表示
//hasPermanentMenuKey == false はNavigationBarが表示
boolean isNavigationBar = ! ViewConfiguration.get(this).hasPermanentMenuKey();


関連リンク:

 何気なく使っているFrameworks 第10回 NavigationBar / ナビゲーションバー

 EmulatorでNavigationBarを表示する

0 件のコメント:

コメントを投稿