Скрытие панели навигации в чистом родном андроиде

Я видел статьи и статьи о сокрытии панели навигации для приложения Android через Java. Однако то, что я хотел бы знать, это Как убрать панель навигации через чистое приложение для Android c ++ для активного экрана для полноэкранного приложения (игры) (НИКАКОЙ JAVA ВСЕ!). Полноэкранный из манифеста Android работает при скрытии верхней панели, но панель навигации остается видимой.

Это Панель навигации что я хочу удалить.

Я безуспешно искал книги, нет реальной документации по native-активности, и поиск в Google ничего не дал. Внутри некоторых заголовочных файлов есть только комментарии, которые представляют собой крошечные комментарии, которые даже не помогают. Кажется, что тема, касающаяся чисто андроид приложений на с ++, является черным пятном, но многие игры, которые выходят на рынок, написаны на с ++.

Я также попытался установить:

AConfiguration_setNavHidden(m_app->config, ACONFIGURATION_NAVHIDDEN_YES);

Но, похоже, ничего не делает, на самом деле все AConfiguratin_setXXX кажется, ничего не делать. Возможно, я звоню не туда? Я звонил во время APP_CMD_INIT_WINDOW после создания окна. Где я должен вызывать эту функцию?

3

Решение

Так! Если кому-то интересно, я нашел ответ, покопавшись в одном из примеров чайника от 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 и настраивать его так же, как обычные нативные действия, но теперь он дает вам полный экран. Я надеюсь, что это помогает кому-то там. У меня ушло несколько дней на поиск ответов, и это то, что я мог придумать!

УДАЧИ!

4

Другие решения

Я нашел этот кусок кода, который работает (требуется уровень 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();
}
1

По вопросам рекламы [email protected]