2012-01-14 10 views
10

Tengo algunas intenciones dentro de un controlador de pestañas y para una de ellas tengo un texto de edición que necesito saber con certeza cuando tiene foco y cuando pierde este enfoque. He mapeado la mayoría de los eventos como el detector de enfoque, OnEditorActionListener, y así sucesivamente, ahora mi único problema que queda es que cuando tengo foco aparece el teclado virtual y quiero cerrarlo: 1) con el botón listo y no con el botón Atrás en el teléfono (desactivar el botón Atrás para cerrar el teclado mientras el teclado está visible) 2) detectar el evento del botón Atrás mientras el teclado está visible para poder pasar el foco a otro control.Detectar evento de vuelta en el teclado de Android

He intentado de varias maneras, pero sin éxito, como onBackPressed, onConfigurationChanged (agregue hiddenKeyboard en el manifiesto), key_down en la actividad y así sucesivamente, pero no tuvo éxito.

¿Alguien sucedió esto? Prácticamente quiero que cuando el teclado esté visible y vuelva a presionar el teléfono, mi texto de edición pierda el foco (otherControl.requestFocus -> que es un diseño relativo).

+0

muéstrame lo ha intentado hasta ahora – confucius

+0

1. éste txtSearchBar .setOnEditorActionListener (new EditText.OnEditorActionListener() \t {\t \t public boolean onEditorAction (T extVIEW v, int ActionID, KeyEvent evento) \t { \t si (event.getKeyCode() == KEYCODE_BACK) \t { \t \t layoutFocus.requestFocus(); \t \t \t \t} \t return false; \t} \t}); 2. método 2 en onBackPressed, layoutFocus.requestFocus(); 3.añadir hiddenKeyboard en el manifiesto de esta actividad y poner \t @ Override \t public void onConfigurationChanged (Configuración newconfig) – Catalin

+0

No se puede agregar más código, ya que no puedo responder a mi pregunta si tengo más de 100 puntos de reputación :) – Catalin

Respuesta

2

aquí es

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

Gracias por el código, pero no funciona por desgracia :(Usando su método, la tecla de retroceso queda atrapada solo cuando el teclado virtual ya está oculto (después de presionar el botón Listo) y luego sale del programa. se muestra el teclado y presiono hacia atrás, ejecuta el teclado oculto, pero no pasa por este método. Estoy probando en Android 2.2 y 2.3 – Catalin

+0

Sí, porque cuando presiona hacia atrás y el teclado está activo, solo la actividad del teclado escucha eso , y vuelve atrás, puede escuchar el evento si, y solo si el usuario presiona sobre su actividad, en este caso, la actividad del teclado, escuche este evento retrospectivo. – AAnkit

+0

¿Hay alguna manera de rastrear la parte posterior de la actividad del teclado? el botón de retroceso para trabajar mientras el teclado está activo, algo así como crear subclases de texto de edición y cambiar algunas cosas es posible? – Catalin

9

viejo tema, pero aquí es la respuesta esperada

@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); 
} 

Debería poner esto en una clase que anula EditarTexto (MyEditText clase extiende EditarTexto ...)

3

Aquí está la forma de capturar el evento clave de retroceso: 1. Extensión editText view para sobrescribir onKeyPreIme

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 en 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. A continuación, conecte un oyente desde cualquier lugar de este 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 
     } 
    }}); 
Cuestiones relacionadas