Я видел статьи и статьи о сокрытии панели навигации для приложения Android через Java. Однако то, что я хотел бы знать, это Как убрать панель навигации через чистое приложение для Android c ++ для активного экрана для полноэкранного приложения (игры) (НИКАКОЙ JAVA ВСЕ!). Полноэкранный из манифеста Android работает при скрытии верхней панели, но панель навигации остается видимой.
Это Панель навигации что я хочу удалить.
Я безуспешно искал книги, нет реальной документации по native-активности, и поиск в Google ничего не дал. Внутри некоторых заголовочных файлов есть только комментарии, которые представляют собой крошечные комментарии, которые даже не помогают. Кажется, что тема, касающаяся чисто андроид приложений на с ++, является черным пятном, но многие игры, которые выходят на рынок, написаны на с ++.
Я также попытался установить:
AConfiguration_setNavHidden(m_app->config, ACONFIGURATION_NAVHIDDEN_YES);
Но, похоже, ничего не делает, на самом деле все AConfiguratin_setXXX кажется, ничего не делать. Возможно, я звоню не туда? Я звонил во время APP_CMD_INIT_WINDOW после создания окна. Где я должен вызывать эту функцию?
Так! Если кому-то интересно, я нашел ответ, покопавшись в одном из примеров чайника от Microsoft. И вот что я придумал:
public class NameOfActivity extends NativeActivity {
void setImmersiveSticky() {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
int SDK_INT = android.os.Build.VERSION.SDK_INT;
if (SDK_INT >= 19) {
setImmersiveSticky();
View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener
(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
setImmersiveSticky();
}
});
}
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
//Hide toolbar
int SDK_INT = android.os.Build.VERSION.SDK_INT;
if (SDK_INT >= 11 && SDK_INT < 14) {
getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_HIDDEN);
} else if (SDK_INT >= 14 && SDK_INT < 19) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE);
} else if (SDK_INT >= 19) {
setImmersiveSticky();
}
super.onResume();
}
}
Чистая разработка на С ++ для Android по-прежнему использует Java, она получает его из исходного кода в каталоге Android SDK. Что вы можете сделать, это расширить NativeActivity с помощью нескольких дополнительных настроек. Все, что вам нужно сделать внутри манифеста:
android:hasCode="true"
а затем самая важная часть состоит в том, чтобы изменить название деятельности с
android:name="android.app.NativeActivity"
в
android:name="com.example.package.NameOfActivity"
Он по-прежнему будет вызывать андроид main и настраивать его так же, как обычные нативные действия, но теперь он дает вам полный экран. Я надеюсь, что это помогает кому-то там. У меня ушло несколько дней на поиск ответов, и это то, что я мог придумать!
УДАЧИ!
Я нашел этот кусок кода, который работает (требуется уровень API> 19). Просто вызовите функцию в начале main ().
void AutoHideNavBar(struct android_app* state)
{
JNIEnv* env{};
state->activity->vm->AttachCurrentThread(&env, NULL);
jclass activityClass = env->FindClass("android/app/NativeActivity");
jmethodID getWindow = env->GetMethodID(activityClass, "getWindow", "()Landroid/view/Window;");
jclass windowClass = env->FindClass("android/view/Window");
jmethodID getDecorView = env->GetMethodID(windowClass, "getDecorView", "()Landroid/view/View;");
jclass viewClass = env->FindClass("android/view/View");
jmethodID setSystemUiVisibility = env->GetMethodID(viewClass, "setSystemUiVisibility", "(I)V");
jobject window = env->CallObjectMethod(state->activity->clazz, getWindow);
jobject decorView = env->CallObjectMethod(window, getDecorView);
jfieldID flagFullscreenID = env->GetStaticFieldID(viewClass, "SYSTEM_UI_FLAG_FULLSCREEN", "I");
jfieldID flagHideNavigationID = env->GetStaticFieldID(viewClass, "SYSTEM_UI_FLAG_HIDE_NAVIGATION", "I");
jfieldID flagImmersiveStickyID = env->GetStaticFieldID(viewClass, "SYSTEM_UI_FLAG_IMMERSIVE_STICKY", "I");
const int flagFullscreen = env->GetStaticIntField(viewClass, flagFullscreenID);
const int flagHideNavigation = env->GetStaticIntField(viewClass, flagHideNavigationID);
const int flagImmersiveSticky = env->GetStaticIntField(viewClass, flagImmersiveStickyID);
const int flag = flagFullscreen | flagHideNavigation | flagImmersiveSticky;
env->CallVoidMethod(decorView, setSystemUiVisibility, flag);
state->activity->vm->DetachCurrentThread();
}