Блокировка ориентации экрана не работает в React Native 0.82.1 (новая архитектура/без моста) - AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Блокировка ориентации экрана не работает в React Native 0.82.1 (новая архитектура/без моста) - Android

Сообщение Anonymous »

Описание
Я не могу программно заблокировать или изменить ориентацию экрана на Android. Я боролся с этим уже несколько дней. Такие вызовы, как lockTo(portrait) или lockTo(landscape), не имеют абсолютно никакого эффекта — экран независимо вращается свободно.
Сначала я использовал response-native-orientation-locker (v1.7.0), но поскольку эта библиотека не обновлялась 2 года и не поддерживает TurboModules/Bridgeless, я переключился на response-native-orientation-director (v2.6.5), который утверждает, что поддерживает новую архитектуру. Ни одна библиотека не работает.
У меня есть старый проект на RN 0.80.1, где React-native-orientation-locker работает отлично. Единственное существенное отличие заключается в том, что RN 0.82 обеспечивает режим без моста.
Окружающая среда

Код: Выделить всё

System:
OS: Windows 11 10.0.26200
CPU: (16) x64 11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz
Binaries:
Node: 24.11.0
npm: 11.6.1
IDEs:
Android Studio: AI-252.25557.131.2521.14344949
Languages:
Java: 17.0.16
npmPackages:
react: 19.1.1
react-native: 0.82.1
react-native-orientation-director: 2.6.5
Android:
hermesEnabled: true
newArchEnabled: true
gradle.properties

Код: Выделить всё

org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
android.useAndroidX=true
reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
newArchEnabled=true
hermesEnabled=true
edgeToEdgeEnabled=false
AndroidManifest.xml Примечание. Я намеренно удалил android:screenOrientation="portrait" из манифеста, чтобы библиотека могла программно управлять ориентацией.
MainActivity.kt

Код: Выделить всё

package com.pgustav2

import android.content.Intent
import android.content.res.Configuration
import com.facebook.react.ReactActivity
import com.facebook.react.ReactActivityDelegate
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
import com.facebook.react.defaults.DefaultReactActivityDelegate
import com.orientationdirector.implementation.ConfigurationChangedBroadcastReceiver

class MainActivity : ReactActivity() {

override fun getMainComponentName(): String = "PgUstaV2"

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

override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)

val orientationDirectorCustomAction =
"${packageName}.${ConfigurationChangedBroadcastReceiver.CUSTOM_INTENT_ACTION}"

val intent = Intent(orientationDirectorCustomAction).apply {
putExtra("newConfig", newConfig)
setPackage(packageName)
}

this.sendBroadcast(intent)
}
}
MainApplication.kt

Код: Выделить всё

package com.pgustav2

import android.app.Application
import com.facebook.react.PackageList
import com.facebook.react.ReactApplication
import com.facebook.react.ReactHost
import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost

class MainApplication : Application(), ReactApplication {

override val reactHost: ReactHost by lazy {
getDefaultReactHost(
context = applicationContext,
packageList =
PackageList(this).packages.apply {
},
)
}

override fun onCreate() {
super.onCreate()
loadReactNative(this)
}
}
Использование JavaScript (App.tsx)

Код: Выделить всё

import RNOrientationDirector, { Orientation } from 'react-native-orientation-director';

const App = () => {
useEffect(() => {
RNOrientationDirector.lockTo(Orientation.portrait);
}, []);

return (
// ... app content
);
};
Что я пробовал
  • Код: Выделить всё

    react-native-orientation-locker
    v1.7.0[/b] — Не работает. Подтверждено, что getCurrentActivity(), скорее всего, вернет значение null в режиме без моста (RN 0.82).
  • Код: Выделить всё

    react-native-orientation-director
    v2.6.5[/b] — устанавливается в качестве замены, заявлена ​​поддержка новой архитектуры. Все равно не работает.
  • Код: Выделить всё

    android:screenOrientation="portrait"
    в манифесте[/b] — работает как жестко запрограммированная блокировка, но предотвращает любые программные изменения ориентации (невозможно переключиться на альбомную ориентацию для экранов WebView).
  • Код: Выделить всё

    registerActivityLifecycleCallbacks(OrientationActivityLifecycle.getInstance())
    [/b] в MainApplication — пробовал использовать блокировщик ориентации, без эффекта.
  • Удаление android:resizeableActivity="false" — без эффекта.
  • Чистые сборки (

    Код: Выделить всё

    ./gradlew clean
    ) после каждого встроенного изменения.
  • Оба шаблоны реагирования и реагирования в MainApplication — попробовал оба, никакой разницы.
Сравнение рабочих проектов
У меня есть более старый проект на React Native 0.80.1, где React-native-orientation-locker v1.7.0 работает отлично. Ключевые отличия:
  • RN 0.80.1 по-прежнему имеет старый мост, доступный наряду с новой архитектурой.
  • MainApplication использует как actNativeHost (DefaultReactNativeHost), так и actHost
  • RN 0.82+ обеспечивает режим без моста без старого моста. запасной вариант
Ожидаемое поведение

Код: Выделить всё

RNOrientationDirector.lockTo(Orientation.portrait)
должен заблокировать экран в портретном режиме. lockTo(Orientation.landscape) должен поворачиваться в альбомную ориентацию.
Фактическое поведение
Все вызовы блокировки ориентации игнорируются. Экран свободно вращается в зависимости от физической ориентации устройства.
Вопрос
Кто-нибудь успешно использовал любую библиотеку блокировки ориентации с React Native 0.82+ (только без моста/новая архитектура) на Android? Что мне не хватает?

Подробнее здесь: https://stackoverflow.com/questions/798 ... rchitectur
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»