55

当我在 EditText 中键入内容时,我的应用程序不断崩溃,但这并不总是仅在某些情况下发生。我在装有 Android 4.0.4 (ICS) 的三星 Galaxy Tab 2 10.1 WiFI 和 3G (GT-P5100) 上运行我的应用程序。我使用股票键盘。

这是我的日志:

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)

这是我的编辑文本之一:

    <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" />
4

7 回答 7

59

当 ImeOptions 设置为EditorInfo.IME_ACTION_NEXT或时会发生此错误EditorInfo.IME_ACTION_PREVIOUS。虽然该视图的父级不可聚焦,或者下一个找到的焦点对象不可聚焦。

它调用查找应该快速跳转到的下一个焦点项目,但它不存在或不可聚焦,它会引发此错误。如果下一个被隐藏因此无法聚焦,或者父级实际上无法处理 findFocus() 调用并返回 null,则会发生这种情况。

因此,解决方案相当容易。在这种情况下,不要将其设置为 IME_ACTION。如果您不能快速从文本字段跳转到文本字段,那么要么使该操作可行,要么将操作切换为 DONE。

edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);

请注意代码中违规位之前的注释:

这是一些默认操作的处理。请注意,为了向后兼容,如果没有给出明确的 ime 选项,我们不会执行此默认处理,而是将其转换为应用程序可能期望的正常输入键代码。

如果你设置了 edittext 类型或者你给出了一个在功能上没有错误的显式 IME,它就不会这样做。或者有一个可以关注下一个或其他任何东西的父对象。它只是后备位中的遗留代码,有时可能没有给定的操作。

于 2017-12-27T11:44:26.513 回答
24

以前的答案都不适合我。我在 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 view = focusSearch(FOCUS_FORWARD);
            if (view != null) {
                if (!view.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 textView, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_NEXT) {
                View view = textView.focusSearch(FOCUS_FORWARD);
                if (view != null) {
                    if (!view.requestFocus(FOCUS_FORWARD)) {
                        return true;
                    }
                }
               return false;
            } 
            return false;
        }
    });
于 2018-03-22T16:04:51.713 回答
23

我遇到了同样的崩溃,虽然这听起来不像是确切的情况,但也许这仍然会有所帮助:

我有两个 EditText 框。底部是顶部的 Next Focus Down。在某些情况下,我会隐藏底部框,因此当我从顶部框按键盘上的下一步时,它会尝试转到底部框,但由于它被隐藏而会崩溃。我通过将底部框(另一个 EditText 的 Next Down Focus 的目标)设置为不可聚焦来解决此问题:

    EditText inputBox = (EditText)findViewById(R.id.Bottom_Box);
    inputBox.setFocusable(false);

我希望这有帮助。

于 2013-01-07T02:37:56.917 回答
4

我有另一个解决方案,跟踪 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 以避免发生错误。

例如:textView.setOnClickListener(new OnClickListener);

于 2015-08-03T10:12:45.547 回答
2

只需在您的编辑文本中添加以下属性。 android:imeOptions="actionDone"

<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" 
    android:imeOptions="actionDone"
/>
于 2022-01-13T06:22:54.373 回答
1

我遇到了这个问题并像这样修复它:

public void setEditable(boolean flag) {
    mEditText.setFocusableInTouchMode(flag);
    mEditText.setFocusable(flag);
    mEditText.setClickable(flag);
}
于 2017-05-16T11:34:31.330 回答
0

发生这种情况的一个原因是当您的 EditText 有一个禁用的视图指定为nextFocusDown.

于 2019-03-08T10:53:03.860 回答