【问题标题】:Is there a way to track this exception: focus search returned a view that wasn't able to take focus有没有办法跟踪这个异常:焦点搜索返回了一个无法获得焦点的视图
【发布时间】:2017-12-20 22:20:05
【问题描述】:

我使用 Crashlytics 获得了一些崩溃日志,其中包含以下堆栈:

Fatal Exception: java.lang.IllegalStateException: focus search returned a view that wasn't able to take focus!
   at android.widget.TextView.onKeyUp(TextView.java:6413)
   at android.view.KeyEvent.dispatch(KeyEvent.java:2712)
   at android.view.View.dispatchKeyEvent(View.java:9960)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1630)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1630)
   at android.widget.ScrollView.dispatchKeyEvent(ScrollView.java:387)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1630)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1630)
   at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1630)
   at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:406)
   at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1798)
   at android.app.Activity.dispatchKeyEvent(Activity.java:3024)
   at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:320)
   at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4331)
   at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4302)
   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853)
   at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906)
   at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872)
   at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3999)
   at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3880)
   at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4056)
   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853)
   at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906)
   at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872)
   at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3880)
   at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853)
   at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6247)
   at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6221)
   at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6182)
   at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3651)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6121)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

我能找到的最接近的答案在这里:Fatal crash: Focus search returned a view that wasn't able to take focus

但我的问题是,我如何追踪这次崩溃的根源? 很难指出它,因为崩溃日志对实际崩溃的确切来源不够解释

【问题讨论】:

  • 哪个Android版本受到影响?我在 Android 7.1.2 和 Android 8.0.0 下看到过​​这种情况,但前提是使用旧主题。您可以尝试使用 activity.setTheme 设置现代主题或兼容性主题。这并不能回答您如何跟踪崩溃源的问题,但也许可以解决崩溃问题。

标签: android android-edittext keyboard textview


【解决方案1】:

我只发生在水平方向上, 因为editText占据了所有屏幕并自动添加了“下一步”按钮。 当我点击“下一步”时,应用程序崩溃了。

解决办法是通过以下方式阻止editText填满整个activity:

android:imeOptions="flagNoExtractUi"

【讨论】:

    【解决方案2】:

    我也用这个来解决这个问题:

    editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
    

    只是设置为我的 editText de ImeOptions。我希望这个对你有用。

    【讨论】:

    • 对于任何想知道的人 - “操作键执行“完成”操作,通常意味着没有更多内容可输入,IME 将被关闭”
    【解决方案3】:

    我通过显式提供 EditText 的 focusSearch 方法返回的值解决了我的项目中的这个崩溃问题。 (否则,Android 将自行解决它认为的下一个可聚焦视图)。子类 EditText 并提供此附加代码:

    private MyEditText nextFocusField;
    
    @Override
    public View focusSearch(@ViewCompat.FocusRealDirection int direction) {
        if (direction == FOCUS_DOWN) {
            return (View) nextFocusField;
        }   
        return super.focusSearch(direction);
    }   
    
    public void setNextFocusField(MyEditText nextFocusField) {
        this.nextFocusField = nextFocusField;
    }
    

    然后在我的片段类中设置 EditText,我确保为每个字段提供下一个 EditText。按照我想要的顺序将它们收集到一个 ArrayList 中后,我将它们分配如下:

    int editTextCount = editTexts.size();
    for (int i = 0;  i < editTextCount;  i++) {
        MyEditText editText = (MyEditText) editTexts.get(i);
        if (i < editTextCount - 1) { // if not the last item
            editText.setNextFocusField((MyEditText) editTexts.get(i + 1)); 
        }    
        else if (editTextCount > 1) { 
            editText.setNextFocusField(null);
        }    
    }    
    

    【讨论】:

    • 我会尽力让你知道的,谢谢你的建议。
    • 我也有同样的问题,能否请您提供一些代码来说明您是如何解决此问题的?
    • Silas,看我修改后的解释,带有代码示例。
    猜你喜欢
    • 2012-11-16
    • 2011-04-08
    • 2017-01-22
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多