Не удалось заставить Surface Duo использовать оба экрана с помощью Xamarin
Я пытаюсь создать проект Xamarin Forms для Surface Duo. Проект выполняется, но оба экрана не используются. Я выполнил шаги в Xamarin для Surface Duo - Dual-screen | Документы Microsoft:
Обновлен указатель на SDK.
Добавлено
Xamarin.Forms.DualScreen.DualScreenService.Init(this);
кmainactivity.cs
.Изменен аббрибьют Activity, чтобы включить:
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.UiMode
.Включен пакет Xamarin.DuoSdk в приложение для Android.
Во время чтения вывода эмулятора в одной строке рекомендовалось отключить Hyper-V с помощью команды bcdedit, что я и сделал.
Выбрано
<build>
(Android 10.0 - API 29)
Я загрузил некоторые образцы (Sketch 360 и демонстрации с двумя экранами), но не смог заставить их использовать оба экрана. Я запустил демонстрационные версии, опубликованные на Get, и обновил пакеты, но безуспешно. Я проверил настройки телефона в эмуляторе, чтобы узнать, есть ли настройка для включения обоих экранов, но ничего не нашел. В выводе эмулятора есть некоторые ошибки, предупреждения, но не знаю, как их исправить.
Выход эмулятора
emulator: Silencing all qWarning(); use qCWarning(...) instead: QT_LOGGING_RULES=default.warning=false
Failed to open /qemu.conf, err: 2
emulator: INFO: QtLogger.cpp:68: Critical: UpdateLayeredWindowIndirect failed for ptDst=(1283, 327), size=(700x21), dirty=(700x108 0, 0) (A device attached to the system is not functioning.) ((null):0, (null))
emulator: INFO: QtLogger.cpp:68: Critical: UpdateLayeredWindowIndirect failed for ptDst=(1283, 327), size=(700x21), dirty=(700x21 0, 0) (A device attached to the system is not functioning.) ((null):0, (null))
emulator: INFO: QtLogger.cpp:68: Critical: Uncaught TypeError: Cannot read property 'update' of undefined (qrc:/html/js/location-mock-web-channel.js:130, (null))
Сборка вывода
System.InvalidCastException: Unable to cast object of type 'Mono.Debugger.Soft.PointerValue' to type 'Mono.Debugger.Soft.PrimitiveValue'.
System.InvalidCastException: Unable to cast object of type 'Mono.Debugger.Soft.PointerValue' to type 'Mono.Debugger.Soft.PrimitiveValue'.
System.InvalidCastException: Unable to cast object of type 'Mono.Debugger.Soft.PointerValue' to type 'Mono.Debugger.Soft.PrimitiveValue'.
02-06 20:34:52.574 W/libc ( 3873): Unable to set property "qemu.gles" to "1": connection failed; errno=13 (Permission denied)
02-06 20:34:54.961 W/OpenGLRenderer( 3873): Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
2 ответа
Если вы спрашиваете, как заставить приложение использовать оба экрана программно, а не пользователь, выполняющий действие после запуска приложения, это невозможно.
Смотрите пояснения здесь:https://docs.microsoft.com/en-us/dual-screen/introduction
Когда пользователь запускает приложение, его основное окно открывается в развернутом виде и занимает всю ширину и высоту одного экрана.
Пользователь несет ответственность за охват приложения, это не состояние, в которое приложение входит программно.
Пользователи всегда контролируют ситуацию: чтобы избежать непредсказуемых (или потенциально разрушительных) действий для ваших пользователей, приложения не должны автоматически переходить в составное состояние без преднамеренного действия, инициированного пользователем. Пусть решает пользователь.
Запустите
Surface Duo Emulator for Visual Studio
чтобы запустить эмулятор Surface Duo. Если у вас есть какие-либо проблемы с эмулятором, вы можете устранить неполадки по ссылке ниже. https://docs.microsoft.com/en-us/dual-screen/xamarin/use-emulator?tabs=windows#update-the-pointer-to-your-android-sdk
Установите пакет через NuGet.
Xamarin.Forms.DualScreen
: https://www.nuget.org/packages/Xamarin.Forms.DualScreen
Используйте xaml, как показано ниже.
<dualScreen:TwoPaneView>
<dualScreen:TwoPaneView.Pane1>
<StackLayout>
<Label Text="Pane1 Content" />
</StackLayout>
</dualScreen:TwoPaneView.Pane1>
<dualScreen:TwoPaneView.Pane2>
<StackLayout>
<Label Text="Pane2 Content" />
</StackLayout>
</dualScreen:TwoPaneView.Pane2>
</dualScreen:TwoPaneView>
Запустите проект с эмулятором
<build> (Android 10.0 – API 29)