Italian Refresh Pagina in b4i

ken87

Active Member
Licensed User
Longtime User
Ho provato questo codice per fare il rfresh di una pagina

B4X:
Sub refresh_Click
    
    Dim no As NativeObject= paginaweb
    no.RunMethod("stringByEvaluatingJavaScriptFromString:", Array("window.location.reload();"))
    'paginacaricata=    paginaweb.Initialize
    'paginaweb.LoadUrl(paginacaricata)

End Sub

Ma quado lo eseguo ricevo questo errore

B4X:
Copying updated assets files (27)
Application_Start
Application_Active
Error occurred on line: 99 (Main)
Method not found: stringByEvaluatingJavaScriptFromString:, target: <WKWebView: 0x16357c00; frame = (0 106.764; 1024 641.236); layer = <CALayer: 0x15564d10>>
Stack Trace: (
  CoreFoundation       <redacted> + 152
  libobjc.A.dylib      objc_exception_throw + 38
  CoreFoundation       <redacted> + 0
  Sulcis Food Menu     +[B4I runDynamicMethod:method:throwErrorIfMissing:args:] + 354
  Sulcis Food Menu     -[B4INativeObject RunMethod::] + 162
  Sulcis Food Menu     -[b4i_main _refresh_click] + 790
  CoreFoundation       <redacted> + 68
  CoreFoundation       <redacted> + 300
  Sulcis Food Menu     +[B4I runDynamicMethod:method:throwErrorIfMissing:args:] + 1488
  Sulcis Food Menu     -[B4IShell runMethod:] + 588
 Sulcis Food Menu     -[B4IShell raiseEventImpl:method:args::] + 1908
 Sulcis Food Menu     -[B4IShellBI raiseEvent:event:params:] + 1328
 Sulcis Food Menu     __33-[B4I raiseUIEvent:event:params:]_block_invoke + 56
 libdispatch.dylib    <redacted> + 10
 libdispatch.dylib    <redacted> + 22
 libdispatch.dylib    _dispatch_main_queue_callback_4CF + 902
 CoreFoundation       <redacted> + 8
 CoreFoundation       <redacted> + 848
 CoreFoundation       CFRunLoopRunSpecific + 470
 CoreFoundation       CFRunLoopRunInMode + 104
 GraphicsServices     GSEventRunModal + 80
 UIKit                UIApplicationMain + 150
 Sulcis Food Menu     main + 90
 libdyld.dylib        <redacted> + 2
)
 

ken87

Active Member
Licensed User
Longtime User
Sto sbagliando istruzione?
In B4a uso
B4X:
'
paginacaricata=    paginaweb.Initialize
    paginaweb.LoadUrl(paginacaricata)
 

LucaMs

Expert
Licensed User
Longtime User
Non ho B4I ma a naso direi che in quel modo tenti di ricaricare la "Activity", il Main, non una pagina.

Puoi vuotare la Root di quella pagina (Root.RemoveAllViews) e ricaricare il layout; se ti serve anche eseguire nuovamente il codice che hai scritto nell'evento B4XPage_Created, spostalo, mettilo in una routine che richiamerai sia dalla Created che quando "ricaricherai la pagina".


P.S. Mi rendo conto solo adesso che magari in B4I la base potrebbe chiamarsi proprio Page e che, quindi, forse non stai creando un progetto B4XPages (cosa consiglibile, comunque ;))
 

ken87

Active Member
Licensed User
Longtime User
Ho creato una barra di navigazione per navigare dentro un sito mio se mi sposto dalla pagina principale a una seconda pagina il refresh mi aspetto che sia fatta nella pagina corrente selezionata se cancello tutto e ricarico come faccio a dirgli che voglio la pagina corrente e non home page?
Altro dubbio
hHo fatto un panello con tasti

Home page
Refresh
Torna indietro
Contatti
Se vado dalla home alla finestra contatti tutto funziona
Ma se nella home c'è un link tipo a un video di youtube la prima volta mi carica la pagina e la barra sopra
Ma se trono alla home e riprovo la barra sopra che ho creato sparisce emi carica la pagina si youtube senza la mia barra ..
In versione b4a funziona tutto e la barra principale mi viene sempre caricata in b4i solo la prima volta come faccio a risolvere la problematica a me serve che la barra sia sempre presente qualunque pagina venga richiamata

Grazie mille
 

LucaMs

Expert
Licensed User
Longtime User
Ma stai parlando di un progetto B4XPages o no?

Se sì, E SE VUOI SOSTITUIRE delle view in una pagina, quindi svuotandone il contenuto, potresti eliminare le view correnti usando Root.RemoveAllViews e ricaricare con Root.LoadLayout. Se ti serve anche reinizializzare variabili, cosa che normalmente fai nella B4X_Created, metti il tutto in una Sub pubblica, che puoi richiamare dall'interno dell'evento B4XPage_Appear e se vuoi anche da qualunque altra pagina.

Quindi, come esempio, hai la PaginaWeb:
B4X:
Sub Class_Globals
    Private MiaMap As Map
End Sub

Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    MiaMap.Initialize
End Sub

Private Sub B4XPage_Appear
    Refresh
End Sub

Public Sub Refresh
    Root.RemoveAllViews
    Root.LoadLayout("...")
    MiaMap.Clear
    MiaMap.Put(...)
    MiaMap.Put(...)
End Sub


Altro dubbio
Ho fatto un panello con tasti
Dichiaralo come pubblico e poi, supponendo che tu lo abbia creato in B4XMainPage, in qualunque altra pagina metti:

B4XPages.MainPage.MioPannello.Parent = Root
 

Star-Dust

Expert
Licensed User
Longtime User
Ho provato questo codice per fare il rfresh di una pagina

B4X:
Sub refresh_Click
   
    Dim no As NativeObject= paginaweb
    no.RunMethod("stringByEvaluatingJavaScriptFromString:", Array("window.location.reload();"))
    'paginacaricata=    paginaweb.Initialize
    'paginaweb.LoadUrl(paginacaricata)

End Sub

Ma quado lo eseguo ricevo questo errore

B4X:
Copying updated assets files (27)
Application_Start
Application_Active
Error occurred on line: 99 (Main)
Method not found: stringByEvaluatingJavaScriptFromString:, target: <WKWebView: 0x16357c00; frame = (0 106.764; 1024 641.236); layer = <CALayer: 0x15564d10>>
Stack Trace: (
  CoreFoundation       <redacted> + 152
  libobjc.A.dylib      objc_exception_throw + 38
  CoreFoundation       <redacted> + 0
  Sulcis Food Menu     +[B4I runDynamicMethod:method:throwErrorIfMissing:args:] + 354
  Sulcis Food Menu     -[B4INativeObject RunMethod::] + 162
  Sulcis Food Menu     -[b4i_main _refresh_click] + 790
  CoreFoundation       <redacted> + 68
  CoreFoundation       <redacted> + 300
  Sulcis Food Menu     +[B4I runDynamicMethod:method:throwErrorIfMissing:args:] + 1488
  Sulcis Food Menu     -[B4IShell runMethod:] + 588
 Sulcis Food Menu     -[B4IShell raiseEventImpl:method:args::] + 1908
 Sulcis Food Menu     -[B4IShellBI raiseEvent:event:params:] + 1328
 Sulcis Food Menu     __33-[B4I raiseUIEvent:event:params:]_block_invoke + 56
 libdispatch.dylib    <redacted> + 10
 libdispatch.dylib    <redacted> + 22
 libdispatch.dylib    _dispatch_main_queue_callback_4CF + 902
 CoreFoundation       <redacted> + 8
 CoreFoundation       <redacted> + 848
 CoreFoundation       CFRunLoopRunSpecific + 470
 CoreFoundation       CFRunLoopRunInMode + 104
 GraphicsServices     GSEventRunModal + 80
 UIKit                UIApplicationMain + 150
 Sulcis Food Menu     main + 90
 libdyld.dylib        <redacted> + 2
)
Questo codice serve a inserire una riga di javaScript in WebView e farla eseguire. In questo caso la riga JS chiede il refresh della pagina.

prova così e vedi se funziona
B4X:
Dim sf As Object = paginaweb.EvaluateJavaScript("window.location.reload();")
Wait For (sf) paginaweb_JSComplete (Success As Boolean, Result As String)
 

ken87

Active Member
Licensed User
Longtime User
Ok provo poi ti dico grazie per ora.
Si sto facendo il progetto in b4x
 

Star-Dust

Expert
Licensed User
Longtime User
Ok provo poi ti dico grazie per ora.
Si sto facendo il progetto in b4x
Quello e solo per b4i, per b4x il codice è questo

B4X:
RunJavaScript("window.location.reload();")

B4X:
Private Sub RunJavaScript (js As String) As ResumableSub
    #if B4A
    WebViewExtras1.executeJavascript(WebView1, $"B4A.CallSub('Process_HTML', true, ${js})"$)
    Wait For Process_Html(html As String)
    Return html
    #Else If B4J
    Return WebView1.As(JavaObject).RunMethodJO("getEngine", Null).RunMethod("executeScript", Array(js))
    #Else If B4i
    Dim sf As Object = WebView1.EvaluateJavaScript(js)
    Wait For (sf) WebView1_JSComplete (Success As Boolean, Result As String)
    Return Result
    #end if
End Sub

Devi adattare le variabili. Su b4a devi usare WebViewExtra
 

ken87

Active Member
Licensed User
Longtime User
Buongiorno,
Ho provato entrambe le soluzioni non da errore ma ottengo due risultati diversi se uso android o iphone
Su android se sono un fondo alla pagina col tasto ricarico ho la pagina che inizia al top e non in fondo (questo effetto e quello che voglio)
Su iphone se in fondo alla pagina mi ricarica la pagina in fondo

Io ho la necessità che quando ricarico mi riporti alt top della pagina come succede per android e non nel punto dove sono tipo in fondo alla pagina carico e ancora in fondo alla pagina.
Si può fare?

Grazie mille
 

Star-Dust

Expert
Licensed User
Longtime User
Buongiorno,
Ho provato entrambe le soluzioni non da errore ma ottengo due risultati diversi se uso android o iphone
Su android se sono un fondo alla pagina col tasto ricarico ho la pagina che inizia al top e non in fondo (questo effetto e quello che voglio)
Su iphone se in fondo alla pagina mi ricarica la pagina in fondo

Io ho la necessità che quando ricarico mi riporti alt top della pagina come succede per android e non nel punto dove sono tipo in fondo alla pagina carico e ancora in fondo alla pagina.
Si può fare?

Grazie mille
forse. Credo che in JS ci sia un comando per andare lo scrolling in Top , se lo trovi lo devi far eseguire con lo stesso metodo dopo il refresh.
Oppure cambi l'URL inserendo lo stesso indirizzo , anziché il refresh farà il reload. In JS hai tante strade davanti a te (come diceva lo spazzino)
 

ken87

Active Member
Licensed User
Longtime User
Il problema e che indirizzo non è sempre lo stesso.
dovrò indagare sullo scrolling al Top.
Grazie purtroppo sul mondo android ho più esperienza mentre in iphone meno
 

Star-Dust

Expert
Licensed User
Longtime User
Il problema e che indirizzo non è sempre lo stesso.
dovrò indagare sullo scrolling al Top.
Grazie purtroppo sul mondo android ho più esperienza mentre in iphone meno
Basta che hai esperienza in JS

B4X:
RunJavaScript("window.location.location.replace('www.xfood.it');")
 

ken87

Active Member
Licensed User
Longtime User
se conosco la pagina ma se la pagina è diversa ?
come faccio a sapere il nome della pagina che attualmente caricato?
ad esempio una pagina è il miei contatti poi passo alla pagina informazioni ...

Quindi prima devo sapere il nome della pagina attiva e poi li dico ricarica al top della pagina
 

Star-Dust

Expert
Licensed User
Longtime User
Lo sai, lo sai... guardati bene le proprietà ed eventi di webView. Adesso sono fuori fino a lunedì... Ti devi sbracciare a guardare da solo :p
 

ken87

Active Member
Licensed User
Longtime User
Ciao,
Per ricaricare la pagina corrente al top ho provato a usare il metodo top ecco il codice
B4X:
Sub refresh_Click
   
     #If B4a
    paginacaricata= paginaweb.Url
    paginaweb.LoadUrl(paginacaricata)
   
    #else B4i
'    Dim sf As Object = paginaweb.EvaluateJavaScript("window.location.reload();")
'    Wait For (sf) paginaweb_JSComplete (Success As Boolean, Result As String)
   
    RunJavaScript("window.location.reload();")
   
   
   
    'Dim no As NativeObject= paginaweb
    'no.RunMethod("stringByEvaluatingJavaScriptFromString:", Array("window.location.reload();"))
    #end if
       
'    paginacaricata= paginaweb.Url
'    paginaweb.LoadUrl(paginacaricata)
   

End Sub

Private Sub Indietro_Click
   
     #If B4a
    paginaweb.Back
    #else B4i
    paginaweb.GoBack
    #end if
    'paginaweb.Back
End Sub

Private Sub social_Click
    paginaweb.LoadUrl ("https://miosito.it/contact/")
End Sub



Private Sub RunJavaScript (js As String) As ResumableSub
    #if B4A
    WebViewExtras1.executeJavascript(WebView1, $"B4A.CallSub('Process_HTML', true, ${js})"$)
    Wait For Process_Html(html As String)
    Return html
    #Else If B4J
    Return WebView1.As(JavaObject).RunMethodJO("getEngine", Null).RunMethod("executeScript", Array(js))
    #Else If B4i
    Dim sf As Object = paginaweb.EvaluateJavaScript(js)
    sf= paginaweb.Top
    Wait For (sf) WebView1_JSComplete (Success As Boolean, Result As String)
    sf= paginaweb.Top
    Return Result
    #end if
End Sub


sf= paginaweb.Top

Ma non funziona mi ricarica la pagina sempre nel punto dove mi trovo quando premo il tasto.

Grazie mille
 

ken87

Active Member
Licensed User
Longtime User
Ciao,
Sono andato a documentarmi in java la proprietà che rileva url della pagina è la seguente
window.location.href

Ora non ho il mio pc

Potrebbe funzionare una cosa del tipo

B4X:
paginacaricata = window.location.href ' Leggo la pagina corrente
 
paginaweb.LoadUrl(paginacaricata) 'Ricarico la pagina rilevata



Tutto nasce dal fatto che in b4i non ha il metodo che legge la pagina corrente ma se si riesce al leggerla poi dovrebbe funzionare il tutto

Grazie mille
 

ken87

Active Member
Licensed User
Longtime User
Buonasera,
La soluzione proposta sopra non funziona
window.location.href

Non viene riconosciuto
 
Top