如何在 React Native 中隐藏 Android 导航栏?
我指的是屏幕底部带有软件返回按钮和主页按钮的那个条形栏,而不是随着导航器组件一起出现在页面顶部的组件。
这篇 Android 官方文档 解释了如何在原生开发中实现隐藏。有人可以解释一下如何通过 React Native 应用程序实现吗?谢谢。
如何在 React Native 中隐藏 Android 导航栏?
我指的是屏幕底部带有软件返回按钮和主页按钮的那个条形栏,而不是随着导航器组件一起出现在页面顶部的组件。
这篇 Android 官方文档 解释了如何在原生开发中实现隐藏。有人可以解释一下如何通过 React Native 应用程序实现吗?谢谢。
如果你想永久实现这个效果,你需要在应用创建时和重新获得焦点时隐藏导航栏。
要这样做,请在你的MainActivity.java
中添加以下内容:
...
import android.os.Bundle;
import android.view.View;
public class MainActivity extends ReactActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
hideNavigationBar();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
hideNavigationBar();
}
}
private void hideNavigationBar() {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
}
你可能希望使其“沉浸式”,这样用户可以通过从屏幕底部拉动来访问导航栏。
要实现此功能,请添加View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
标志:
...
import android.os.Bundle;
import android.view.View;
public class MainActivity extends ReactActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
hideNavigationBar();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
hideNavigationBar();
}
}
private void hideNavigationBar() {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
您可以在Android文档中找到更多选项。
隐藏Android导航栏可以使用react-native-navigation-bar-color
,它允许你显示或隐藏导航栏。你可以在这里查看更多文档。请注意,它不会在Expo上工作,因为它需要链接本地代码。
安装非常简单:
npm install react-native-navigation-bar-color --save
那么你需要链接此包(仅适用于 react-native <= 0.59.0):
react-native link react-native-navigation-bar-color
import {
HideNavigationBar,
ShowNavigationBar,
} from 'react-native-navigation-bar-color';
然后,当您想要显示导航栏时,只需使用以下代码
ShowNavigationBar();
要隐藏它,可以使用以下方法:
HideNavigationBar();
在Martin Konicek的回答基础上:
我已经为你编写了所需的包和模块,链接如下:https://gist.github.com/dhrrgn/16a8dfa7581a682627c6
你需要将它添加到你的MainActivity.java
文件中的getPackages
方法,并像这样发送ReactActivity对象:new NavigationBarAndroidPackage(this)
注意:代码未经测试,但应该适用于你(你需要更改第一行的package
)。我只是使用你提供的链接中的示例代码作为示例。修改以符合你的需求。
我已经创建了一个包,可以隐藏/显示导航栏、改变颜色等功能。
react-native-system-navigation-bar
安装
yarn add react-native-system-navigation-bar
npm install react-native-system-navigation-bar
Links
https://www.npmjs.com/package/react-native-system-navigation-bar
https://github.com/kadiraydinli/react-native-system-navigation-bar
针对 Expo 构建:
expo install expo-navigation-bar
NavigationBar.setPositionAsync("absolute");
隐藏导航栏
NavigationBar.setVisibilityAsync("hidden");
透明背景
NavigationBar.setBackgroundColorAsync("#ffffff00");
用户仍然可以滑动屏幕以显示按钮
NavigationBar.setBehaviorAsync("inset-swipe");
我试图用<TouchableWithoutFeedback>
包装我的屏幕,以便能够使用onPress
属性和NavigationBar.setVisibilityAsync("hidden")
,但即使没有onPress
,底部导航栏在滑动时也只会显示一瞬间。
请使用以下代码:https://github.com/Anthonyzou/react-native-full-screen
用法:
import FullScreen from 'react-native-full-screen'
FullScreen.onFullScreen()
FullScreen.offFullScreen()
没有内置的API可以从JavaScript中完成这个任务。
好消息是,在React Native中,您可以通过编写本地模块将任何本地功能公开给JavaScript。请参见文档。
这样,您就可以提供一个JS函数,例如NavigationBarAndroid.hide()
,并使其调用您链接到的API。
我在Android 9上进行了测试
import {HideNavigationBar} from 'react-native-navigation-bar-color';
但是当使用Alt+Tab切换到另一个应用程序并返回时,导航栏会再次出现。
目前对我来说最好的解决方案就是如上所述
Louis Zawadzki
将其复制到我的mainactivity.java中可以很好地工作,并且在更改后始终隐藏。