Italian keycode back

skill27

Member
buonasera ragazzi, ho un piccolo problema...
ho impostato il tasto indietro del telefono per due cose:
-uscire dall'app con conferma tramite msgbox
-tornare indietro nelle pagine di webview con page_back
tutto funzionante, tutto bello tranne per una cosa...ogni volta che torno indietro nella webview, mi compare anche il msgbox2
ho sbagliato qualcosa nel codice? ho provato mille modi ma senza successo...grazie mille per chi mi aiuterà
ecco il codice:

B4X:
Sub activity_KeyPress (KeyCode As Int) As Boolean 
    If KeyCode = KeyCodes.KEYCODE_BACK Then
        If page_back = True Then
            page_back
        Else
            Dim Answ As Int
            Answ = Msgbox2("Do you want to quit the program", "A T T E N T I O N", "Yes", "", "No", Null)
            If Answ = DialogResponse.NEGATIVE Then
            Return True
            End If
        End If
        
    End If
End Sub
 

udg

Expert
Licensed User
B4X:
If page_back = True Then
            page_back
Se page_back è una funzione, qui scrivi: "se ritorna vero allora chiamala di nuovo (e non guardare a cosa ritorna)"
ps: non vedo neanche il "Return false"..
 

skill27

Member
B4X:
If page_back = True Then
            page_back
Se page_back è una funzione, qui scrivi: "se ritorna vero allora chiamala di nuovo (e non guardare a cosa ritorna)"
ps: non vedo neanche il "Return false"..
Si esatto, è una sub.
Quindi dovrei mettere come precisamente?
If page_back = True than
If return true then
Page_back
Else
Return false
O sbaglio?
 

udg

Expert
Licensed User
Vero, anche se il link si riferisce all'indicazione su come utilizzare correttamente il MessageAsync invece degli obsoleti (e "pericolosi") MessageBox/MessageBox2.
Resta il fatto che se con il tasto Back si desidera sia tornare indietro nella webview che uscire dall'app (presumo solo nel caso non ci siano ulteriori pagine nella history della wv) allora il mio spunto di cui al #2 va considerato con una qualche attenzione.
 

skill27

Member
Vero, anche se il link si riferisce all'indicazione su come utilizzare correttamente il MessageAsync invece degli obsoleti (e "pericolosi") MessageBox/MessageBox2.
Resta il fatto che se con il tasto Back si desidera sia tornare indietro nella webview che uscire dall'app (presumo solo nel caso non ci siano ulteriori pagine nella history della wv) allora il mio spunto di cui al #2 va considerato con una qualche attenzione.
ci sono 7 webview perchè è una tabstrip.
con il consiglio di erel non sono riuscito a risolvere il problema(colpa mia e della poca esperienza sicuro).
precisamente come devo mettere , quindi, sotto l'activity keycode?
 

udg

Expert
Licensed User
Dipende come hai strutturato la tua page_back.
Se funziona richiamando la history della pagina web e segnala con true/false il raggiungimento della più remota (nel tempo) pagina possibile (in pratica, più indietro di così non si può), allora usi quel valore per determinare se mostrare il MsgBoxAsync o meno.
A naso direi che se hai 7 WV il ragionamento non cambia, visto che l'utente in un determinato momento ne utilizza una sola. quindi torna indietro il più possibile su quella e poi riceve il mesasggio per terminare il programma; a meno che non pensi ad un meccanismo per cui venga spostato (suo malgrado) in un diverso TAB dove l'ennesima WV può tornare indietro e così via per 7 volte..

Domanda: c'è un nesso tra i contenuti delle 7 WV? Nel senso, l'utente deve poter saltellare di qua e di là mantenendo il contenuto di ciascuna o sarebeb sufficiente un unico panel con un'unica WV il cui contenuto cambierebeb alla pressione di un tastino con il ruolo di TAB?
 

skill27

Member
Dipende come hai strutturato la tua page_back.
Se funziona richiamando la history della pagina web e segnala con true/false il raggiungimento della più remota (nel tempo) pagina possibile (in pratica, più indietro di così non si può), allora usi quel valore per determinare se mostrare il MsgBoxAsync o meno.
A naso direi che se hai 7 WV il ragionamento non cambia, visto che l'utente in un determinato momento ne utilizza una sola. quindi torna indietro il più possibile su quella e poi riceve il mesasggio per terminare il programma; a meno che non pensi ad un meccanismo per cui venga spostato (suo malgrado) in un diverso TAB dove l'ennesima WV può tornare indietro e così via per 7 volte..

Domanda: c'è un nesso tra i contenuti delle 7 WV? Nel senso, l'utente deve poter saltellare di qua e di là mantenendo il contenuto di ciascuna o sarebeb sufficiente un unico panel con un'unica WV il cui contenuto cambierebeb alla pressione di un tastino con il ruolo di TAB?
B4X:
[CODE=b4x]Sub activity_KeyPress (KeyCode As Int) As Boolean

    If KeyCode = KeyCodes.KEYCODE_BACK Then

        If page_back = True Then

            page_back

        Else

            Dim Answ As Int

            Answ = Msgbox2("Do you want to quit the program", "A T T E N T I O N", "Yes", "", "No", Null)

            If Answ = DialogResponse.NEGATIVE Then

            Return True

            End If

        End If

        

    End If

End Sub



page_back

    WebView2.Back

    WebView3.Back

    WebView4.Back

    WebView5.Back

    WebView6.Back

    WebView7.Back

    WebView8.Back

    WebView9.Back

End Sub


[/CODE]

sono 8 scusami, si ogni webview ha un suo layout e si scorre da destra a sinistra e vorrei che, con il tasto indietro, tornasse nella pagina precedente fino a tornare alla base delle webview.

l'unico problema è sempre quello sopra che mi torna indietro ma esce anche il messaggino di uscire dall'app e, questo messaggino, deve comparire, quando, cliccando indietro, non vado in pagine precedenti e sono alla base dei tutti i layout.
 

udg

Expert
Licensed User
Bene, allora hai bisogno di una funzione che ritorni True solo quando tutte le WV (qualunque sia il loro numero) siano posizionate sulla pagina più remota di cui dispongono.
Immaginiamo che si chiama Ready2Finish e, come detto ritorni un boolean: False se almeno una WV ha ancora pagine da scorrere all'indietro e True se tutte le WV sono sulla propria pagina più remota nella history di navigazione.
A quel punto, nel codice segnalato da Erel, aggiungi il check su Ready2Finish, qualcosa tipo:
B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean

  If KeyCode = KeyCodes.KEYCODE_BACK Then
      'se non ha più nulla da navigare mostra la richiesta di termine, altrimenti gestisce il tasto Back in modo standard
      if Ready2Finish then
           openMsgBox
           return true
     else
         return false
    end if
  else
      return false
  end if      
End Sub

Sub openMsgBox
   Msgbox2Async("Do you need to click in the button!","Interruped", "Continue", "Cancel", "", Null, True)
     Wait For Msgbox_Result (Result As Int)
     If Result=DialogResponse.POSITIVE Then
         Activity.Finish
     end if
End Sub
In pratica, mentre sei su una WV, premendo Back, prima viene verificato se c'è ancora da tornare indietro nelle 8 history. Se non c'è nulla, vedi il messaggio. Se almeno una ha ancora del materiale, l'azione di Back si applica alla WV corrente (anche se non ha da navigare indietro) e l'utente dovrebbe capire (meglio se prevedi un'indicazione visiva in qualche modo) che ci sono altre WV su cui deve operare ancora con il Back.

Non so quale sia lo scopo del programma, ma da utente non mi piacerebbe l'idea di essere costretto al Back selvaggio su tutte le WV prima di poter terminare.
 
Last edited:

skill27

Member
Bene, allora hai bisogno di una funzione che ritorni True solo quando tutte le WV (qualunque sia il loro numero) siano posizionate sulla pagina più remota di cui dispongono.
Immaginiamo che si chiama Ready2Finish e, come detto ritorni un boolean: False se almeno una WV ha ancora pagine da scorrere all'indietro e True se tutte le WV sono sulla propria pagina più remota nella history di navigazione.
A quel punto nel codice segnalato da Erel, aggiungi il check su Ready2Finish, qualcosa tipo:
B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean

  If KeyCode = KeyCodes.KEYCODE_BACK Then
      'se non ha più nulla da navigare mostra la richiesta di termine, altrimenti gestisce il tasto Back in modo standard
      if Ready2Finish then
           openMsgBox
           return true
     else
         return false
    end if
  else
      return false
  end if       
End Sub

Sub openMsgBox
   Msgbox2Async("Do you need to click in the button!","Interruped", "Continue", "Cancel", "", Null, True)
     Wait For Msgbox_Result (Result As Int)
     If Result=DialogResponse.POSITIVE Then
         Activity.Finish
     end if
End Sub
grazie mille, sei gentilissimo che mi stai aiutando e un'ultima cosa...la page_back non la menziono da nessuna parte li?
 

udg

Expert
Licensed User
Così come l'ho pensata io, no.
Page_back presumo serva solo per navigare all'indietro. E' una tua sub o un evento della WV? Nel secondo caso viene chiamata automaticamente dal tasto Back quando Ready2Finish ritorna False.
Nel primo caso, faresti bene a descrivere cosa faccia. Ma, comunque, se viene già chiamata da un evento, allora va bene così. Direi che probabilmente non ti servirà più che ritorni un valore.
 

skill27

Member
Così come l'ho pensata io, no.
Page_back presumo serva solo per navigare all'indietro. E' una tua sub o un evento della WV? Nel secondo caso viene chiamata automaticamente dal tasto Back quando Ready2Finish ritorna False.
Nel primo caso, faresti bene a descrivere cosa faccia. Ma, comunque, se viene già chiamata da un evento, allora va bene così. Direi che probabilmente non ti servirà più che ritorni un valore.
page_back è una sub dove ci sono tutte le webview.back
 

udg

Expert
Licensed User
Ok. Hai risolto?
Ho appena dato uno sguardo alla definizione della WV e visto che "back" non è un evento ma un comando che invii tu, quindi diventa necessario gestire questo punto. Direi qualcosa tipo:
B4X:
if Ready2Finish then
           openMsgBox
     else
           tuapageback  'qui chiami la tua sub che effettua il wv.back per tutte (o quelle che servono) le wv. La tua sub non ha motivo di ritornare il boolean
    end if
    return true    'questo dice che il tasto Back è stato "lavorato" e quindi la sua pressione non viene propagata
Se cerchi nel forum trovi anche delle estensioni alla WV che possono facilitarti la vita, a maggior ragione se la tua app si basa principalmente sull'utilizzo di WV.
 

skill27

Member
Ok. Hai risolto?
Ho appena dato uno sguardo alla definizione della WV e visto che "back" non è un evento ma un comando che invii tu, quindi diventa necessario gestire questo punto. Direi qualcosa tipo:
B4X:
if Ready2Finish then
           openMsgBox
     else
           tuapageback  'qui chiami la tua sub che effettua il wv.back per tutte (o quelle che servono) le wv. La tua sub non ha motivo di ritornare il boolean
    end if
    return true    'questo dice che il tasto Back è stato "lavorato" e quindi la sua pressione non viene propagata
Se cerchi nel forum trovi anche delle estensioni alla WV che possono facilitarti la vita, a maggior ragione se la tua app si basa principalmente sull'utilizzo di WV.
no purtroppo ho sempre lo stesso problema che,invece di tornare indietro nella Wv, mi compare il msgbox
 

udg

Expert
Licensed User
Mi sa che l'unica è che tu pubblichi qui o l'esportazione dell'intero progetto o almeno quella sub Pagina_back e la sub Ready2Finish
 

skill27

Member
Mi sa che l'unica è che tu pubblichi qui o l'esportazione dell'intero progetto o almeno quella sub Pagina_back e la sub Ready2Finish
si dopo lo pubblico
ma la libreria aggiornata della sliding menu dove la trovo? ho provata a cercarla in tutto il forum ma ho solo trovato la versione 1.10
 

udg

Expert
Licensed User

skill27

Member
si esatto. infatti c'ho smanettato un po ieri.
qui cosa sbaglio? per me questa cosa del tasto indietro è la cosa più rognosa... in pratica ho utilizzato select per tornare indietro dalla webview e if per le drawer ma non va. cosa sbaglio?
B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean
    
    Select KeyCode
        Case KeyCodes.KEYCODE_BACK:
            page_back
            Return True
        Case Else
            Return False
            Activity.LoadLayout("1")
    End Select
    
    
    If KeyCode = KeyCodes.KEYCODE_BACK Then
        If Drawer.LeftOpen Then
            Drawer.LeftOpen = False
            Return True
        End If
        If Drawer.RightOpen Then
            Drawer.RightOpen = False
            Return True
        End If
    
    End If
    Return False
End Sub
 

udg

Expert
Licensed User
Scusa, ma ora sono a pranzo.
Nella sub c'è un po' di confusione e va rivista in toto.
Intanto pubblica il codice di page_back , tanto per vedere cosa fa nello specifico. O,s e preferisci, esporta l'intero progetto.
 
Top