2010-12-20 21 views
16

il editText non perde la messa a fuoco nella mia app quando faccio clic, ha il bordo arancione tutto il tempo e quel cursore della linea nera .. Ho fatto questo un LinearLayout in base a ciò che circonda editText : Stop EditText from gaining focus at Activity startup in modo che non venga fuoco inizio del app ..editText non perde lo stato attivo

questo è il mio codice:

final EditText et = (EditText)findViewById(R.id.EditText01); 

final InputMethodManager imm = (InputMethodManager) getSystemService(
    INPUT_METHOD_SERVICE); 

et.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     imm.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT); 
    } 
}); 

et.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
    public void onFocusChange(View v, boolean hasfocus) { 
     if(hasfocus) { 
     imm.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT); 
     } else { 
     imm.hideSoftInputFromWindow(et.getWindowToken(), 0); 
     } 
    } 
}); 

Ma, non sembra essere chiamando l'onFocusChange quando clicco ovunque al di fuori di editText!

+2

Sto vivendo praticamente la stessa cosa. Per quanto ne so, onFocusChange() NON viene generato quando lo stato attivo viene spostato da un EditText all'altro tramite un evento touch. Forse @Overriding onTouch() potrebbe funzionare? Non lo so a portata di mano. –

+0

Problematico questo è. Ora dobbiamo modificare il codice di 'World \ {EditText}' per far funzionare l'edittext. che diavolo ... – Bondax

risposta

1

Creare un listener onClick, possibilmente nel layout XML per ascoltare i clic in background LinearLayout. Da qui puoi chiamare .clearFocus() sul tuo EditText dopo averlo reso una variabile di istanza dell'attività in cui stai lavorando.

+1

non c'è il metodo .cancelFocus() ... –

+2

Penso che intendessi '.clearFocus()' – styler1972

15

È semplice. È possibile inserire il seguente in LinearLayout o qualsiasi altra cosa altro:

android:focusableInTouchMode="true" 
+1

Questa è un'ottima risposta. L'ho usato in RelitiveLayout in modo che nessun EditText si concentri tutto il tempo. +1 – Sevren

0

è possibile rimuovere l'attenzione dal EditText, impostando la messa a fuoco su altro campo chiamando il metodo.

Supponiamo di aver impostato lo stato attivo sul pulsante Indietro al clic del pulsante Fine, quindi di richiamare il metodo sul pulsante Indietro all'interno del pulsante Fai clic sul listener.

E il tuo problema è risolto.

back.requestFocusFromTouch(); 
3

Override Activity.dispatchTouchEvent():

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
     View view = getCurrentFocus(); 
     if (view != null && view instanceof EditText) { 
      Rect r = new Rect(); 
      view.getGlobalVisibleRect(r); 
      int rawX = (int)ev.getRawX(); 
      int rawY = (int)ev.getRawY(); 
      if (!r.contains(rawX, rawY)) { 
       view.clearFocus(); 
      } 
     } 
    } 
    return super.dispatchTouchEvent(ev); 
} 

In questo modo, ogni volta che un utente fa clic da nessuna parte, si ha il controllo, ed è a un solo punto nel codice.

Problemi correlati