2011-10-03 10 views
6

me he dado cuenta de la Android Market Application, cuando se hace clic sobre el botón de búsqueda que muestra el teclado, pero cuando se hace clic en el botón back, la búsqueda EditText se vuelven invisibles y la keyboard está oculto, el problema que yo No puedo ocultar el EditText después de que el teclado está oculto después de presionar la tecla Atrás, porque no puedo encontrar un oyente para ocultar el evento del teclado. me encontré con esta muestra How to capture the "virtual keyboard show/hide" event in Android? pero no funciona en el teclado suaveteclado Ocultar evento con la tecla RETRO

+0

Puede que me equivoque, pero ¿qué hay de ocultar primero el teclado y luego hacer que EditText sea invisible? – banzai86

+0

@ banzai86 sí, eso es lo que estoy tratando de hacer. –

Respuesta

19

que necesita para implementar esta capturar el botón BACK antes de su envío a la IME:

http://developer.android.com/reference/android/view/View.html#onKeyPreIme(int, android.view.KeyEvent)

+1

eres increíble. –

+0

En segundo lugar el impresionante. Después de varias horas de probar varias acciones de enfoque y editor, esto hizo el truco a la perfección. – Geobits

+0

Esto funcionará en Edittext? Eso significa que puedo usar Edittext sin crear una subclase de él? –

3

creo que debe manejar esto con el enfoque:

final InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 

    edttext.setOnFocusChangeListener(new OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if(!(hasFocus)) 
      { 
      mgr.hideSoftInputFromWindow(edttext.getWindowToken(), 0); 
      } 

     } 
    }); 
0

Hola Creo que la aplicación de mercado está utilizando el cuadro de diálogo GoogleSearch (echa un vistazo a Searcheable activity) .

Puede implementar editText en una ventana emergente, y establecer la ventana de usuario como enfocable. Muestra el teclado cuando se muestre tu ventana emergente. en onDismiss ocultar el teclado.

popupWindow.setFocusable(true); 
popupWindow.setOnDismissListener(new OnDismissListener() { 

     @Override 
     public void onDismiss() { 
      // TODO Auto-generated method stub 
      inputMethodManager.hideSoftInputFromWindow(
         edttxtSearchBar.getWindowToken(), 0);   } 

Esto asegurará, hacer clic en cualquier lugar fuera de ventana emergente o presiona hacia atrás la ventana emergente desaparece también (junto con el teclado).

+0

el problema es que, cuando se muestra el teclado, y hace clic en la tecla 'Atrás', el teclado manejará el evento posterior y se ocultará, luego deberá hacer clic en 'Atrás' de nuevo para cerrar 'Ventana emergente' o' Diálogo' –

+0

supongo que es posible que desee anular el botón Atrás y cerrar la ventana emergente de forma manual. – rDroid

0

La aplicación mercado de Google está utilizando fragmentos a través del paquete de compatibilidad con la API. Cuando haces clic atrás, en realidad está retrocediendo en la pila de fragmentos. Es como volver una actividad sin deslizar la pantalla. El fragmento al que regresan no contiene el cuadro de búsqueda y por eso desaparece.

-2
**perfect answer** REFER THIS **SIMPLE EXAMPLE**...ITS TOOOO GOOOODDDD 

      KTBEditTextWithListener.java // Custom edittext 

       import android.content.Context; 
       import android.util.AttributeSet; 
       import android.view.KeyEvent; 

       public class KTBEditTextWithListener extends android.widget.EditText { 

        public KTBEditTextWithListener(Context context) { 
         super(context); 
         // TODO Auto-generated constructor stub 
        } 

        public KTBEditTextWithListener(Context context, AttributeSet attrs, int defStyle) { 
         super(context, attrs, defStyle);   
        // createFont(context); 
       } 

       public KTBEditTextWithListener(Context context, AttributeSet attrs) { 
         super(context, attrs); 
         // createFont(context); 
       } 


        private BackPressedListener mOnImeBack; 

        /* constructors */ 

        @Override 
        public boolean onKeyPreIme(int keyCode, KeyEvent event) { 
         if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { 
          if (mOnImeBack != null) mOnImeBack.onImeBack(this); 
         } 
         return super.dispatchKeyEvent(event); 
        } 

        public void setBackPressedListener(BackPressedListener listener) { 
         mOnImeBack = listener; 
        } 

        public interface BackPressedListener { 
         void onImeBack(KTBEditTextWithListener editText); 
        } 
       } 


    //my_layout.xml 
      <?xml version="1.0" encoding="utf-8"?> 
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:orientation="vertical" > 

       <com.ktb.gopharma.views.KTBEditTextWithListener 
        android:id="@+id/edit_text" 
        style="@style/match_width"> 
        </com.ktb.gopharma.views.KTBEditTextWithListener> 

      </LinearLayout> 

    //MyActivity.java 

      package com.ktb.gopharma; 

      import android.app.Activity; 
      import android.os.Bundle; 
      import android.view.View; 
      import android.view.View.OnClickListener; 

      import com.ktb.gopharma.views.KTBEditTextWithListener; 
      import com.ktb.gopharma.views.KTBEditTextWithListener.BackPressedListener; 
      import com.ktechbeans.gopharma.R; 

      public class MyActivity extends BaseActivity { 
       @Override 
       protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.my_layout); 

        KTBEditTextWithListener editText = (KTBEditTextWithListener) findViewById(R.id.edit_text); 

        editText.setOnClickListener(new OnClickListener() { 
         @Override 
         public void onClick(View view) { 
          showToast("keypad opn"); 
         } 
        }); 

        editText.setBackPressedListener(new BackPressedListener() { 

         @Override 
         public void onImeBack(KTBEditTextWithListener editText) { 
          showToast("keypad close"); 
         } 
        }); 
       } 

      } 
+0

reemplazar el enlace con el código real es mejor ... pero todavía no es perfecto: por favor no publique respuestas idénticas a preguntas múltiples. Publique una buena respuesta, luego vote/marque para cerrar las otras preguntas como duplicados. Si la pregunta no es un duplicado, _aloja tus respuestas a la pregunta_ – kleopatra

Cuestiones relacionadas