The idea is to detect orientation dynamically and when it changes - restart the App so that B4XPages is initialized with the new orientation.
The App state can be saved and reloaded.
Update: It is tested with Android 11 but there may be problems under Android 12, I am investigating.
Update: It is now tested with Android 12 and works fine.
https://www.b4x.com/android/forum/t...-8-it-works-in-android-7-0.136393/post-863493
The Main Module
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
The B4XMainPage Module
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
			
			The App state can be saved and reloaded.
Update: It is tested with Android 11 but there may be problems under Android 12, I am investigating.
Update: It is now tested with Android 12 and works fine.
https://www.b4x.com/android/forum/t...-8-it-works-in-android-7-0.136393/post-863493
The Main Module
			
				B4X:
			
		
		
		#Region  Project Attributes
    #ApplicationLabel: TestOrient
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified   'IMPORTANT
    #CanInstallToExternalStorage: False
#End Region
#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region
'#BridgeLogger: True
Sub Process_Globals
    Public ActionBarHomeClicked As Boolean
    Public MyAppState As Map
    Private accelerometer As PhoneSensors    'include Phone library
    Private accValues() As Float
    Private LastOrientation As Int
    Private checkOrientation As Timer
 
    Private rp As RuntimePermissions        'include RuntimePermissions library
    Private myDir As String
    Dim ser As B4XSerializator                'include RandomAccessFile library
End Sub
Sub Globals
End Sub
Sub Activity_Create(FirstTime As Boolean)
    MyAppState.Initialize
    myDir = rp.GetSafeDirDefaultExternal("")
    If FirstTime = False Then MyAppState = ser.ConvertBytesToObject(File.ReadBytes(myDir, "MyAppState.dat"))
    Dim ph As Phone
    Dim orientation As String = "Landscape"
    If Activity.width < Activity.Height Then
        ph.SetScreenOrientation(7)
        LastOrientation = 7
        orientation = "portrait"
    Else
        ph.SetScreenOrientation(6)
        LastOrientation = 6
    End If
    Log("Activity started with orientation: " & orientation)
    accelerometer.Initialize(accelerometer.TYPE_ACCELEROMETER)
    checkOrientation.Initialize("chkOrient", 333)
    checkOrientation.Enabled = True
    Dim pm As B4XPagesManager
    pm.Initialize(Activity)
End Sub
Sub chkOrient_Tick
    accelerometer.StartListening("Accelerometer")
    Sleep(300)
    accelerometer.StopListening
End Sub
'The method for sensing orientation change is extracted from @emexes:
'https://www.b4x.com/android/forum/t...-with-portrait-orientation.106872/post-669094
Private Sub Accelerometer_SensorChanged (Values() As Float)
    checkOrientation.Enabled = False
    accValues = Values
    Dim X As Float = accValues(0)
    Dim Y As Float = accValues(1)
    Dim ThisOrientation As Int = LastOrientation
    If Abs(Y) > 7 Then ThisOrientation = 7
    If Abs(X) > 7 Then ThisOrientation = 6
    If ThisOrientation <> LastOrientation Then
        File.WriteBytes(myDir, "MyAppState.dat", ser.ConvertObjectToBytes(MyAppState))
        Activity.Finish
        StartActivity(Me)
        LastOrientation = ThisOrientation
    Else
        checkOrientation.Enabled = True
    End If
End Sub
'Template version: B4A-1.01
#Region Delegates
Sub Activity_ActionBarHomeClick
    ActionBarHomeClicked = True
    B4XPages.Delegate.Activity_ActionBarHomeClick
    ActionBarHomeClicked = False
End Sub
Sub Activity_KeyPress (KeyCode As Int) As Boolean
    Return B4XPages.Delegate.Activity_KeyPress(KeyCode)
End Sub
Sub Activity_Resume
    B4XPages.Delegate.Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
    B4XPages.Delegate.Activity_Pause
End Sub
Sub Activity_PermissionResult (Permission As String, Result As Boolean)
    B4XPages.Delegate.Activity_PermissionResult(Permission, Result)
End Sub
Sub Create_Menu (Menu As Object)
    B4XPages.Delegate.Create_Menu(Menu)
End Sub
#if Java
public boolean _onCreateOptionsMenu(android.view.Menu menu) {
     processBA.raiseEvent(null, "create_menu", menu);
     return true;
 
}
#End If
#End Region
'Program code should go into B4XMainPage and other pages.The B4XMainPage Module
			
				B4X:
			
		
		
		#Region Shared Files
#CustomBuildAction: folders ready, %WINDIR%\System32\Robocopy.exe,"..\..\Shared Files" "..\Files"
'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True
#End Region
'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Private Label1 As Label
End Sub
Public Sub Initialize
End Sub
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
 
    If Main.MyAppState.size = 0 Then            'The first orientation
        Main.MyAppState.Put("OrientationCount", 1)
    Else
        Main.MyAppState.Put("OrientationCount", 1 + Main.MyAppState.Get("OrientationCount"))
    End If
    Label1.Text = IIf(Root.Width>Root.Height, "Now Landscape", "Now Portrait") & " Change # " & Main.MyAppState.Get("OrientationCount").As(Int)
End SubAttachments
			
				Last edited: 
			
		
	
							 
				 
 
		 
 
		 
 
		