当我触摸其他东西时如何让我的 EditText 失去焦点?

Posted

技术标签:

【中文标题】当我触摸其他东西时如何让我的 EditText 失去焦点?【英文标题】:How to make my EditText lose focus when I touch something else? 【发布时间】:2015-04-11 20:21:29 【问题描述】:

问起来有点内疚,因为有很多问题,但我找不到解决办法。

如何让我的(单身)EditText 在触摸外部时失去焦点? focus 我的意思是视图准备好接受输入,光标可见。我会同意的:

当我触摸其他任何东西(例如,外面的空白区域)时,视图会失去焦点; 当我触摸布局中的其他视图时,视图失去焦点。

现在,答案主要是说明如何通过向所有其他视图添加点击监听器来实现第二个目标。这是可能的,但在我看来不是最好的方式。

至于第一个(触摸外部时视图失去焦点),大量输入来自:

this答案:

只有当另一个可聚焦视图获得焦点时,可聚焦视图(例如此 EditText)才会失去焦点。大多数视图默认情况下是不可聚焦的。

看起来像是终极解决方案,但在其他元素上设置 android:focusable(或在触摸模式下可聚焦)(在 RatingBar 和整个 Layout 上尝试过)对我没有任何帮助。

this 问题,人们提出了涉及触摸点的getX() / getY() 的解决方案,并检查它是否在编辑文本内。我发现这比问题本身更复杂,如果您有多个编辑文本,这会令人沮丧。

这样一个共同的愿望还有什么别的吗?从概念上讲,为什么如果我向 EditText 提供输入并点击(例如在评级栏上),该视图仍应保持焦点并等待,其光标闪烁?

【问题讨论】:

【参考方案1】:

您可以使用 dispatchTouchEvent 来完成。

@Override
   public boolean dispatchTouchEvent(MotionEvent event) 
    if (event.getAction() == MotionEvent.ACTION_DOWN) 
    if (mEditText.isFocused()) 
        Rect outRect = new Rect();
        mEditText.getGlobalVisibleRect(outRect);
        if (!outRect.contains((int)event.getRawX(),(int)event.getRawY()))   
            mEditText.clearFocus();
            //
            // Hide keyboard
            //
            InputMethodManager imm = (InputMethodManager)    v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
            imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
         
       
     
 return super.dispatchTouchEvent(event);
 

处理更多数量的编辑文本会有点困难。因此,当我遇到类似问题时,我遇到了它,并认为我会分享我最终做了什么。

每次获得焦点的视图都不一样,所以我使用了非常通用的:

 View current = getCurrentFocus();
 if (current != null) current.clearFocus();

您可以在 dispatchTouchEvent 中调用它。

【讨论】:

这个答案实际上与我的问题相关(见我何时谈论 getX() / getY() ),正如我所说,我正在寻找一个更简单的解决方案。如果您有多个编辑文本,这会很痛苦。 我更新了我的代码。你可以检查一下,让我@miav

以上是关于当我触摸其他东西时如何让我的 EditText 失去焦点?的主要内容,如果未能解决你的问题,请参考以下文章

触摸时 EditText 未突出显示

在android中触摸EditText时应用程序崩溃

触摸编辑时,Android 键盘视图位于 EditText 前面

Android键盘在Page Renderer中失去了对触摸的关注

EditText表现得很奇怪

如何在 android 中删除 EditText 材料设计底线?