2012-01-07 9 views
16

Ho un singolo EditText sul mio layout. Dopo che l'utente ha inserito del testo e premuto il tasto "done", vorrei rimuovere il cursore lampeggiante da esso. Ho setacciato per StackOverflow e ho trovato 3 risposte che non hanno funzionato per me. Il cursore lampeggiante rimane comunque.Come rimuovere lo stato attivo da EditText quando l'utente ha finito di modificare?

private class MyOnKeyListener implements OnKeyListener { 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN 
    && keyCode == KeyEvent.KEYCODE_ENTER) { 
     // FAIL 0 
     MyActivity.this.findViewById(R.id.someOtherView).requestFocus(); 

     // FAIL 1 
     InputMethodManager imm = (InputMethodManager)getSystemService(
     Context.INPUT_METHOD_SERVICE 
    ); 
     imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 

     // FAIL 2 
     MyActivity.this.getWindow().setSoftInputMode(
     WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN 
    ); 

     return true; 
    } else { 
     return false; 
    } 
    } 
} 

risposta

23

È possibile utilizzare un attributo XML,

android:cursorVisible 

o si può farlo in codice con questo metodo.

setCursorVisible(boolean). 
+0

Questo l'ha risolto. Fa anche la cosa giusta rivelando il cursore quando la tastiera è aperta. Nasconde il cursore solo quando non lo stai modificando. – JoJo

+0

WIsh Potrei dare più voti quando ho trovato 10 altre complicate risposte che non funzionavano prima di trovare questo. Grazie. – Glenn

+0

Ho questo problema: http://stackoverflow.com/questions/23677895/saving-an-edittext-to-bitmap ----- Con questa soluzione, anche il pin è nascosto! Ma voglio nascondere solo la linea lampeggiante verticale. –

1

è sufficiente impostare lo stato attivo sul pulsante Fine.

+1

Non è questo il suo esempio di fallimento 0? – Dante

-1

se non si desidera che sia modificabile, direi di seguito;

EditText orgid; 
orgid.setText(user.getOrgId()); 
orgid.setEnabled(false); 
2

Fail 0:

Calling .requestFocus() su qualche elemento di layout non è sufficiente se l'elemento non è attivabile in modalità touch. Se si desidera impostare la messa a fuoco la vista o il pulsante si deve chiamare

.setFocusableInTouchMode(true); 

prima o impostarla in .xml

+0

Ha risolto il problema per me. Grazie! –

10

Utilizza il codice qui sotto per rimuovere l'attenzione dal EditText

editText.setOnKeyListener(new OnKeyListener() { 
      public boolean onKey(View view, int keyCode, KeyEvent event) { 
       if (keyCode == KeyEvent.KEYCODE_ENTER) { 
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.hideSoftInputFromWindow(URLText.getWindowToken(), 0); 
        editText.setFocusable(false); 
        editText.setFocusableInTouchMode(true); 
        return true; 
       } else { 
        return false; 
       } 
      } 
     }); 
+0

ricerche negli ultimi 2 giorni ... ottenendo molte soluzioni .. niente ha funzionato ... la tua soluzione è eccellente .. ty – Abhi

+1

Che cos'è URLText? –

6

Ecco il mio EditText personalizzato che rilevano se la tastiera sta mostrando & rimuovere automaticamente messa a fuoco quando la tastiera è nascosta

/** 
* Created by TheFinestArtist on 9/24/15. 
*/ 
public class KeyboardEditText extends EditText { 

    public KeyboardEditText(Context context) { 
     super(context); 
    } 

    public KeyboardEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public KeyboardEditText(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public void setOnTouchListener(OnTouchListener l) { 
     super.setOnTouchListener(l); 
    } 

    @Override 
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 
     super.onFocusChanged(focused, direction, previouslyFocusedRect); 
     if (listener != null) 
      listener.onStateChanged(this, true); 
    } 

    @Override 
    public boolean onKeyPreIme(int keyCode, @NonNull KeyEvent event) { 
     if (event.getKeyCode() == KeyEvent.KEYCODE_BACK 
       && event.getAction() == KeyEvent.ACTION_UP) { 
      if (listener != null) 
       listener.onStateChanged(this, false); 

      // Hide cursor 
      setFocusable(false); 

      // Set EditText to be focusable again 
      setFocusable(true); 
      setFocusableInTouchMode(true); 
     } 
     return super.onKeyPreIme(keyCode, event); 
    } 

    /** 
    * Keyboard Listener 
    */ 
    KeyboardListener listener; 

    public void setOnKeyboardListener(KeyboardListener listener) { 
     this.listener = listener; 
    } 

    public interface KeyboardListener { 
     void onStateChanged(KeyboardEditText keyboardEditText, boolean showing); 
    } 
} 
+1

Questo non funziona. Il metodo 'onKeyPreIme' non viene chiamato. – rkyr

+0

@rkyr perché? sta funzionando per me, ho provato diversi dispositivi –

+0

@ KirillVashilo, non posso dire ora. È passato un po 'di tempo da quando ho affrontato quel problema. Probabilmente sul dispositivo KitKat – rkyr

Problemi correlati