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

amorosik

Well-Known Member
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
 
Top