首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使SearchView在单击活动的其他地方时失去焦点并崩溃

如何使SearchView在单击活动的其他地方时失去焦点并崩溃
EN

Stack Overflow用户
提问于 2013-07-11 10:20:44
回答 4查看 10.3K关注 0票数 10

在我的应用程序中,我正在制作一个搜索接口,其中SearchView分别在失去焦点和获得焦点时折叠和扩展。然而,失去焦点的事情只在两种情况下发生:

  1. 当按下后退按钮时。
  2. SearchView旁边的主页图标被按下时。

如果用户不仅点击这两件事,而且点击屏幕上的任何其他地方(例如,任何按钮或屏幕上没有视图的任何空白部分),我希望它失去焦点(从而崩溃)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-11 10:55:23

我找到了下面的解决方案。我在每个不是搜索视图实例的视图上使用setOnTouchListener来折叠搜索视图。对我来说是完美的。下面是代码。

代码语言:javascript
复制
public void setupUI(View view) {

    if(!(view instanceof SearchView)) {

        view.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                searchMenuItem.collapseActionView();
                return false;
            }

        });
    }

    //If a layout container, iterate over children and seed recursion.
    if (view instanceof ViewGroup) {

        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {

            View innerView = ((ViewGroup) view).getChildAt(i);

            setupUI(innerView);
        }
    }
}

是我提到的答案。

票数 10
EN

Stack Overflow用户

发布于 2018-08-02 04:04:28

好吧,我还有一种更简单更整洁的方法。如果您使用搜索小部件作为工具栏(https://developer.android.com/guide/topics/search/search-dialog#UsingSearchWidget)中的操作视图,则可能希望使SearchView失去焦点,并在用户触摸屏幕上其他任何位置时隐藏键盘。

除了SearhView之外,您不必在层次结构中的每个视图上迭代和设置触摸侦听器,您可以简单地使用这个解决方案,因为SearchView中有一个AutoCompleteTextView。

步骤1:通过添加以下属性,使父视图(活动的内容视图)可单击和可聚焦

代码语言:javascript
复制
android:clickable="true"   
android:focusableInTouchMode="true"

步骤2:在SearchView AutoCompleteTextView上设置OnFocusChangeListener

代码语言:javascript
复制
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);

    final MenuItem search = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) search.getActionView();

    // get a reference of the AutoCompleteTextView from the searchView
    AutoCompleteTextView searchSrcText = searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
    searchSrcText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
                inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
            }
        }
    });
    return super.onCreateOptionsMenu(menu);
}

就这样!希望这对将来的读者有用:)

票数 2
EN

Stack Overflow用户

发布于 2019-12-06 17:01:39

在我的例子中,我必须停止搜索并关闭键盘,每当用户单击任何其他视图时,这对我都是有效的。

代码语言:javascript
复制
    public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}


@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        View view = getCurrentFocus();

        if (view != null && view instanceof EditText) {
            Rect r = new Rect();
            view.getGlobalVisibleRect(r);
            int rawX = (int) ev.getRawX();
            int rawY = (int) ev.getRawY();
            if (!r.contains(rawX, rawY)) {
                hideSoftKeyboard(MainActivity.this);
            }
        }
    }
    return super.dispatchTouchEvent(ev);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17590874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档