Italian [B4A] Come aggiornare label su pagina principale, da codice altro modulo?

amorosik

Expert
Licensed User
Dispongo di app Android creata da template standard B4XPages ( File / Nuovo / B4XPages )
Sull'unico layout esistente ho aggiunto una label lblMessaggio
Su Main, su Activity_Create inizializzo ed abilito un timer a 5 secondi (timer5sec.Initialize("Timer5s",5000), timer5sec.Enabled=True)
Su Main, l'evento Timer5s_tick contiene queste righe

B4X:
Dim pagMain As  B4XMainPage
pagMain.Initialize
pagMain.Aggiorna_Display("testo1")

Su B4XMainPage ho aggiunto la sub Aggiorna_Display
B4X:
public Sub Aggiorna_Display(messaggio As String)
    lblMessaggio.Text=messaggio
End Sub

In sostanza sto cercando di capire come aggiornare una label sulla MainPage agendo da altro modulo
Mi attenderei che dopo 5 secondi dall'avvio la lblMessaggio si modificasse
Invece mi viene restituito un errore
B4X:
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
Error occurred on line: 32 (B4XMainPage)
java.lang.RuntimeException: Object should first be initialized (Label).
Did you forget to call Activity.LoadLayout?
    at anywheresoftware.b4a.AbsObjectWrapper.getObject(AbsObjectWrapper.java:67)
    at anywheresoftware.b4a.objects.TextViewWrapper.setText(TextViewWrapper.java:39)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:348)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:144)
    at anywheresoftware.b4a.debug.Debug.delegate(Debug.java:262)
    at b4a.example.b4xmainpage._aggiorna_display(b4xmainpage.java:57)
    at b4a.example.main._timer1s_tick(main.java:505)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:351)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:144)
    at anywheresoftware.b4a.objects.Timer$TickTack.run(Timer.java:105)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:237)
    at android.app.ActivityThread.main(ActivityThread.java:7948)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)

Sembra che la label debba essere inizializzata
Ma essendo stata creata col designer, dovrebbe essere automaticamente inizializzata durante il LoadLayout che carica la schermata
Dove sbaglio?
 

Sabotto

Active Member
Licensed User
@LucaMs, ho guardato il tuo esempio (sto cercando anche io di approfondire/imparare le B4Xpages)
Nel codice della B4XMainPage, se volessi valorizzare la edtMessage dalla PagOne, come dovrei fare a riferirmi ad essa?

B4X:
Sub Button1_Click

    B4XPages.GetPage("pagOne").edtMessage.Text="testo" ' dà errore. Come faccio a riferirmi a pagOne?
    B4XPages.ShowPage("pagOne")

End Sub
 

Sabotto

Active Member
Licensed User
Come non detto...mi vergogno ad aver chiesto..:rolleyes:🤫
B4X:
Sub Button1_Click
   
    B4XPages.ShowPage("pagOne") ' prima questa'
    pagOne.edtMessage.Text = "valorizz. da pMainpage" ' e poi semplicemente questa'
   
End Sub
ovviamente la view edtMessage deve essere dichiarata come Public
 

Luciano Veneziano

Active Member
Licensed User
Longtime User
Sabotto mi fa venire in mente una cosa, senza voler fare il pierino della situazione
Quando faccio un'app aggiungo sempre un mio modulo "support.bas" che contiene tutte le funzioni che nel tempo ho trovato utili, se è il caso ne aggiungo delle altre che, ovviamente mi porto all'app successiva.
in questo modo cerco di accorciare i tempi di sviluppo con funzioni già testate e funzionanti.
La funzione strLeft (per esempio) è richiamabile con support.strLeft. Spero che questo mi post possa essere utile
 

LucaMs

Expert
Licensed User
Longtime User
Sabotto mi fa venire in mente una cosa, senza voler fare il pierino della situazione
Quando faccio un'app aggiungo sempre un mio modulo "support.bas" che contiene tutte le funzioni che nel tempo ho trovato utili, se è il caso ne aggiungo delle altre che, ovviamente mi porto all'app successiva.
in questo modo cerco di accorciare i tempi di sviluppo con funzioni già testate e funzionanti.
La funzione strLeft (per esempio) è richiamabile con support.strLeft. Spero che questo mi post possa essere utile
Riutilizzare il codice è sempre utile. Come librerie è molto meglio.
 
Top