2011-10-03 19 views
6

ho notato il Android Market Application, quando si fa clic su pulsante di ricerca che mostra la tastiera, ma quando si fa clic sul pulsante back, la ricerca EditText diventare invisibile e la keyboard è nascosto, il problema che ho non posso nascondere la EditText dopo che la tastiera è nascosta dopo aver premuto il tasto indietro, perché i cant trovare un listener per nascondere l'evento della tastiera. Ho trovato questo campione How to capture the "virtual keyboard show/hide" event in Android? ma doesnt lavoro sulla tastiera virtualetastiera Nascondi Event con INDIETRO chiave

+0

Potrei sbagliarmi, ma che ne dici di nascondere prima la tastiera e quindi rendere invisibile l'EditText? – banzai86

+0

@ banzai86 sì questo è quello che sto cercando di fare. –

risposta

19

è necessario implementare questo per catturare il tasto BACK prima di essere inviato al IME:

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

+1

sei fantastico. –

+0

I secondo il fantastico. Dopo diverse ore di varie azioni di messa a fuoco e di editing, questo ha fatto il trucco perfettamente. – Geobits

+0

Funzionerà su Edittext? Ciò significa che posso usare su Edittext senza crearne una sottoclasse? –

3

Credo che si dovrebbe gestire questo utilizzando messa a fuoco:

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

Hey Penso che l'applicazione mercato sta usando la finestra di Google (check out Searcheable activity) .

È possibile implementare l'EditText in un PopupWindow, e impostare il poupwindow come attivabile. Mostra la tastiera quando viene mostrato il tuo popup. in onDismiss nasconde la tastiera.

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

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

Questo farà sì, si fa clic su un punto qualsiasi all'esterno popup o si preme di nuovo il popup scompare così (con la tastiera).

+0

il problema è, quando viene visualizzata la tastiera, e si fa clic su 'chiave Back', la tastiera gestirà l'evento indietro, ed essere nascosti, quindi è necessario fare clic' nuovo Back' a respingere il 'PopupWindow' o' Dialog' –

+0

Immagino che potresti voler anche sovrascrivere il pulsante Indietro e chiudere manualmente il popup. – rDroid

0

L'applicazione mercato Google sta utilizzando frammenti tramite il pacchetto API Support. Quando si fa clic su di esso, si torna effettivamente nella pila dei frammenti. È come tornare un'attività senza il passaggio dello schermo. Il frammento a cui ritornano non contiene la casella di ricerca, motivo per cui scompare.

-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

sostituendo il legame con codice vero e proprio è meglio .. ma ancora non perfetta: Si prega di non inviare risposte identiche a più domande. Pubblica una buona risposta, quindi vota/contrassegna per chiudere le altre domande come duplicati. Se la domanda non è un duplicato, aggiungi le tue risposte alla domanda – kleopatra

Problemi correlati