Accident mortel: Focus search a renvoyé une vue qui n'a pas pu prendre le focus
Mon application continue de se bloquer lorsque je tape quelque chose dans un EditText, mais cela n'arrive pas toujours seulement dans certains cas. Je cours mon application sur un Samsung Galaxy Tab 2 10.1 WiFI & 3G (GT-P5100) avec Android 4.0.4 (ICS). J'utilise le clavier stock.
Ceci est mon logcat:
11-28 21:43:01.007: E/AndroidRuntime(15540): java.lang.IllegalStateException: focus search returned a view that wasn't able to take focus!
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.widget.TextView.onKeyUp(TextView.java:5833)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.view.KeyEvent.dispatch(KeyEvent.java:2659)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.view.View.dispatchKeyEvent(View.java:5547)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1246)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1246)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1246)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1246)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1246)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1246)
11-28 21:43:01.007: E/AndroidRuntime(15540): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2027)
11-28 21:43:01.007: E/AndroidRuntime(15540): at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1388)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.app.Activity.dispatchKeyEvent(Activity.java:2324)
11-28 21:43:01.007: E/AndroidRuntime(15540): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1954)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3360)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2618)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.os.Handler.dispatchMessage(Handler.java:99)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.os.Looper.loop(Looper.java:137)
11-28 21:43:01.007: E/AndroidRuntime(15540): at android.app.ActivityThread.main(ActivityThread.java:4514)
11-28 21:43:01.007: E/AndroidRuntime(15540): at java.lang.reflect.Method.invokeNative(Native Method)
11-28 21:43:01.007: E/AndroidRuntime(15540): at java.lang.reflect.Method.invoke(Method.java:511)
11-28 21:43:01.007: E/AndroidRuntime(15540): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
11-28 21:43:01.007: E/AndroidRuntime(15540): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
11-28 21:43:01.007: E/AndroidRuntime(15540): at dalvik.system.NativeStart.main(Native Method)
C'est mon un de mes EditTexts:
<EditText
android:id="@+id/input_ftu_position_other"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="64dp"
android:ems="20"
android:inputType="text" />
6 réponses
J'avais ce même crash et bien que cela ne ressemble pas à la situation exacte, peut-être que cela sera toujours utile:
J'avais deux boîtes EditText. Le fond était la prochaine mise au point vers le bas du haut. Dans certaines situations, je cachais la boîte du bas, donc quand je frappais suivant sur le clavier de la boîte du haut, il essayait d'aller en bas, mais plantait car il était caché. J'ai corrigé cela en définissant la boîte du bas (la cible de la prochaine mise au point D'un autre EditText) comme non focusable:
EditText inputBox = (EditText)findViewById(R.id.Bottom_Box);
inputBox.setFocusable(false);
J'espère que cela aide.
Cette erreur se produit lorsque ImeOptions est défini sur EditorInfo.IME_ACTION_NEXT
ou EditorInfo.IME_ACTION_PREVIOUS
. Alors que le parent de cette vue n'est pas focusable, ou que l'objet focus suivant trouvé n'est pas focusable.
Il appelle pour trouver l'élément de focus suivant qui devrait être rapidement sauté mais cela n'existe pas ou n'est pas focalisable, il lance cette erreur. Cela se produira si le suivant est caché et donc non focalisable ou si le parent ne peut pas réellement gérer l'appel findFocus() et renvoie null.
La solution est donc plutôt facile. Ne le définissez pas sur IME_ACTION comme suivant dans ce cas. Si vous ne pouvez pas passer rapidement d'un champ de texte à un champ de texte, rendez-le faisable ou passez l'action en cours.
edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);
Notez le commentaire dans le code avant le bit incriminé:
C'est la gestion de certaines actions par défaut. Notez que pour en arrière compatibilité nous ne faisons pas cette gestion par défaut si IME explicite les options n'ont pas été données, transformant plutôt cela en normal entrez les codes clés qu'un app attend peut-être.
Cela ne le fera pas si vous définissez le type edittext ou si vous donnez un IME explicite qui n'est pas fonctionnellement incorrect. Ou avoir un objet parent qui peut être focalisé sur le suivant ou toute autre chose. C'est seulement du code hérité dans un bit de secours qui peut parfois ne pas avoir l'action donnée que possible.
J'ai une autre solution, pour tracer les codes source TextView et faire correspondre le journal des erreurs que vous avez fourni
TextView.java:
if (!hasOnClickListeners()) {
View v = focusSearch(FOCUS_DOWN);
if (v != null) {
if (!v.requestFocus(FOCUS_DOWN)) {
throw new IllegalStateException(
"focus search returned a view " +
"that wasn't able to take focus!");
}
}
}
En conséquence, je pense que vous pourriez donner vue.OnClickListener pour éviter l'erreur s'est produite.
Ex: textView.setOnClickListener (nouveau OnClickListener);
Aucune des réponses précédentes n'a fonctionné pour moi. J'avais editText dans recyclerview et le prochain editText ne pouvait pas recevoir le focus quand il n'était pas en vue.
J'ai vérifié la cause du problème et c'était ceci dans la classe TextView:
// This is the handling for some default action.
// Note that for backwards compatibility we don't do this
// default handling if explicit ime options have not been given,
// instead turning this into the normal enter key codes that an
// app may be expecting.
if (actionCode == EditorInfo.IME_ACTION_NEXT) {
View v = focusSearch(FOCUS_FORWARD);
if (v != null) {
if (!v.requestFocus(FOCUS_FORWARD)) {
throw new IllegalStateException("focus search returned a view "
+ "that wasn't able to take focus!");
}
}
return;
}
Je mets à jour mon editText pour écouter toutes les actions de l'éditeur et j'ai fait ceci:
companyNameET.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_NEXT) {
View v1 = v.focusSearch(FOCUS_FORWARD);
if (v1 != null) {
if (!v.requestFocus(FOCUS_FORWARD)) {
return true;
}
}
return false;
} else return false;
}
});
J'ai eu ce problème et résolu comme ceci:
public void setEditable(boolean flag) {
mEditText.setFocusableInTouchMode(flag);
mEditText.setFocusable(flag);
mEditText.setClickable(flag);
}
Je crois que cela peut être un bug de périphérique, par exemple: