当我在EditText中输入内容时,我的应用程序不断崩溃,但这种情况在某些情况下不会发生。我正在三星Galaxy Tab 2 10.1 WiFI上运行我的应用程序。 3G(GT-P5100)与Android 4.0.4(ICS)。我使用股票键盘。
这是我的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)
这是我的一个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" />
答案 0 :(得分:26)
当ImeOptions设置为EditorInfo.IME_ACTION_NEXT
或EditorInfo.IME_ACTION_PREVIOUS
时,会发生此错误。虽然该视图的父视图不可聚焦,但下一个找到的焦点对象不可聚焦。
它调用以找到应该快速跳转到的下一个焦点项,但这不存在或者不可聚焦,它会引发此错误。如果下一个被隐藏并且因此无法聚焦或者父实际上不能实际处理findFocus()并且返回null,则会发生这种情况。
因此解决方案相当容易。在这种情况下,不要将其设置为IME_ACTION。如果您无法快速从文本字段跳转到文本字段,则可以将该操作设置为可行或将操作切换为完成。
edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);
请注意违规位之前代码中的注释:
这是对某些默认操作的处理。请注意,向后 兼容性我们不做这个默认处理,如果明确的ime 没有给出选项,而是将其变为正常 输入应用可能期望的密钥代码。
如果您设置了edittext类型,或者您提供了一个功能上没有错误的显式IME,则不会这样做。或者让父对象可以在下一个或其他任何东西上聚焦。它只是备用位中的遗留代码,有时可能没有尽可能给定的操作。
答案 1 :(得分:17)
我遇到了同样的崩溃,虽然听起来不是确切的情况,但这可能仍然有用:
我有两个EditText框。最下面一个是前一个下一个焦点。在某些情况下我会隐藏底部的盒子,所以当我从顶部盒子敲击键盘的下一个时,它会尝试去底部,但是因为它被隐藏了会崩溃。我通过将底部框(另一个EditText的Next Down Focus的目标)设置为不可聚焦来修复此问题:
EditText inputBox = (EditText)findViewById(R.id.Bottom_Box);
inputBox.setFocusable(false);
我希望这会有所帮助。
答案 2 :(得分:9)
以前的答案都不适合我。我在recyclerview中使用editText,当下一个editText不在视图中时,它无法获得焦点。
我检查了问题的原因,这是在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;
}
我更新我的editText以侦听任何编辑器操作并执行此操作:
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;
}
});
答案 3 :(得分:4)
我有另一个解决方案,跟踪TextView源代码并匹配您提供的错误日志
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!");
}
}
}
因此,我认为您可以提供View.OnClickListener以避免发生错误。
ex:textView.setOnClickListener(new OnClickListener);
答案 4 :(得分:1)
我遇到了这个问题并修复了这个问题:
public void setEditable(boolean flag) {
mEditText.setFocusableInTouchMode(flag);
mEditText.setFocusable(flag);
mEditText.setClickable(flag);
}
答案 5 :(得分:0)
发生这种情况的原因是当您的EditText的禁用视图指定为nextFocusDown
时。
答案 6 :(得分:-1)