2012-01-14 23 views
10

Ho alcuni intenti all'interno di un controller di tabulazione e per uno di essi ho un testo di modifica che devo sapere con certezza quando è attivo e quando perde questo focus. Ho mappato la maggior parte degli eventi come focus listener, OnEditorActionListener e così via, ora il mio unico problema rimane che quando ho messo a fuoco compare la tastiera virtuale e voglio chiuderla: 1) con il pulsante done e non dal pulsante Indietro sul telefono (disattivare il pulsante Indietro per chiudere la tastiera mentre la tastiera è visibile) 2) rilevare l'evento del pulsante Indietro mentre la tastiera è visibile in modo da poter passare lo stato attivo ad altri controlli.Rileva evento precedente su tastiera Android

Ho provato diversi modi, ma senza successo, come onBackPressed, onConfigurationChanged (aggiungi hiddenKeyboard nel manifest), key_down sull'attività e così via, ma senza successo.

Qualcuno ha avuto successo? Praticamente voglio quando la tastiera è visibile e premo sul telefono, il mio testo di modifica per perdere lo stato attivo (otherControl.requestFocus -> che è un layout relativo).

+0

mi mostra che cosa hai provato finora – confucius

+0

1. questo txtSearchBar .setOnEditorActionListener (new EditText.OnEditorActionListener() \t {\t \t booleano pubblico su EditorAzione (T extView v, int ActionID, KeyEvent evento) \t { \t se (event.getKeyCode() == KEYCODE_BACK) \t { \t \t layoutFocus.requestFocus(); \t \t \t \t} \t reso falso; \t} \t}); 2. metodo 2 on onBackPressed, layoutFocus.requestFocus(); 3.aggiungi hiddenKeyboard nel manifesto per questa attività e mettere \t @Override \t public void onConfigurationChanged (Configuration newconfig) – Catalin

+0

Impossibile aggiungere altro codice come non posso rispondere alla mia domanda, se ho più di 100 punti reputazione :) – Catalin

risposta

2

qui è

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
     if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) 
    { //do you back event work here 
      }  
    return super.dispatchKeyEvent(event); 
} 
+2

Grazie per il codice, ma purtroppo non funziona :(Usando il tuo metodo il tasto Indietro è intrappolato solo quando la tastiera virtuale è già nascosta (dopo aver premuto il pulsante Fine) e poi esce dal programma. la tastiera viene mostrata e premo sul retro, esegue la tastiera nascosta, ma non passa attraverso questo metodo. Sto testando su Android 2.2 e 2.3 – Catalin

+0

Sì perché quando premi indietro e la tastiera è su, solo l'attività della tastiera ascolta che , e torna indietro, puoi riascoltare l'evento se e solo se l'utente preme di nuovo l'attività, in questo caso l'attività della tastiera ascolta questo evento posteriore .. – AAnkit

+0

Un modo per rintracciare il retro dall'attività della tastiera o qualsiasi altro modo per disabilitare il pulsante Indietro funziona mentre la tastiera è attiva? Qualcosa come la sottoclasse di un testo di modifica e la modifica di alcune cose? è possibile? – Catalin

9

argomento vecchio, ma qui è la risposta attesa

@Override 
public boolean onKeyPreIme(int keyCode, KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { 
     Toast.makeText(getContext(), "BACK", Toast.LENGTH_SHORT).show(); 
     return true; 
    } 
    return super.onKeyPreIme(keyCode, event); 
} 

Si dovrebbe mettere questo in una classe che sostituisce EditText (classe MyEditText estende EditText ...)

3

Ecco il modo per catturare di nuovo stampa evento chiave: 1. Estensione vista EditText per ignorare onKeyPreIme

.210
package com.test.test; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.view.KeyEvent; 
import android.widget.EditText; 

/** 
* Created by sumit.saurabh on 11/10/16. 
*/ 

public class ChatEditText extends EditText 
{ 
    /* Must use this constructor in order for the layout files to instantiate the class properly */ 
    public ChatEditText(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     // TODO Auto-generated constructor stub 
    } 

    private KeyImeChange keyImeChangeListener; 

    public void setKeyImeChangeListener(KeyImeChange listener) 
    { 
     keyImeChangeListener = listener; 
    } 

    public interface KeyImeChange 
    { 
     public void onKeyIme(int keyCode, KeyEvent event); 
    } 

    @Override 
    public boolean onKeyPreIme(int keyCode, KeyEvent event) 
    { 
     if (keyImeChangeListener != null) 
     { 
      keyImeChangeListener.onKeyIme(keyCode, event); 
     } 
     return false; 
    } 
} 

2. ChatEditText in xml

<com.test.test.ChatEditText 
    android:id = "@+id/messageEditText" 
    android:layout_width = "match_parent" 
    android:layout_height = "wrap_content" 
    android:layout_gravity = "bottom" 
    android:layout_marginLeft = "12dp" 
    android:layout_marginRight = "30dp" 
    android:background = "@null" 
    android:hint = "Type your message" 
    android:inputType = "textMultiLine" 
    android:singleLine = "false" 
    android:textColorHint = "#c4c0bd" 
    android:textSize = "18sp"/> 

3. quindi collegare un ascoltatore da qualsiasi luogo in questo modo:

private ChatEditText messageEditText; 
    messageEditText = 
     (ChatEditText) findViewById(R.id.messageEditText); 
messageEditText.setKeyImeChangeListener(new ChatEditText.KeyImeChange(){ 
    @Override 
    public void onKeyIme(int keyCode, KeyEvent event) 
    { 
     if (KeyEvent.KEYCODE_BACK == event.getKeyCode()) 
     { 
      // do something 
     } 
    }});