在纯 android 原生中隐藏导航栏
Hiding the navigation bar in pure android native
我通过java看过文章和关于隐藏android应用程序导航栏的文章。但是,我想知道的是,如何通过纯 android c++ native-activity 全屏应用程序(游戏)删除导航栏(否JAVA 完全没有!)。 android 清单中的全屏可以隐藏顶部栏,但导航栏保持可见。
这是我要删除的 Navigation Bar。
我搜索了很多书但没有成功,没有关于 native-activity 和 google 搜索结果的实际文档。只有一些头文件中的注释是微小的注释,甚至没有帮助。看来关于纯c++应用的话题android是个黑点,但市面上很多游戏都是用c++写的。
我也试过设置:
AConfiguration_setNavHidden(m_app->config, ACONFIGURATION_NAVHIDDEN_YES);
但是好像什么都不做,实际上所有的AConfiguratin_setXXX好像什么都不做。也许我在错误的地方称呼它?在创建 window 之后,我一直在 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();
}
}
纯c++android开发依然使用java,是从androidSDK目录下的源码中获取。您可以做的是通过一些额外的调整来扩展 NativeActivity。在清单中,您所要做的就是:
android:hasCode="true"
然后最重要的部分是将 activity 名称从
更改
android:name="android.app.NativeActivity"
到
android:name="com.example.package.NameOfActivity"
它仍然会调用 android main 并像普通的本机 activity 一样设置它,但现在它给你一个完全全屏的。我希望这可以帮助那里的人。我花了几天时间寻找答案,这就是我能想到的!
祝你好运!
我发现这段代码有效(需要 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();
}
我通过java看过文章和关于隐藏android应用程序导航栏的文章。但是,我想知道的是,如何通过纯 android c++ native-activity 全屏应用程序(游戏)删除导航栏(否JAVA 完全没有!)。 android 清单中的全屏可以隐藏顶部栏,但导航栏保持可见。
这是我要删除的 Navigation Bar。
我搜索了很多书但没有成功,没有关于 native-activity 和 google 搜索结果的实际文档。只有一些头文件中的注释是微小的注释,甚至没有帮助。看来关于纯c++应用的话题android是个黑点,但市面上很多游戏都是用c++写的。
我也试过设置:
AConfiguration_setNavHidden(m_app->config, ACONFIGURATION_NAVHIDDEN_YES);
但是好像什么都不做,实际上所有的AConfiguratin_setXXX好像什么都不做。也许我在错误的地方称呼它?在创建 window 之后,我一直在 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();
}
}
纯c++android开发依然使用java,是从androidSDK目录下的源码中获取。您可以做的是通过一些额外的调整来扩展 NativeActivity。在清单中,您所要做的就是:
android:hasCode="true"
然后最重要的部分是将 activity 名称从
更改 android:name="android.app.NativeActivity"
到
android:name="com.example.package.NameOfActivity"
它仍然会调用 android main 并像普通的本机 activity 一样设置它,但现在它给你一个完全全屏的。我希望这可以帮助那里的人。我花了几天时间寻找答案,这就是我能想到的!
祝你好运!
我发现这段代码有效(需要 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();
}