2010-10-23 12 views
16

Voglio nascondere la tastiera virtuale quando faccio clic sul lato di editbox in una schermata. come posso fare questo?nascondi la tastiera di default al momento del clic in Android

+0

Dovrebbe farlo automaticamente. Finché clicchi da qualche parte che non fa apparire la tastiera stessa – Falmarri

+0

@Falmarri Inizialmente pensavo avessi ragione ma non sono in grado di farlo accadere sulla mia app di test. Scenario testato: 1) fai clic su una vista EditText che fa apparire la tastiera, 2) fai clic su una SeekBar nello stesso Frammento 3) fai clic su un RadioButton con focusable = true. Né 2 né 3 hanno chiuso la tastiera. Questo comportamento suggerito è documentato ovunque? – Nilzor

risposta

31

Per nascondere forzatamente la tastiera si utilizzerà il seguente codice ... L'ho inserito in un metodo chiamato "hideSoftKeyboard()". Come accennato da Falmarri, la softkey dovrebbe nascondere quando si fa clic su di esso. Tuttavia, se chiami questo metodo in un 'onClick()' di un altro elemento, chiuderà forzatamente la tastiera.

private void hideSoftKeyboard(){ 
    if(getCurrentFocus()!=null && getCurrentFocus() instanceof EditText){ 
     InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(yourEditTextHere.getWindowToken(), 0); 
    } 
} 
+0

Non funziona dal 2015 – delive

6

Ho aggiunto quanto segue alla mia attività. Funziona perché toccare una vista focalizzabile non cambia la messa a fuoco (quindi w == v), ma il tocco sarà al di fuori del rettangolo della vista.

public boolean dispatchTouchEvent(MotionEvent event) { 
    View v = getCurrentFocus(); 
    boolean ret = super.dispatchTouchEvent(event); 
    View w = getCurrentFocus(); 
    int scrcoords[] = new int[2]; 
    w.getLocationOnScreen(scrcoords); 
    float x = event.getRawX() + w.getLeft() - scrcoords[0]; 
    float y = event.getRawY() + w.getTop() - scrcoords[1]; 

    Log.d("Activity", "Touch event "+event.getRawX()+","+event.getRawY()+" "+x+","+y+" rect "+w.getLeft()+","+w.getTop()+","+w.getRight()+","+w.getBottom()+" coords "+scrcoords[0]+","+scrcoords[1]); 
    if (event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom())) { 
     inputManager.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0); 
    } 
    return ret; 

} 

[edit: correggere bug minore]

57

dovuto modificare questo per farlo funzionare. Aggiunto un controllo per vedere se la vista focalizzata è un EditText.

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 

    View v = getCurrentFocus(); 
    boolean ret = super.dispatchTouchEvent(event); 

    if (v instanceof EditText) { 
     View w = getCurrentFocus(); 
     int scrcoords[] = new int[2]; 
     w.getLocationOnScreen(scrcoords); 
     float x = event.getRawX() + w.getLeft() - scrcoords[0]; 
     float y = event.getRawY() + w.getTop() - scrcoords[1]; 

     Log.d("Activity", "Touch event "+event.getRawX()+","+event.getRawY()+" "+x+","+y+" rect "+w.getLeft()+","+w.getTop()+","+w.getRight()+","+w.getBottom()+" coords "+scrcoords[0]+","+scrcoords[1]); 
     if (event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom())) { 

      InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0); 
     } 
    } 
return ret; 
} 

Potrebbe probabilmente essere eseguito in modo più agevole ma funziona davvero bene.

+2

Per aggiungere un po 'di chiarezza - se stai cercando di chiudere la tastiera quando l'utente fa clic SEMPRE FUORI DA UN EDITTEXT, e non solo su onClick() di un altro pulsante, il codice di Daniel funziona perfettamente. Basta aggiungere/sovrascrivere il metodo alla tua attività e l'utente sarà in grado di chiudere la tastiera facendo clic in qualsiasi punto al di fuori di un EditText (funziona anche per più EditTexts su un singolo schermo). Grazie Daniele! –

+2

Questa non è una risposta perfetta poiché nasconde la tastiera al tocco, non tocca. Se ad es. scorrere un po ', la tastiera sarà nascosta. Questo spesso non è voluto. – Ixx

+0

@daniel grazie, questo è il genio – bibangamba

6

questo può essere fatto utilizzando il codice seguente:

1) Prendere un punto di riferimento del layout genitore in codice Java utilizzando findViewById().

2) quindi applicare setOnTouchListener() ad esso.

3) Aggiungere il seguente codice in onTouchMethod().

lin = (LinearLayout) findViewById(R.id.lin); 
    lin.setOnTouchListener(new OnTouchListener() 
    { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) 
     { 
       InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
           imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0); 
         return false; 
     } 
    }); 
0
public boolean OutsideTouchEvent(MotionEvent m_event) { 
    View v = getCurrentFocus(); 
    boolean value = super.dispatchTouchEvent(m_event); 
    View w = getCurrentFocus(); 
    int scrcoords[] = new int[2]; 
    w.getLocationOnScreen(scrcoords); 
    float x = m_event.getRawX() + w.getLeft() - scrcoords[0]; 
    float y = m_event.getRawY() + w.getTop() - scrcoords[1]; 

    if (m_event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w.getBottom())) { 
     InputMethodManager inputMethodManager = (InputMethodManager) YourActivity.this.getSystemService(Activity.INPUT_METHOD_SERVICE); 
     inputMethodManager.hideSoftInputFromWindow(YourActivity.this.getCurrentFocus().getWindowToken(), 0); 
    } 
    return value; 

} 
0

set InputType a zero per modificare il testo
editText.setInputType(0);

è un lavoro per me

0

Prima di tutto grazie a Daniel, il suo codice è veramente bello e mi stava usando per un po.

Recentemente ho capito che devo migliorarlo. Il problema era scorrere la pagina. Ho avuto molti EditText s nel mio progetto e nascondeva la tastiera quando si scorre la pagina.

mi si avvicinò con una soluzione che utilizza onGestureListener al posto di rilevante dispatchTouchEvent.

public class TabActivity extends ActionBarActivity implements GestureDetector.OnGestureListener { 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
     ... 
     gestureScanner = new GestureDetector(TabActivity.this,this); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     gestureScanner.onTouchEvent(ev); 
     return super.dispatchTouchEvent(ev); 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent event) { 
     View v = getCurrentFocus(); 

     if (v instanceof EditText) { 
      View w = getCurrentFocus(); 
      int scrcoords[] = new int[2]; 
      w.getLocationOnScreen(scrcoords); 
      boolean hide = true; 

      View view = ((ViewGroup)findViewById(android.R.id.content)).getChildAt(0); 
      ArrayList<View> editTexts = view.getFocusables(0);  // Get All EditTexts in view 

      for(int i=0; i< editTexts.size(); i++){ 
       View editText = editTexts.get(i); 
       editText.getLocationOnScreen(scrcoords); 
       float x = event.getRawX(); 
       float y = event.getRawY(); 
       int viewX = scrcoords[0]; 
       int viewY = scrcoords[1]; 

       // If touch is in any of EditText, keep keyboard active, otherwise hide it. 
       if (event.getAction() == MotionEvent.ACTION_UP && (x > viewX && x < (viewX + editText.getWidth())) && (y > viewY && y < (viewY + editText.getHeight()))) { 
        hide = false; 
       } 
      } 

      if (hide) { 
       InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0); 
      } 
     } 
     return true; 
    } 

    @Override 
    public boolean onScroll(MotionEvent event, MotionEvent e2, float distanceX, float distanceY) { 
     return true; 
    }  
} 

Quindi, se l'utente scorre pagina va a onScroll metodo e non fa nulla. Se gli utenti toccano semplicemente per scattare, attiva il metodo onSingleTapUp.

Ho anche dovuto modificare la dichiarazione del codice di Daniel. Daniel stava controllando se l'evento di tocco fosse fuori dallo EditText. Poiché ho molti EditViews ho cambiato il codice per scoprire se l'evento di tocco è all'interno di uno qualsiasi di EditText s.

Funziona bene con me, fammi sapere per qualsiasi tipo di miglioramento o errore.

+0

View view = ((ViewGroup) findViewById (android.R.id.content)). GetChildAt (0); questa non l'ho capita . Mi spieghi? – Tara

+0

Era un vecchio progetto su cui ho lavorato, non ricordo i dettagli. Fondamentalmente, quello che faccio è recuperare la vista genitore. 'android.R.id.content' ti darà la vista di root. 'getChildAt (0)' è probabilmente usato per recuperare genitore dei miei EditTexts. –

+0

quindi intendi aggiungere tutto il testo di modifica nel gruppo di viste o nella vista interna? – Tara

0

Basta impostare il tipo di ingresso a null come quello

editText.setInputType(InputType.TYPE_NULL);

0

Come supplementare per la risposta accettata.

Se la risposta accettata non funziona per voi, è possibile aggiungere il metodo hideSoftKeyboard() al metodo della onClickListener del vostro EditTextonClick(). Per esempio:

editText.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     hideSoftKeyboard(); 
    } 
}); 

(inserire il codice sopra in onResume() o da qualche altra parte)

ps. la definizione di hideSoftKeyboard()

private void hideSoftKeyboard(){ 
    if(getCurrentFocus()!=null && getCurrentFocus() instanceof EditText){ 
     InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); 
    } 
} 
0

Ho fatto una buona solution.I sanno che sia troppo tardi, ma quando si cerca il più delle volte ottenendo questo link come primo collegamento. quindi potrebbe essere utile per gli altri. Se si fa clic su qualsiasi testo/pulsante si nasconderà la tastiera che è già visibile.

date.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Hide soft keyboard 
     InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); 
      imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); 

     // here i am showing the Date Dialog. one can proceed with their functionality 

      //show date picker dialog 
      showDialog(Date_DIALOG_ID); 
     } 
    }); 
Problemi correlati