首页 文章

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

提问于
浏览
7

在我的应用程序中,我正在制作一个search interface,其中 SearchView 分别在失去并获得焦点时崩溃和扩展 . 然而,失败的焦点只发生在两种情况:

  • 按下后退按钮时 .

  • 按下 SearchView 旁边的主页图标时 .

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

3 回答

  • 8

    好吧,我发现了以下解决方案 . 我在每个不是searchview实例的视图上使用了setOnTouchListener来折叠搜索视图 . 它对我来说很完美 . 以下是代码 .

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

    This是我提到的答案 .

  • 0

    这对我有用,mOptionsMenu保存在onCreateOptionsMenu中:

    public void setupUI(View view) {
    
        //Set up touch listener for non-text box views to hide keyboard.
        if(!(view instanceof EditText)) {
    
            view.setOnTouchListener(new View.OnTouchListener() {
    
                public boolean onTouch(View v, MotionEvent event) {
                    hideSoftKeyboard(MainActivity.this);
                    if(mOptionsMenu == null) return false;
                    MenuItem searchMenuItem = mOptionsMenu.findItem(R.id.action_search);
                    if(searchMenuItem == null) return false;
                    ((SearchView)searchMenuItem.getActionView()).clearFocus();
                    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);
            }
        }
    }
    
    public static void hideSoftKeyboard(Activity activity) {
        InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
    }
    
  • 0

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

    除了在SearhView之外的层次结构中的每个视图上迭代和设置触摸侦听器,您可以简单地使用此solution,因为SearchView中有一个AutoCompleteTextView .

    Step 1: Make the parent view(content view of your activity) clickable and focusable by adding the following attribute

    android:clickable="true"   
    android:focusableInTouchMode="true"
    

    Step 2: Set OnFocusChangeListener on the SearchView AutoCompleteTextView

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

    而已!希望这对未来的读者有用:)

相关问题