Autore Topic: Intercettare eventi della tastiera  (Letto 2056 volte)

Offline Giampiero

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy tab 10.1
  • Sistema operativo:
    Mac OS X 10.7
Intercettare eventi della tastiera
« il: 31 Ottobre 2011, 12:27:06 CET »
0
Buongiorno a tutti,
sono nuovo del forum e sto affrontando il mio primo progetto su piattaforma android.
Come da oggetto ho la necessità di intercettare la pressione dei tasti durante la digitazione.
Il controllo mi serve per calcolare i tempi di digitazione tra una pressione e l' altra per fare delle operazione in funzione del tempo.
Ho provato con questo codice:
 Testo.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
               //fai qualcosa
                return false;
            }
        });
purtroppo nutra nel metodo solo quando premo "invio" "TAB" "back"
e non alla digitazione di un carattere, potete aiutami.
Grazie per la disponibilità.

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Intercettare eventi della tastiera
« Risposta #1 il: 31 Ottobre 2011, 13:41:42 CET »
0
Ciao,
prova con questo:
Codice: [Seleziona]
text.setKeyListener(new KeyListener() {
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
 
 
        if(keyCode == KeyEvent.KEYCODE_0) dosomething // pick the custom key from keyEvent
 
 
        return super.onKeyUp(keyCode, event);
    }
});
Dovresti intercettare anche i pulsanti speciali come ad esempio il back lo shift ecc.
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline Giampiero

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy tab 10.1
  • Sistema operativo:
    Mac OS X 10.7
Re:Intercettare eventi della tastiera
« Risposta #2 il: 01 Novembre 2011, 10:59:16 CET »
0
Ho provato e riprovato ma non riesco ad intercettare la pressione dei tasti caratteri, il codice è il seguente:
Codice (Java): [Seleziona]
Testo=(EditText)findViewById(R.id.editText1);
        Testo.setKeyListener(new KeyListener() {

            @Override
            public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) {
                return false;
            }

            @Override
            public boolean onKeyOther(View view, Editable text, KeyEvent event) {
                return true;
            }

            @Override
            public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) {
                return true;
            }

            @Override
            public int getInputType() {
                return 1;
            }

            @Override
            public void clearMetaKeyState(View view, Editable content, int states) {

            }
        });
« Ultima modifica: 01 Novembre 2011, 12:33:04 CET da Verandi »

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Intercettare eventi della tastiera
« Risposta #3 il: 01 Novembre 2011, 12:39:53 CET »
0
Ciao! Credo che l'errore sia nel "return true".
Se ritorni true nell"onKeyDown(), indichi che stai gestendendo tu l'evento, quindi immagino si creino dei problemi nella gestione degli eventi successivi.
Prova a ritornare sempre false.
Codice (Java): [Seleziona]
  @Override
            public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) {

                return false;
            }
e così per tutti gli altri metodi.  ;-)
« Ultima modifica: 01 Novembre 2011, 12:49:32 CET da Verandi »

Offline Giampiero

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy tab 10.1
  • Sistema operativo:
    Mac OS X 10.7
Re:Intercettare eventi della tastiera
« Risposta #4 il: 01 Novembre 2011, 20:24:29 CET »
0
Dopo vari tentativi ho visto che:
se eseguo il codice sulla' emulatore funziona, quando lo eseguo sul Samsung galaxy tab 10.1 v non c' è verso d' intercettare i tasti carattere.

Offline Giampiero

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy tab 10.1
  • Sistema operativo:
    Mac OS X 10.7
Re:Intercettare eventi della tastiera
« Risposta #5 il: 05 Novembre 2011, 15:40:50 CET »
0
Scusate ma a distanza di una settimana non riesco a fare ciò che devo.
Provo a riformulare le mie esigenze ed i problemi che sto riscontrando.
Devo sviluppare un applicazione per bambini con gravi disabilità motorie e di comunicazione.
La piattaforma è android 3.0 il dispositivo  un samsung galaxy tab 10.1 v.
I bambini scrivono sulla tavoletta e poi pigiando un button traduco in sintesi ciò che anno scritto.
Fino qui tutto bene.
Il problema è controllare la tastiera del dispositivo, infatti questi poveri bimbi non solo non riescono ad esprimersi con la parola ma hanno gravi deficit motori per cui non vi dico le ripetizioni dei tasti perché toccati più volte, o errori di digitazione.
Ora il mio intento, già fatto su dispositivi pocket pc a ipad, è quello di controllare i tempi di pressione sulla keybord software del galaxy tab 10.2.
Non riesco ad intercettare gli eventi keydown e keyup, o meglio non vengono invocati se si preme un carattere. se non trovo riferimenti proverò a contattare samsung.
Grazie

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Intercettare eventi della tastiera
« Risposta #6 il: 05 Novembre 2011, 16:00:29 CET »
0
Complimenti per quello che stai facendo per questi bambini  :-)

Prova questo codice l'ho trovato su stackoverflow:
Codice: [Seleziona]
EditText tv_filter = (EditText) findViewById(R.id.filter);
 
TextWatcher fieldValidatorTextWatcher = new TextWatcher() {
        @Override
        public void afterTextChanged(Editable s) {
        }
 
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
 
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (filterLongEnough()) {
                populateList();
            }
        }
 
        private boolean filterLongEnough() {
            return tv_filter.getText().toString().trim().length() > 2;
        }
    };
    tv_filter.addTextChangedListener(fieldValidatorTextWatcher);

È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline Giampiero

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy tab 10.1
  • Sistema operativo:
    Mac OS X 10.7
Re:Intercettare eventi della tastiera
« Risposta #7 il: 05 Novembre 2011, 16:20:38 CET »
0
Ho già provato,
il metodo
Citazione
@Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
viene invocato dopo il "keyup" per cui troppo tardi per gestire i tempi di pressione.
Probabilmente l 'input da tastiera software viene gestito in altro modo, solo non trovo nessi riferimento.

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Intercettare eventi della tastiera
« Risposta #8 il: 05 Novembre 2011, 16:40:53 CET »
0
Ma a te interessa sapere il tempo che c'è tra una pressione ed una consecutiva ?

EDIT:Hai provato
public void beforeTextChanged(CharSequence s,
int start, int count, int after)
{
                        
}

EDIT:Sto impazzendo scusa.Ora provo con il keyup
« Ultima modifica: 05 Novembre 2011, 17:02:42 CET da Luigi.Arena »
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Intercettare eventi della tastiera
« Risposta #9 il: 05 Novembre 2011, 17:16:45 CET »
0
prova questo:
Codice: [Seleziona]
private void MostroAvviso()
{
 Toast.makeText(this, "troppo lungo", Toast.LENGTH_LONG).show();
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent keyEvent)
{
        // Return true if the event was handled.
        MostroAvviso();
        return true;
}
Questo dovrebbe intercettare tutti gli onkeyup di tutte le view che lo implementano.
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Intercettare eventi della tastiera
« Risposta #10 il: 05 Novembre 2011, 19:31:52 CET »
0
Ho provato con l'emulatore del galaxytab, ed effettivamente i caratteri non vengono passati se digitati dalla tastiera software. Immagino lo stesso accada anche con altri dispositivi.
Ho cercato un po' in giro e ho trovato questo intervento di Dianne Hackborn, ingegnere software presso Android:
Citazione
The IME does not send you raw keyboard events. It may not even *have* raw keyboard events. Consider a handwriting IME, for example. That is why the interaction with it is through InputConnection. Every interaction you can have with the IME is basically through InputConnection.

Note that on a soft keyboard, it *will* make calls on to InputConnection for each key pressed, to tell you about the text that should now be shown.

Quindi, a quanto pare, il keylistener è inutile per intercettare gli eventi della tastiera software perché non tutte le tastiere passano tutti gli eventi. Credo che l'unico modo per poter intercettare il keydown e il keyup sia creare una propria tastiera, magari modificando il codice della tastiera di Android.

Una cosa: come mai ti serve sapere il tempo di pressione di un tasto?


« Ultima modifica: 06 Novembre 2011, 12:04:05 CET da Verandi »

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Intercettare eventi della tastiera
« Risposta #11 il: 05 Novembre 2011, 23:24:32 CET »
0
Ho provato con l'emulatore del galaxytab, ed effettivamente i caratteri non vengono passati se digitati dalla tastiera software. Immagino lo stesso accada anche con altri dispositivi.
Ciao,vorrei capire bene il problema,cosa vuoldire " i caratteri non vengono passati se digitati dalla tastiera software" , la tastiera non è la classica tastiera che si apre quando do il focus ad un edittext ?Se così fosse come fanno a funzionare i software dove usano l'autocompletamento della parola ?
Grazie
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Intercettare eventi della tastiera
« Risposta #12 il: 06 Novembre 2011, 11:24:33 CET »
0
Premetto che non ho letto tutto il topic.
Hai dato un'occhiata a questo?
TextWatcher | Android Developers
Citazione
When an object of a type is attached to an Editable, its methods will be called when the text is changed.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Intercettare eventi della tastiera
« Risposta #13 il: 06 Novembre 2011, 11:57:58 CET »
0
Ciao,vorrei capire bene il problema,cosa vuoldire " i caratteri non vengono passati se digitati dalla tastiera software" , la tastiera non è la classica tastiera che si apre quando do il focus ad un edittext ?Se così fosse come fanno a funzionare i software dove usano l'autocompletamento della parola ?
Grazie

Ciao! Effettivamente quella frase è poco chiara. Intendevo che, nell'emulatore del galaxytab e probabilmente anche nell'emulatore normale, il listener non riceve gli eventi keyup e keydown dei tasti carattere se digitati dalla tastiera software, mentre li riceve se digitati dalla tastiera "hardware".
Ciò è in linea con quanto citato nel mio post precedente, ovvero la tastiera software è un IME (input method), e un ime può non generare degli eventi keyup e keydown, come nel caso di un handwriting ime.
La tastiera software (latinIME), a quanto pare passa al listener solo gli eventi relativi ai tasti numerici di "se stessa" e tutti gli eventi della tastiera hardware che riceve implementando un keylistener (infatti nella documentazione dell'interfaccia KeyListener c'è scritto: "it should only be used for cases where an application has its own on-screen keypad and also wants to process hard keyboard events to match it. ").
 A meno che non ci sia qualche altro metodo, credo che l'unico modo per misurare il tempo di pressione di un tasto della tastiera software sia crearne una!  ;-)
« Ultima modifica: 06 Novembre 2011, 12:05:12 CET da Verandi »

Offline Giampiero

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy tab 10.1
  • Sistema operativo:
    Mac OS X 10.7
Re:Intercettare eventi della tastiera
« Risposta #14 il: 06 Novembre 2011, 12:50:09 CET »
0
Mi ci sono dedicato un altro po' ed in effetti per gestire il "KeyDown" e il "KeyUp" per misurare i tempi di pressione dei tasti carattere è creare una tastiera ad hoc :-o >:( , grazie a tutti per la disponibilità :-).
@ Verandi
Il tempo intercorso dai mitici eventi Keydown e KeyUp mi serve per filtrare/validare la digitazione, se è inferiore ad un certo tempo non considero la digitazione.