Italian [RISOLTO] [B4A] Simulare il KeyPress in un EditText

Giorgio Brausi

Member
Licensed User
Longtime User
Salve,

sono fresco fresco di B4A e non riesco a capire come simulare l'evento KeyPress che trovo disponibile solo per l'Activity, mentre io vorrei averlo in un EditText.
Tra l'altro, l'evento KeyPress dell'Activity viene attivato solo quanto premo il pulsante indietro dello smartphone, ma non quando premo altri tasti (lettere o numeri).

Ho fatto una ricerca nel forum ed ho visto che questo problema è molto 'sentito' ma non sembra esservi una soluzione (oppure io non sono riuscito a capirla).
Davvero non c'è modo di intercettare la pressione del singolo KeyCode?


P.S. In Visual Basic ero abituato ad avere disponibile l'evento KeyPress per ogni singolo controllo di edit, mi chiedo come mai non sia stato previsto in B4A.
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
Ciao Giorgio e benvenuto fra noi :)

Purtroppo rispetto al VB.NET troverai tante cose che mancano, ma normalmente queste limitazioni non sono riferite al B4A ma proprio al SO Android e/o al linguaggio Java.

Detto questo, come hai già avuto modo di vedere, l'evento Activity_KeyPress serve solo per intercettare i pulsanti "fisici" del telefonino.
Sull'oggetto EditText hai solo a disposizione questi eventi:
B4X:
TextChanged (Old As String, New As String)
   ' The TextChanged event fires whenever the text changes and it includes the old and new strings.
EnterPressed
   ' The EnterPressed event fires when the user presses on the enter key or action key (Done or Next).
FocusChanged (HasFocus As Boolean)
   ' The FocusChanged event fires when the view is focused or loses focus. The HasFocus parameter value will be set accordingly.

Dovrai quindi utilizzare TextChanged ed analizzare Old string e New string per capire cosa hanno digitato, il problema è che potresti avere il carattere digitato in mezzo alla stringa, non è detto che l'abbiano digitato alla fine.

Cosa ti serviva intercettare il singolo carattere ???

Ciao ciao
Sergio
 

Giorgio Brausi

Member
Licensed User
Longtime User
Ciao @sirjo66
felice di risentirti.

Purtroppo rispetto al VB.NET troverai tante cose che mancano
Me ne sto accorgendo pian piano... :(

Cosa ti serviva intercettare il singolo carattere ???
Proprio così.
Il fatto è che il KeyPress (come tu ben sai) mi permetterebbe di verificare il carattere prima che questo raggiunga l'EditText per stabilire se lasciarlo 'passare', o meno.
Come accade in VB6/VB.NET.

Nello specifico, quando l'utente preme un determinato carattere (RETURN), quest'ultimo deve essere annullato e deve partire una specifica routine.
Ad esempio, se leggo un barcode con un lettore ad emulazione di tastiera, voglio intercettare il carattere finale, aggiunto dal lettore, che comunica di aver terminato la lettura.
Credo che compiere questa verifica nel TextChanged sia improponibile, perché l'evento si verifica dopo aver inserito il carattere, mentre io devo intercettare il carattere prima che venga inserito.
Ma questo è solo uno dei casi.

Francamente mi stupisce che non sia stato previsto un evento di questo tipo.:rolleyes:

P.S. Avevo provato ad utilizzare il Sender nell'evento Activity_KeyPress() ma come già detto questo evento non funziona con i tasti 'normali' per cui, nisba. :(
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
Nel tuo caso specifico la cosa è molto semplice, dato che il carattere RETURN scatena l'evento EnterPressed e quindi gestisci tutto da lì, io con la lettura dei codici a barre ho risolto così.
 

Giorgio Brausi

Member
Licensed User
Longtime User
C'avevo pensato anch'io all'evento EnterPressed, ma francamente mi sembrava strano non si potesse gestire come ho sempre fatto in VB6/VB.NET/C# in tutti questi anni.
Nel caso del barcode, vada, me per tutti gli altri casi dovrò invece trovarmi un qualche workaround.

Grazie Sergio. :)
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Di nulla Giorgio, ci mancherebbe altro.
Ricordati che in questo forum quando qualcuno ti dà una risposta utile è buona norma cliccare sulla destra il link con scritto "Like" per ringraziare ;)
 
Last edited:
Top