Italian Da pagina 2 a pagina 1 e ritorno: come aggiornare?

StefanoAccorsi

Member
Licensed User
Longtime User
Ciao a tutti, da qualche tempo per realizzare un progetto personale sono tornato a quel B4A che per un anno, tempo fa, ho usato senza sosta.
Non so se in passato ho mai scritto sul forum italiano, e forse molti di voi non c'erano, nel caso piacere di conoscervi.

Questo il problema. Dalla MainPage, dopo che l'utente ha effettuato alcune scelte, premendo un pulsante la app passa alla pagina 2 di dettaglio. Vorrei che la app consentisse, con il back, di tornare alla MainPage, modificare alcuni dati e così premendo il pulsante venisse nuovamente aggiornata la pagina 2 di dettaglio. Per l'esattezza, la pagina 2 si comporta così:

B4XPage_Created:
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("stopdetailspage")
    B4XPages.AddPage("Main", mainPage)
    
    ' Populate ddl
    ' alcune operazioni per popolare una B4XComboBox sulla base del risultato di una chiamata a una API
    ' che ha come parametro di input una variabile recuperata dalla mainPage.
End Sub

Il tutto funziona perfettamente. Ma se torno indietro e poi modifico i dati richiesti e premendo il pulsante torno alla pagina 2, la B4XPage_Created non viene chiaramente più chiamata.
Ho cercato nel forum e ho trovato un problema simile la cui soluzione era implementare nella page2:

B4XPage_CloseRequest:
Private Sub B4XPage_CloseRequest As ResumableSub
    B4XPages.GetManager.ClosePage(Me)
    Return False
End Sub

Anche perchè senza questo codice, premendo back la app va in crash:

Error:
Error occurred on line: 353 (B4XPagesManager)
java.lang.reflect.InvocationTargetException
...
Caused by: java.lang.NullPointerException: Attempt to read from field 'boolean b4a.example.b4xpagesmanager$_b4xpageinfo.Created' on a null object reference in method 'java.lang.String b4a.example.b4xpagesmanager._createpageifneeded(b4a.example.b4xpagesmanager, b4a.example.b4xpagesmanager$_b4xpageinfo)'

Ora, questo mi ha fatto scrivere nella mainPage, nel codice legato all'evento del pulsante che raccoglie i dati inseriti dall'utente, aggiorna la variabile Public definita nella mainPage, e apre la pagina 2 di dettaglio:

Click to open page2:
Private Sub cmdSelFromFav_Click
    ' un po' di codice
    
    If Page2.IsInitialized = False Then
        B4XPages.AddPage("Page2", Page2.Initialize)
    End If
    B4XPages.ShowPage("Page2")
End Sub

Ebbene tutto in apparenza funziona, ma non solo quando torno la seconda volta nella page2 ci sono i risultati precedenti, pare pure mi ricarichi lo stesso layout sul precedente. In altre parole vedo i dati nuovi, per ogni campo, sovrapposti ai vecchi:


al prima "passaggio" nella pagina c'era un 39, al secondo un 40.

Qualche suggerimento? So che è un problema banale e ammetto la mia incapacità nel trovare una soluzione nel forum ... ma ho risolto tutto il resto, la app va perfettamente, ma questo no.

Grazie.
 
Solution
Anche se non vedi Page2, una volta tornato alla MainPage, c'è ed è sempre attiva.
Questo significa che puoi chiamare tutte le sue Sub pubbliche in qualunque momento, anche quando la pagina non sia visualizzata.

La cosa migliore sarebbe chiamare dalla MainPage una Sub pubblica della Page2, passandogli il parametro, poi visualizzare la pagina con ShowPage.

Quasi certamente, nella B4XPage_Created della B4XMainPage, sarà meglio che tu aggiunga Page2 usando B4XPages.AddPageAndCreate anziché B4XPages.AddPage; in questo modo, la B4XPage_Created di Page2 sarà eseguita e quindi caricato il suo layout (la pagina non verrà visualizzata) e inizializzate eventuali variabili.
Clipboard02.jpg


Nel caso anomalo in cui tu volessi vuotare una...

Sagenut

Expert
Licensed User
Longtime User
Ciao.
La parte del Populate della pagina 2 mettila in B4XPage_Appear anziché in Created.
Prova così.
 
Last edited:
Upvote 0

LucaMs

Expert
Licensed User
Longtime User
Anche se non vedi Page2, una volta tornato alla MainPage, c'è ed è sempre attiva.
Questo significa che puoi chiamare tutte le sue Sub pubbliche in qualunque momento, anche quando la pagina non sia visualizzata.

La cosa migliore sarebbe chiamare dalla MainPage una Sub pubblica della Page2, passandogli il parametro, poi visualizzare la pagina con ShowPage.

Quasi certamente, nella B4XPage_Created della B4XMainPage, sarà meglio che tu aggiunga Page2 usando B4XPages.AddPageAndCreate anziché B4XPages.AddPage; in questo modo, la B4XPage_Created di Page2 sarà eseguita e quindi caricato il suo layout (la pagina non verrà visualizzata) e inizializzate eventuali variabili.
Clipboard02.jpg


Nel caso anomalo in cui tu volessi vuotare una pagina, il contenuto delle view e/o reinizializzare alcune sue variabili, crea una Sub pubblica e chiamala, semplicemente, prima di mostrare la pagina. Nota che potresti chiamare quella Sub, ResetPage, anche dall'intero della B4XPage_Created della pagina stessa, quindi senza caricare il layout (e inizializzare variabili) in questa .
UnaPaginaQualunque:
Public Sub ResetPage
    Root.RemoveAllViews
    Root.LoadLayout("layUnaPaginaQualunque")
    UnaVariabileGlobale = 77
    AltraVar = "Ciao"
End Sub
oppure:
B4X:
Public Sub ResetAndShowPage
    Root.RemoveAllViews
    Root.LoadLayout("layUnaPaginaQualunque")
    UnaVariabileGlobale = 77
    AltraVar = "Ciao"
    B4XPages.ShowPage(B4XPages.GetPageId(Me))
End Sub
oppure:
B4X:
Public Sub ResetPage(Show As Boolean)
    Root.RemoveAllViews
    Root.LoadLayout("layUnaPaginaQualunque")
    UnaVariabileGlobale = 77
    AltraVar = "Ciao"
    If Show Then
        B4XPages.ShowPage(B4XPages.GetPageId(Me))
    End If
End Sub
 
Last edited:
Upvote 3
Solution

LucaMs

Expert
Licensed User
Longtime User
Grazie! Ho risolto come indicato da @LucaMs . Ora il mio progetto è realmente finito :)
Bene, mi fa molto piacere (altrimenti a che pro tentare di dare una mano? 😁).

Ogni tanto, però, se capita che io vi indichi la strada giusta, potreste segnare il mio post come "la soluzione", altrimenti andando a leggere dati relativi ai membri, sembra che io scriva solo pirlate (tantissime anche queste 😂).

Ovviamente mi fanno piacere anche i "Like"; infatti ringrazio subito @Sagenut, @moore_it, @Xfood e @XorAndOr per i loro al mio post preDecente 😊🙏
 
Upvote 0

StefanoAccorsi

Member
Licensed User
Longtime User
Eh ma da quando lo usavo il forum è cambiato molto quindi manco mi ero accorto di questa possibilità, comunque vi ho posto rimedio ;)
 
Upvote 0

Sagenut

Expert
Licensed User
Longtime User
Chiedo scusa ma come si fa a impostare un post come soluzione? Dove si clicca?
Nelle discussioni create da te vedrai che a destra di ogni post c'è un simbolo di spunta grigio.
Cliccandolo marcherai il post come soluzione.
 
Upvote 0

Sabotto

Well-Known Member
Licensed User
Grazie @Sagenut , ma come ha detto xOrAndOr nell'apposito post nel forum Italiano non se po ffa nel senso che non mi esce nei post creati da me. Anche se , sempre come ha detto xor, StefanoAccorsi c'è riuscito non so come.
 
Upvote 0

Sagenut

Expert
Licensed User
Longtime User
Forse hanno aggiunto la cosa con l'ultimo aggiornamento ed è presente nella nuove discussioni?
 
Upvote 0
Top