致命崩溃:焦点搜索返回了无法获得焦点的视图

问题描述 投票:28回答:7

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

这是我的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" />
java android illegalstateexception
7个回答
17
投票

我遇到了同样的崩溃,虽然听起来不像确切的情况,但这可能仍然有用:

我有两个EditText框。最下面一个是前一个下一个焦点。在某些情况下我会隐藏底部的盒子,所以当我从顶部盒子敲击键盘的下一个时,它会尝试去底部,但是因为它被隐藏了会崩溃。我通过将底部框(另一个EditText的Next Down Focus的目标)设置为不可聚焦来修复此问题:

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

我希望这有帮助。


27
投票

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

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

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

edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);

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

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

如果您设置edittext类型或者如果您提供的功能错误的显式IME,则不会执行此操作。或者让父对象可以在下一个或其他任何东西上聚焦。它只是后备位中的遗留代码,有时可能没有给定的操作。


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

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以避免发生错误。

例如:textView.setOnClickListener(new OnClickListener);


1
投票

我有这个问题,并修复如下:

public void setEditable(boolean flag) {
    mEditText.setFocusableInTouchMode(flag);
    mEditText.setFocusable(flag);
    mEditText.setClickable(flag);
}

0
投票

发生这种情况的原因是当您的EditText具有指定为nextFocusDown的禁用视图时。


© www.soinside.com 2019 - 2024. All rights reserved.