React Native Bootsplash вызывает появление нижней панели на Android, но не на iOS.

Вопрос или проблема

Я использую React Native Bootsplash в своем проекте. Заставка работает отлично на iOS, но я столкнулся с проблемой на Android. В частности, при запуске приложения на Android на экране появляется нижняя панель, которая не отображается на iOS.

Вот соответствующий код в MainActivity.kt:

package com.packageName

import com.facebook.react.ReactActivity
import com.facebook.react.ReactActivityDelegate
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
import com.facebook.react.defaults.DefaultReactActivityDelegate
import android.os.Bundle
import com.zoontek.rnbootsplash.RNBootSplash

class MainActivity : ReactActivity() {

    override fun getMainComponentName(): String = "packageName"

    override fun createReactActivityDelegate(): ReactActivityDelegate =
        DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)

    override fun onCreate(savedInstanceState: Bundle?) {
        RNBootSplash.init(this, R.style.BootTheme) // ⬅️ инициализация заставки
        super.onCreate(null) // super.onCreate(null) с react-native-screens 
    }
}

Вот мой styles.xml (android -> src -> main -> res -> values -> styles.xml)

<resources>

    <!-- Базовая тема приложения. -->
    <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
        <!-- Настройте свою тему здесь. -->
        <item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
        <item name="android:forceDarkAllowed">false</item>
    </style>

    <!-- BootTheme должен наследоваться от Theme.BootSplash или Theme.BootSplash.EdgeToEdge -->
    <style name="BootTheme" parent="Theme.BootSplash">
        <item name="bootSplashBackground">@color/bootsplash_background</item>
        <item name="bootSplashLogo">@mipmap/bootsplash_logo</item>
        <item name="postBootSplashTheme">@style/AppTheme</item>
    </style>


</resources>


изображение с проблемой

Моя конфигурация:
Версия React Native: 0.74.1
React Native Bootsplash: 6.3.1

Когда я удаляю функцию onCreate из MainActivity.kt, нижняя панель исчезает, но тогда, конечно, заставка больше не работает должным образом.

Я также пытался упростить компонент после заставки, чтобы изолировать проблему. Вот код, который я тестировал:

файл index.js

const Comp = () => {
  BootSplash.hide({fade: true});
  return <View style={{flex: 1, backgroundColor: 'red'}}></View>;
};

// AppRegistry.registerComponent(appName, () => App);
AppRegistry.registerComponent(appName, () => Comp)

Я видел предложения, указывающие на то, что это может быть связано с правилами “safe-area-inset-*” или поведением макета. К сожалению, я не могу подключить отладчик, чтобы напрямую проверить детали рендеринга. Я также протестировал на физном устройстве Android, чтобы исключить проблемы рендеринга, специфичные для симулятора, но проблема остается.

Если я удаляю

<item name="bootSplashBackground">@color/bootsplash_background</item>
<item name="bootSplashLogo">@mipmap/bootsplash_logo</item>
<item name="postBootSplashTheme">@style/AppTheme</item>

из styles.xml (android -> src -> main -> res -> values -> styles.xml), мой экран выглядит как изображение.
Внизу, где появляется отступ, мы можем видеть часть BootSplash.

Я также протестировал на физном устройстве Android, чтобы исключить проблемы рендеринга, специфичные для симулятора, но проблема остается.

Эта проблема распространена с React Native BootSplash на Android и обычно возникает из-за того, как BootTheme настроен в styles.xml и, возможно, как система обрабатывает инклюзии или безопасные области на Android. Давайте пройдемся по нескольким шагам по устранению неполадок и рекомендациям, чтобы решить проблему с нижней панелью и инклюзиями.

  1. Используйте Theme.BootSplash.EdgeToEdge
    Вы используете Theme.BootSplash как родительский для BootTheme. Переключитесь на Theme.BootSplash.EdgeToEdge, который предназначен для обработки полноэкранных приложений на Android, расширяя содержимое от края до края, особенно в случаях, когда видны инклюзии макета (строка состояния, навигационная панель).

Измените это в styles.xml:

<style name="BootTheme" parent="Theme.BootSplash.EdgeToEdge">
    <item name="bootSplashBackground">@color/bootsplash_background</item>
    <item name="bootSplashLogo">@mipmap/bootsplash_logo</item>
    <item name="postBootSplashTheme">@style/AppTheme</item>
</style>
  1. Настройте макет MainActivity
    Иногда добавление WindowCompat.setDecorFitsSystemWindows(window, false) в MainActivity.kt может помочь устранить отступы, которые могут возникнуть из-за системных инклюзий. Эта строка кода указывает Android игнорировать системные инклюзии (например, нижнюю панель) и позволяет содержимому полностью расширяться до краев экрана.

Добавьте это в ваш onCreate метод:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(null)
    WindowCompat.setDecorFitsSystemWindows(window, false)
    RNBootSplash.init(this, R.style.BootTheme)
}

Это часто может решить проблемы с отступами макета.

  1. Проверьте безопасные области или инклюзии
    Если вы используете какие-либо SafeAreaView или аналогичные инклюзии в ваших компонентах React Native, проверьте, что они не применяют дополнительные отступы или маргины к макету после скрытия заставки. Это обычно будет видно в вашем макете основного компонента, что может влиять на видимую область.

  2. Проверьте полноэкранные флаги на Android
    Другой подход – установить приложение в полноэкранный режим, изменив флаги макета напрямую. Чтобы убедиться, что заставка и последующие экраны занимают весь экран, используйте эти флаги в MainActivity.kt:

Добавьте это после RNBootSplash.init(...):

window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
                                      View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
                                      View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
                                      View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
                                      View.SYSTEM_UI_FLAG_FULLSCREEN or
                                      View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY

Это должно гарантировать, что ваша заставка отображается без какой-либо дополнительной нижней панели или отступов.

  1. Очистите и пересоберите
    После внесения этих изменений очистите кеш сборки и пересоберите проект:

    cd android && ./gradlew clean
    cd .. && npx react-native run-android

  • Используйте Theme.BootSplash.EdgeToEdge в styles.xml.
  • Добавьте WindowCompat.setDecorFitsSystemWindows(window, false) в MainActivity.kt.
  • Убедитесь, что нет компонентов SafeAreaView или Insets, которые вызывают дополнительные отступы.
  • При необходимости установите полноэкранные флаги в MainActivity.kt.

Это должно помочь

Ответ или решение

Проблема с появлением нижней панели в React Native Bootsplash на Android: Полное руководство по решению

Введение

В процессе разработки мобильных приложений на React Native, многие разработчики сталкиваются с проблемами, связанными с адаптацией интерфейсов для разных платформ. Ваша ситуация с использованием React Native Bootsplash и появлением нижней панели на Android, в то время как на iOS всё работает без нареканий, действительно распространена. В данном руководстве мы разберём основные причины этой проблемы и предложим эффективные решения.

Причина проблемы

Проблема с появлением нижней панели на Android часто связана с настройками стилей и поведением макетов в React Native. Это может включать в себя обработки системных отступов, таких как статус-бар и навигационная панель.

Решения

1. Измените тему на Edge-to-Edge

Первая рекомендация заключается в том, чтобы изменить родительскую тему BootTheme. В вашем случае вы используете Theme.BootSplash. Если вы хотите, чтобы ваше приложение растягивалось по всей ширине и высоте экрана, переключитесь на Theme.BootSplash.EdgeToEdge.

Измените styles.xml:

<style name="BootTheme" parent="Theme.BootSplash.EdgeToEdge">
    <item name="bootSplashBackground">@color/bootsplash_background</item>
    <item name="bootSplashLogo">@mipmap/bootsplash_logo</item>
    <item name="postBootSplashTheme">@style/AppTheme</item>
</style>

2. Настройки MainActivity

Ваша MainActivity.kt также нуждается в некоторых изменениях. Добавление WindowCompat.setDecorFitsSystemWindows(window, false) может помочь устранить дополнительные отступы, вызванные системными элементами интерфейса.

Обновите метод onCreate:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(null)
    WindowCompat.setDecorFitsSystemWindows(window, false)
    RNBootSplash.init(this, R.style.BootTheme)
}

3. Проверка SafeAreaViews

Если вы используете компоненты SafeAreaView или аналогичные в своих React Native компоненте, убедитесь, что они не добавляют дополнительные отступы или маргины к вашему макету после скрытия сплэш-экрана. Это может повлиять на видимую область вашего приложения.

4. Установка флагов полноэкранного режима

Еще одно решение – установить флаги полноэкранного режима, чтобы убедиться, что сплэш-экран и последующие экраны занимают весь экран.

Добавьте следующие флаги в MainActivity.kt:

window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
                                      View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
                                      View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
                                      View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
                                      View.SYSTEM_UI_FLAG_FULLSCREEN or
                                      View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY

5. Очистка и пересборка проекта

После внесения изменений важно очистить кэш сборки и пересобрать проект. Для этого выполните следующие команды:

cd android && ./gradlew clean
cd .. && npx react-native run-android

Заключение

Следуя этим шагам, вы должны решить проблему с нижней панелей на Android при использовании React Native Bootsplash. Основная идея заключается в том, чтобы убедиться, что темы и параметры окна используются правильно для достижения полного экрана. Это позволит вам избежать подобных проблем на будущее.

Если у вас возникли дополнительные вопросы или вы столкнулись с новыми трудностями, не стесняйтесь обращаться за помощью в сообщество разработчиков. Успехов в вашей разработке!

Оцените материал
Добавить комментарий

Капча загружается...