我正在使用react-native编写一个应用程序,并且我试图在状态栏和导航栏后面显示内容。我通过添加一些代码成功解决了这个问题
styles.xml
。这设法解决了我的问题,但我最近意识到它并不完全适用于所有设备。在我的 Pixel 6
运行 Android 12
上,状态栏和导航栏不是完全透明的。
我尝试了 Stack Overflow 上建议的许多方法,但没有一个完全有效。我什至设法让它在原生 Android 应用程序上运行,但在反应原生应用程序中编写相同的代码不起作用。
这是我目前在我的
styles.xml
中的代码:
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:enforceStatusBarContrast" tools:targetApi="q">true</item>
<item name="android:enforceNavigationBarContrast" tools:targetApi="q">true</item>
我找到了解决这个问题的方法。正如 Eugen Pechance 指出的那样,我原来的
styles.xml
的前两行是不必要的。然而,造成半透明背景的主要原因是android:enforceStatusBarContrast
和android:enforceNavigationBarContrast
线。 Android 强制实施对比的方式是向状态栏和导航栏添加半透明背景,这不是我认为的工作方式。将这些值设置为 false
就可以了。
此外,根据 this 文章,您应该将以下行添加到
MainActivity.java
获取位于状态和导航视图后面的内容:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
super.onCreate(savedInstanceState);
}
确保覆盖正确的
onCreate
函数,因为 React Native 中默认的覆盖函数不会被调用。
尝试在
MainActivity.java
内添加以下代码:onCreate()
并在
Window w = getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
文件上确保父级是
不是任何 DarkActionBar!例如:
themes.xml
然后添加:
<style name="MyTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
这可以工作,但是在添加这个干净的 gradlew 并再次构建之后。