2010-12-20 5 views
16

le editText ne perd pas le focus dans mon application quand je clique sur le bouton, il a la bordure orange à tous les temps et ce curseur de ligne noire .. J'ai fait un LinearLayout en fonction de ce qui entoure le editText : Stop EditText from gaining focus at Activity startup afin qu'il ne soit pas se concentrer sur le début de l'application ..editText ne perd pas le focus

ceci est mon code:

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); 
     } 
    } 
}); 

Mais, il ne semble pas appeler le onFocusChange quand je clique partout en dehors de l'editText!

+2

Je vis à peu près la même chose. Autant que je sache, onFocusChange() n'est pas généré lorsque le focus est déplacé d'un EditText à un autre via un événement tactile. Peut-être @Overriding onTouch() pourrait-il fonctionner? Je ne sais pas de la main. –

+0

Problème c'est. Maintenant, nous devons modifier le code de 'World \ {EditText}' pour que le fichier edittext fonctionne. que diable ... – Bondax

Répondre

1

Créez un programme d'écoute onClick, éventuellement dans votre mise en page XML pour écouter les clics en arrière-plan LinearLayout. De là, vous pouvez appeler .clearFocus() sur votre EditText après en avoir fait une variable d'instance de l'activité dans laquelle vous travaillez.

+1

il n'y a pas de méthode .cancelFocus() ... –

+2

Je pense que je voulais dire '.clearFocus()' – styler1972

15

C'est simple. Vous pouvez mettre ce qui suit dans LinearLayout ou tout autre autre:

android:focusableInTouchMode="true" 
+1

Ceci est une excellente réponse. Je l'ai utilisé dans RelitiveLayout afin qu'aucun EditText n'ait le focus tout le temps. +1 – Sevren

0

Vous pouvez enlever le focus du EditText, en mettant l'accent sur les autres champs en appelant la méthode.

Supposons que je mette le focus sur le bouton de retour en cliquant sur le bouton terminé, puis appelez la méthode sur le bouton de retour à l'intérieur de l'écouteur de clic sur le bouton done.

Et votre problème est résolu.

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); 
} 

De cette façon, chaque fois que quelqu'un clique partout, vous avez le contrôle, et il est en un seul point dans le code.

Questions connexes