Table of Contents
Cocos2d-x の最新版(v3.13.1)でAndroidアプリを作成すると、今までのバージョンではデフォルトで表示されていたナビゲーションバーが非表示に変更されていることに気づきました。
どうやらv3.12からナビゲーションバー非表示がデフォルトとなったようです。これを以前のように表示するための修正方法を解説します。
AndroidManifest.xmlからでは変更できない
今回の変更は、AndroidManifest.xmlで activity のプロパティを変更しても修正することができません。
以下のように configChanges に keyboardHidden などを設定しても無視されます。
<activity android:name="org.cocos2dx.javascript.AppActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:configChanges="orientation|keyboardHidden|screenSize">
このため、Cocos2d-xのソースの一部を書き換える必要があります。
Cocos2dxActivity.javaを編集する
最新のCocos2d-xで画面構成を制御しているのは Cocos2dxActivity.java の中の hideVirtualButton というメソッドです。
このファイルの場所は、例えば以下のようになります。
[プロジェクト名]/frameworks/cocos2d-x/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java
問題のメソッドは hideVirtualButton という名前で、その中身は以下のようになっています。SDKのバージョンが19以上である場合にレイアウトの制御などを行うようです。
protected void hideVirtualButton() {
if (Build.VERSION.SDK_INT >= 19) {
// use reflection to remove dependence of API level
Class viewClass = View.class;
final int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = Cocos2dxReflectionHelper.<Integer>getConstantValue(viewClass, "SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION");
final int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = Cocos2dxReflectionHelper.<Integer>getConstantValue(viewClass, "SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN");
final int SYSTEM_UI_FLAG_HIDE_NAVIGATION = Cocos2dxReflectionHelper.<Integer>getConstantValue(viewClass, "SYSTEM_UI_FLAG_HIDE_NAVIGATION");
final int SYSTEM_UI_FLAG_FULLSCREEN = Cocos2dxReflectionHelper.<Integer>getConstantValue(viewClass, "SYSTEM_UI_FLAG_FULLSCREEN");
final int SYSTEM_UI_FLAG_IMMERSIVE_STICKY = Cocos2dxReflectionHelper.<Integer>getConstantValue(viewClass, "SYSTEM_UI_FLAG_IMMERSIVE_STICKY");
final int SYSTEM_UI_FLAG_LAYOUT_STABLE = Cocos2dxReflectionHelper.<Integer>getConstantValue(viewClass, "SYSTEM_UI_FLAG_LAYOUT_STABLE");
// getWindow().getDecorView().setSystemUiVisibility();
final Object[] parameters = new Object[]{SYSTEM_UI_FLAG_LAYOUT_STABLE
| SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| SYSTEM_UI_FLAG_IMMERSIVE_STICKY};
Cocos2dxReflectionHelper.<Void>invokeInstanceMethod(getWindow().getDecorView(),
"setSystemUiVisibility",
new Class[]{Integer.TYPE},
parameters);
}
}
この中の parameters を変更することで、ナビゲーションバーやステータスバー、フルスクリーンの切り替えなどの設定が可能です。
今までのようにナビゲーションバーを表示させるには、SYSTEM_UI_FLAG_HIDE_NAVIGATION と SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION をコメントアウトします。上のソースでハイライトした行です。
SYSTEM_UI_FLAG_HIDE_NAVIGATION を無効にするとナビゲーションバーが表示されるようになりますが、同時に SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION を無効化しないと座標系がフルスクリーンのままになるため、画面下に配置したUIがナビゲーションバーの後ろに隠れてしまいます。
以上の2行をコメントアウトし、再ビルドするとナビゲーションバーが表示され以前のバージョンと同じようになります。

