Domanda

Non capisco perché questo pezzo di codice non funziona. Solo backspace e tasto di ritorno vengono rilevati. Listener non viene generato per qualsiasi altro tasto. Il dispositivo è Nexus One.

Ho cercato di ignorare il metodo OnKeyDown di attività e questo è anche peggio. Il pulsante unico rilevato è stato di nuovo il pulsante hardware.

sto vedendo in giro un suggerimento di utilizzare TextWatcher e OnTextChanged, mentre che il lavoro potrebbe, in alcuni casi, non è un vero e proprio lavoro intorno. Per esempio, se casella di testo è vuota, non sarà possibile rilevare utente preme il pulsante Backspace (Delete) se. Così tutte le idee?

        TextView txtInput = (TextView)findViewById(R.id.txtInput);
    txtInput.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            makeToast(keyCode + " key pressed");
            return true;
        }
    });
È stato utile?

Soluzione

Ok. Ho finalmente capito come fare quello che voglio, e io non sono orgoglioso su Android per questo.

vi scrivo applicazione server / client in cui il cliente devo aprire SoftKeyboard e inviare i tasti premuti (caratteri e tasto DEL) ... Ad ogni pressione chiave volta, quel personaggio viene inviato al server. Se si preme DEL io mando successione {} BS al server.

Per fare questo ho dovuto implementare TextWatcher e onTextChange che funziona bene tranne che per situazione quando EditText è vuoto e premere il tasto CANC utente. Poiché non v'è alcun cambiamento nella EditText non v'è alcun modo per rilevare che si preme il tasto CANC.

Oltre a TextWatcher, ho dovuto implementare onKeyListener che ho attaccato al mio controllo EditText. Questo onKeyListener ignora tutti i tasti eccetto SoftKeyboard DEL e RETURN. Non so perché? Un bug forse?

Ecco il mio codice:

    TextView txtInput = (TextView)findViewById(R.id.txtInput);
    txtInput.addTextChangedListener(inputTextWatcher);

    txtInput.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.d(TAG, keyCode + " character(code) to send");
            return false;
        }
    });

e TextWatcher ....

private TextWatcher inputTextWatcher = new TextWatcher() {
    public void afterTextChanged(Editable s) { }
    public void beforeTextChanged(CharSequence s, int start, int count, int after)
        { }
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Log.d(TAG, s.charAt(count-1) + " character to send");;          
    }
};

Altri suggerimenti

Hai fatto un errore qui.
dovrebbe return true, Se hai gestito l'evento. Se si desidera permettere l'evento per essere gestito dal ricevitore successivo , return false
Sei sempre restituendo true

Nota:. InputType menzione nella vostra EditText

<EditText android:id="@+id/select_category" 
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textCapSentences|textAutoCorrect" >



edittext.setOnEditorActionListener(new OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

                if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) {
                    //do something here.
                    return true;
                }
                return false;
            }
        });

Hai provato a usare la sottoclasse specifica listener per quella vista?

Ho avuto un problema simile con un EditText. Il codice qui sotto lavorato:

private OnKeyListener keyListener = new EditText.OnKeyListener(){

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        EditText et = (EditText) v;
        Log.i("APPEVENT", "Key hit: "+ event);
        //...
        return false;
    }

};

Ma se ho usato il View.OnKeyListener, ho solo backspace registrare e immettere. Potrebbe essere un problema simile con TextView. Forse gli ascoltatori chiave sottoclasse sono sensibili a più eventi per la data sottoclasse View.

Abbiamo avuto il problema TextWatcher su iPhone, come pure - se buffer è vuoto, la tastiera non invia del evento. Abbiamo lavorato intorno ad esso da precaricare il buffer della tastiera con 1000 caratteri. Per fortuna, la nostra applicazione nascondeva il campo di modifica dietro la tastiera in modo che i 1000 caratteri non si vedono. E 'brutto, ma funziona (a meno che l'utente preme 1000 elimina in una fila prima di entrare in dati!)

Referencing da:

http://developer.android.com/reference/android /view/View.OnKeyListener.html

View.OnKeyListener

definizione Class Panoramica Interfaccia per un callback da richiamare quando un evento chiave hardware viene inviato a questo punto di vista. La richiamata viene chiamato prima che l'evento chiave è dato alla vista. Questo è utile solo per le tastiere hardware; un metodo di input software ha l'obbligo di attivare questo ascoltatore.

Sembra OnKeyListener stato progettato per chiavi hardware solo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top