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

2022-08-31 16:53:54

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

这是我的日志:

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

答案 1

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

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

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

edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);

请注意代码中有问题的位之前的注释:

这是对某些默认操作的处理。请注意,对于向后兼容性,如果未提供显式 ime 选项,我们不会执行此默认处理,而是将其转换为应用可能期望的正常输入键代码。

如果设置了编辑文本类型,或者如果提供了功能上没有错误的显式 IME,则不会执行此操作。或者有一个可聚焦于下一个或其他任何东西的父对象。它只是回退位中的遗留代码,有时可能没有给定的操作。


答案 2

以前的答案都不适合我。我在 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;
        }
    });

推荐