2013-07-11 27 views
7

在我的应用程序中,我制作了一个search interface,其中SearchView分别在失去并获得焦点时折叠并展开。然而,失去焦点的事情只发生在两种情况下:如何使SearchView在点击其他活动时失去焦点并崩溃

  1. 当按下后退按钮。

  2. 当按下SearchView旁边的主图标时。

我希望它失去焦点(因此崩溃),如果用户点击,不仅在这两件事情,但其他地方在屏幕上(例如,任何按钮或屏幕看不到风景的任何空白部分在上面)。

回答

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

大,你的答案是有用的,但现在接受它;)! – JJ86

+1

因此,除了搜索视图外,您在层次结构中的每个视图上设置了一个触摸侦听器?如果他们已经有触摸监听器呢? – alexbirkett

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