某些设备上NavigationBar和StatusBar不完全透明。

8
我正在使用react-native写一个应用程序,试图在状态栏和导航栏后面显示内容。我通过添加一些代码styles.xml来解决了这个问题。这解决了我的问题,但最近我意识到它并不完全适用于所有设备。在我的Pixel 6上运行Android 12,状态栏和导航栏不是完全透明的。

透明状态栏

我尝试了Stack Overflow上提出的许多建议,但没有一个完全奏效。我甚至在本地android应用程序上成功实现了它,但在react-native应用程序中编写相同的代码却不起作用。

这是我目前在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 Pechanec
谢谢!你是对的,前两行是不必要的,但这并没有解决问题。在发布之前,我阅读了你发送的文章,但再次阅读让我意识到我做错了什么。 - Sead Smailagic
2个回答

8
我找到了解决这个问题的方法。正如Eugen Pechance所指出的,我原始的styles.xml文件中的前两行是不必要的。然而,导致半透明背景的主要原因是android:enforceStatusBarContrastandroid:enforceNavigationBarContrast这两行代码。Android强制执行对比度的方式是在状态栏和导航栏中添加半透明背景,这不是我认为它的工作方式。将这些值设置为false就可以解决问题。
此外,根据this文章,您应该向MainActivity.java添加以下行以使内容在状态栏和导航视图后面:
@Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
    WindowCompat.setDecorFitsSystemWindows(getWindow(), false);

    super.onCreate(savedInstanceState);
  }

确保覆盖正确的onCreate函数,因为在React Native中默认的重写函数不会被调用。

0
尝试在MainActivity.javaonCreate()中添加以下代码:
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);
    }

themes.xml 文件中,请确保父级不是任何 DarkActionBar!例如:

<style name="MyTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">

然后添加:

    <!-- Status bar color. -->
    <item name="android:statusBarColor" tools:targetApi="l">@android:color/transparent</item>
    <!-- Navigation Bar color. -->
    <item name="android:navigationBarColor" tools:targetApi="l">@android:color/transparent</item>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接