Italian Problema su rotazione schermo

MAX_SV

Active Member
Licensed User
Longtime User
Ciao a tutti, sono nuovo della programmazione android, ma ho programmato in VB6 e vb.net, adesso volevo provare android .... sto realizzando un app per la visualizzazione di risultati sportivi rally, enduro ecc ...

Il programma è formato da 3 schermate (setting, risultati e info) la schermata principale è setting dove seleziono la specialità e l'anno, tramite un menù apro la schermata risultati e visualizzo le manifestazioni ecc... fin qui tutto bene il problema avviene quando ruoto lo schermo il programma torna alla pagina principale e azzera tutte le selezioni ..... :mad:

Qualche consiglio grazie
 

MAX_SV

Active Member
Licensed User
Longtime User
forse ho risolto non so se è la procedura giusta (anche perché mi sembra un po' perverso ....) ho creato un file INI che vado a scrivere ogni volta che cambio i dati e leggo su resume andando a ripristinare la visualizzazione precedente ....:confused:
 

moster67

Expert
Licensed User
Longtime User

dexMilano

Active Member
Licensed User
Longtime User
Riapro il tread per porre una domanda a chi ci è già passato.
Ma quello che dichiaro in Globals, non dovrebbe persistere al cambio della rotazione?
Ho capito che la attività è distrutta e ricreata, e quindi devo ricostruire lo schermo, ma le variabili Globali non dovrebbero rimanere?

Grazie

dex
 

dexMilano

Active Member
Licensed User
Longtime User
Secondo me è poco coerente.
Se è l'attività che viene creata le variabili globali (che sono nella applicazione) dovrebbero conservare i valori.
Mah!

dex

PS
Questa settimana ho imparato veramente un sacco di cose!
 
D

Deleted member 103

Guest
La cosa assurda che questo succeda se uno ruota il dispositivo!!!
@LucaMs
Io non l'ho considererei assurdo.
Tra le variabili del "Sub Globals" e del "Sub Process_Globals" c'è una differenza.
Le variabili del "Sub Globals" mantengono il loro valore finchè l'attività è attiva, invece le variablili del "Sub Process_Globals" mantengono il loro valore fino a che la App non viene distrutta dall'utente, con "ExitApplication" o dal sistema.

Il problema è che nel "Sub Process_Globals" non si possono inserire le View (es. Label, Button, ecc.) . Quindi è necessario usare delle variabili che possano salvare il valore delle View (Label, Button, ecc.).

Dove e quando si salvano questi valori? La cosa più semplice è nel "Sub Activity_Pause".
es.:
B4X:
Sub Process_Globals
    Dim strButton As String
    Dim strLabel As String
End Sub

Sub Globals
    Dim btnButton As Button
    Dim lblLabel As Label
End Sub

Sub Activity_Resume
    btnButton.text = strButton
    lblLabel.text = strLabel
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    strButton = btnButton.text
    strLabel = lblLabel.text
End Sub
 

dexMilano

Active Member
Licensed User
Longtime User
Scusate ma io sto provando proprio questo, infatti ho fatto lo stesso ragionamento di Filippo.

Nella Process_Global (dove mi aspetto che i valori delle variabili vengano salvati) metto le variabili.
I controlli li salvo con lo State Manager (utility trovata altrove).
Però non mi sembra funzionare.
Le variabili si resettano con la rotazione dello schermo.
Filippo, sei sicuro che funzioni così?
Altrimenti non mi spiego perchè la utility di cui sopra permetta di salvare anche le variabili (Settings).

Grazie

dex
 

LucaMs

Expert
Licensed User
Longtime User
Alura (so' poligRotta :))

Filippo ha spiegato bene.

Nel suo esempio manca soltanto una cosa, per questo non può funzionare:

nella Resume, passa alle view (alle loro proprietà Text) i valori contenuti nelle variabili,
ma al primo avvio le variabili sono vuote.

si deve aggiungere:
B4X:
Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("layMain")

    strButton = btnButton.text
    strLabel = lblLabel.text
   
End Sub


Sì, dex, vengono distrutte le Activity e quindi le view; quello che critico con forza è che Android è un S.O. sviluppato per dispositivi che vengono ruotati, in quanto "mobili", e sono convinto che non avrebbero dovuto sudare molto per evitare quest'inconveniente non da poco!

Per quanto riguarda lo StateManager, sicuramente funziona, ma io non l'ho provato. Faccio qualche provetta poi ti dico; intanto ti consiglio di fare una prova con un'Activity semplice e, se non ti funziona, posta il progetto.
 

LucaMs

Expert
Licensed User
Longtime User
Ho provato e funziona tutto come dovrebbe.

Non bisogna confondere le variabili salvate con StateManager.SaveSettings, che possono appartenere a qualunque modulo (praticamente sono utili per le preferenze utente) con lo stato (il contenuto attuale) delle view di una specifica Activity.

Ho allegato una semplice prova (la variabile globale del Main strProcessGlobalVar non viene resettata quando si ruota lo schermo).


P.S. Però, così com'è ha un "problema", diciamo una cosa non voluta: carica le EditText con l'ultimo valore inserito dall'utente ANCHE quando si chiude e riapre l'app. Basterà usare bene i cicli delle Activity... ora non ne ho voglia :)
 

Attachments

  • lm_UseOfStateManager.zip
    15.6 KB · Views: 321
Last edited:
D

Deleted member 103

Guest
L' esempio di prima l'avevo buttato così alla veloce.

Questo invece è il modo che uso io nelle mie app.
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
   
    Dim mp As Map
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

    Dim btnButton As Button
    Dim lblLabel As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")

    If FirstTime Then
        mp.Initialize
    End If
   
End Sub

Sub Activity_Resume
    If mp.Size > 0 Then
        btnButton.text    = mp.Get("btnButton.text")
        btnButton.Enabled = mp.Get("btnButton.Enabled")
        lblLabel.text    = mp.Get("lblLabel.text")
    End If
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    mp.Clear
    If Not(UserClosed) Then
        mp.Put("btnButton.text", btnButton.text)
        mp.Put("btnButton.Enabled", btnButton.Enabled)
        mp.Put("lblLabel.text", btnButton.text)
    End If
End Sub
 

dexMilano

Active Member
Licensed User
Longtime User
Grazie Filippo per la condivisione.
La State Manager fa qualcosa del genere con il vantaggio che si passa automaticamente tutti i controlli esistenti nella attività (questo mi piace molto) e salva il tutto su file (questo non mi piace molto).

DOmanda:
quindi la "FirsTime" NON è la prima esecuzione (dopo la instalalzione diciamo) ma è il lancio quando la app è chiusa.
E nella vita di una accade dopo ogni chiusura.
Giusto?

dex
 
D

Deleted member 103

Guest
@dexMilano
E nella vita di una accade dopo ogni chiusura.
Giusto?
Non proprio! Se chiudi la App con "ExitApplication" allora sì, se nò, quando viene distrutta dal sistema.
 
Top