Italian Passare da un layout all'altro e ritorno

Pisinho

Active Member
Licensed User
Longtime User
Buonasera a tutti,
tramite l'evento click (bottone o altro) vorrei passare ad un altro Layout caricandolo da File,
passandogli dei valori. Mi serve per visualizzare la scheda completa di un record alla pressione di una riga di una tabella. Ho tentato aprendo il layout con

Activity.Loadlayout("Secondo") ma a questo punto li vedo tutti e due (il Primo ed il Secondo).

Successivamente alla pressione di un Bottone "Torna alla Tabella" vorrei che si ritornasse al Primo Layout.

C'è un tutorial ?

Grazie a tutti.
 

LucaMs

Expert
Licensed User
Longtime User
Un tutorial vero e proprio, non so, prova a cercare.

Però ci sono almeno 3 soluzioni:

a) puoi aggiungere due panel all'activity, una dentro l'altra, entrambi invisibili fino al momento in cui li utilizzerai per il record. Al panel esterno dai il colore Transparent; quello interno conterrà le views per il record.

b) prima di caricare il secondo layout, devi eliminare tutte le view contenute nell'activity caricate col primo (e questo ovviamente non va bene, perché tu vuoi tornare al layout principale, ma lo dico nel caso in cui ti serva in altre occasioni).

c) creare un'activity diversa per la gestione del singolo record e passare dei dati ad essa (ad esempio una classe che rappresenti il tuo record o più semplicemente un Type con lo stesso scopo). Per il passaggio del "record" ci sono vari modi: puoi impostare una variabile (di tipo clsRecord o typRecord creati da te) nella Process_Global dell'activity che gestisce il record: la "riempi" dalla activity principale e poi lanci l'activity "record", diciamo; oppure, richiamare un metodo di questa activity, passandogli il "record", utilizzando CallSubDeleayed2 o CallSubDelayed3 nella activity principale, ad esempio: CallSubDelayed2(actRecord, "ReceiveRecord", MyRecord), in cui ReceiveRecord è una sub pubblica nell'activity denominata "actRecord" che gestisce appunto il record e MyRecord di nuovo un oggetto di un tipo o classe creata da te.
Nell'activity principale, quindi, scriverai:
CallSubDelayed2(actRecord, "ReceiveRecord", MyRecord)
Activity.Finish (per chiudere la principale e passare all'altra)

(questo è probabilmente il metodo migliore)
 

Pisinho

Active Member
Licensed User
Longtime User
Grazie Luca/Filippo,
cercherò di capire il tutto come per gli altri POST sembra difficile poi basta riguardare un po il codice e si capisce.
Questo mi sembra un pochino più difficile visto che non ho mai fatto una classe da zero... però chissà...mai dire mai.

Ti faccio sapere.

Grazie a tutti.
 

LucaMs

Expert
Licensed User
Longtime User
Ho sviluppato un esempio al volo (l'ho solo scritto, non l'ho provato!)

Nella tua activity principale (che potresti chiamare ad esempio "actClienti") metti:
B4X:
Private Cliente As clsCliente
Cliente.Initialize
Cliente.Nome = "Pisinho"

Private Sub MostraCliente
    CallSubDelayed2(actCliente, "RiceviRecord", Cliente)
    Activity.Finish
End Sub


Nella activity per gestire il singolo record (chiamata "actCliente"):
B4X:
Public Sub RiceviRecord(Cliente As clsCliente)
' qui riempi le view con i dati del Cliente.
    lblID.Text = Cliente.ID
    edtNome.Text = Cliente.Nome
    ' ...
End Sub

La classe "clsCliente":
B4X:
'Class module
Sub Class_Globals
    Private mID As Int
    Private mNome As String
    Private mCognome As String
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize

End Sub

#Region  Campi

#Region  ID
' Gets/Sets Imposta/Legge l'ID
Public Sub setID(ID As Int)
    mID = ID
End Sub
Public Sub getID As Int
    Return mID
End Sub
#End Region

#Region  Nome
' Gets/Sets Imposta/Legge il nome del Cliente
Public Sub setNome(NomeCliente As String)
    mNome = NomeCliente
End Sub
Public Sub getNome As String
    Return mNome
End Sub
#End Region

#Region  Cognome
' Gets/Sets Imposta/Legge il Cognome del Cliente
Public Sub setCognome(CognomeCliente As String)
    mCognome = CognomeCliente
End Sub
Public Sub getCognome As String
    Return mCognome
End Sub
#End Region

#End Region

#Region  Metodi
' Qui potresti aggiungere i metodi per scrivere
' i dati nel database (meglio ancora, qui potresti
' inserire comandi che richiamino i metodi di un modulo
' creato per salvare o recuperare i dati dal database).
#End Region
 
Last edited:

Pisinho

Active Member
Licensed User
Longtime User
Grazie Luca ma non ci ho capito un tubo...

Non credo ti sia spiegato male, è che probabilmente mi mancano delle basi di come ragiona Android...

Grazie di cuore...
 

LucaMs

Expert
Licensed User
Longtime User
Prego, non c'è di che.

La cosa più complicata è la CallSubDelayed, che richiama una sub routine in una activity senza che questa activity sia in quel momento attiva (visualizzata).

Non è complicato. Fai una prova e segui passo-passo (F8) l'esecuzione del codice.

Altrimenti, farò io una piccola app di esempio e la posterò (non adesso :()
 

Pisinho

Active Member
Licensed User
Longtime User
Grazie Luca,
allora la CallSubDelayed OK. Ora faccio delle prove passando dei parametri e ci gioco un pochino.

A volte basta l'imbeccata... non farò le classi perchè non le so gestire, quindi meglio andare con la vecchia programmazione anche se mi dovrò ripetere molto.
Sono un autodidatta e quella parte anche se mi piacerebbe capirla per usarla bene, mi resta un po ostica...

Grazie davvero di cuore.
 

LucaMs

Expert
Licensed User
Longtime User
Puoi usare i Type, invece delle classi; sono molto più semplici.
Per esempio, invece della classe clsCliente che ho postato, ti basta dichiarare, nella Process_Globals della actCliente:

Type typCliente(ID as Int, Nome as String, Cognome as String, AltroCampo as booo)

e poi potrai utilizzare delle variabili dichiarate di tipo typCliente, esattamente come fai con i tipi Int, Double, String, etc.

Private MioCliente as typCliente
Private Saldo as Float
Private Msg as String

e utilizzare la variabile:
MioCliente.Nome = Pisinho
MioCliente.Cognome = Pure
 
Top