Изменение ориентации конкретной страницы в Android
Я работаю над приложением для Android в Qt и C++. Все мое приложение имеет книжную ориентацию. Но когда я играю видео, я хочу изменить ориентацию на альбомную, и после окончания видео она должна снова измениться на книжную.
Таким образом, вопрос в том, как можно настроить экран на альбомный или портретный режим в приложении Qt/C++ для Android.
2 ответа
Ориентация экрана на Android может быть изменена с помощью setRequestedOrientation
Java-функция, поэтому вы должны вызывать Java-функцию из вашего приложения. Для запуска кода Java в вашем приложении Qt Android вы должны использовать модуль Qt Android Extras, который содержит дополнительные функциональные возможности для разработки на Android.
Вы можете использовать JNI для вызова функции Java из C/C++ или для обратного вызова функции C/C++ из Java.
Здесь вы можете использовать его в статическом Java-методе, например:
package com.MyApp;
public class OrientationChanger
{
public static int change(int n)
{
switch(n)
{
case 0:
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case 1:
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
}
}
}
Сначала вам нужно добавить это в ваш.pro файл:
QT += androidextras
И включите соответствующий заголовочный файл:
#include <QAndroidJniObject>
Затем вы можете вызвать эту статическую функцию Java из вашего кода C++.
Чтобы изменить ориентацию на ландшафтный режим:
bool retVal = QAndroidJniObject::callStaticMethod<jint>
("com/MyApp/OrientationChanger" // class name
, "change" // method name
, "(I)I" // signature
, 0);
Чтобы изменить ориентацию на портретный режим:
bool retVal = QAndroidJniObject::callStaticMethod<jint>
("com/MyApp/OrientationChanger" // class name
, "change" // method name
, "(I)I" // signature
, 1);
Вам не нужно вызывать его через код Java. Вы можете напрямую вызвать его из C++, используя JNI следующим образом:
void MyAndroidHelperClass::setScreenOrientation(int orientation)
{
QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
if ( activity.isValid() )
{
activity.callMethod<void>
("setRequestedOrientation" // method name
, "(I)V" // signature
, orientation);
}
}