2013-07-06 160 views
48

目前,我有我的应用程序的操作栏搜索查看。当我点击搜索图标时,SearchView会展开并按预期弹出键盘。单击SearchView框中的“X”按预期关闭SearchView。但是,当SearchView被激活时,我按下“后退”按钮,我的应用程序退出。这是正确的行为,但我试图现在要做的就是捕捉到后退按钮按下,只是把它关闭搜索查看(不是我的应用程序),当搜索查看可见。有没有办法在后退按钮上按程序调用SearchView OnCloseListener()?例如,像这样:如何以编程方式关闭SearchView?

// On a back button press, if we are currently searching, 
// close the SearchView. Otherwise, invoke normal back button 
// behavior. 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     if (isSearchViewVisible) { 
      SearchView searchView = (SearchView) menu.findItem(R.id.searchBox) 
       .getActionView(); 

      // This method does not exist 
      searchView.invokeClose(); 
      return true; 
     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

https://stackoverflow.com/a/46930606/1308990 – oiyio

回答

102

基于@MarcinOrlowski答案,你也可以使用:

@Override 
public void onBackPressed() { 
    if (!searchView.isIconified()) { 
     searchView.setIconified(true); 
    } else { 
     super.onBackPressed(); 
    } 
} 
+1

它应该被标记为正确答案 –

+2

重要的是,如果您已设置 app:showAsAction =“always” – UserK

+2

请确保设置searchView.setQuery(“”,false);为了使searchView.setIconified(true);去工作 – Pushan

21

要拦截BACK按钮覆盖onBackPressed()see docs

@Override 
public void onBackPressed() { 

    if (isSearchViewVisible) { 
     SearchView searchView = (SearchView) menu.findItem(R.id.searchBox) 
      .getActionView(); 

     // This method does not exist 
     searchView.invokeClose(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

编辑

Docs say

如果有必要,可以扩展或通过在 菜单项调用expandActionView()和collapseActionView()崩溃在自己 代码的动作视图。

+0

感谢您的答复!我主要感兴趣的是,是否有以编程方式调用SearchView的关闭事件的方式,即模仿SearchView框“X”按钮按下代码。 – Tim

+0

查看编辑答案 –

+2

感谢所有帮助Marcin。事实证明,我真正想做的是我的搜索操作视图(我的搜索视图始终在操作栏上,永远不会折叠到选项菜单中)。感谢您抽出宝贵时间帮助我,并感谢关于重写“onBackPressed”的提示。 – Tim

1

我喜欢 searchView.isIconified() 超过 如果(isSearchViewVisible)的onBackPressed内()方法选择2呢!当你在你的fragmentmanager的堆栈中添加的片段,你想按下后退按钮时,显示无法正常工作。

24

有一个简单的方法来做到这一点:

@Override 
public void onBackPressed() { 
    if (!searchView.isIconified()) { 
     searchView.onActionViewCollapsed(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

或使用:

@Override 
public void onBackPressed() { 
    searchView.onActionViewCollapsed(); 
    super.onBackPressed(); 
} 

这会让你按当时后面的动作将被调用之前的搜索查看崩溃。

这两种解决方案会奏效。

2

用途:

searchView.setIconified(true); 
0

我的方式:

  1. 创建CustomSearchView类
 

    public class CustomSearchView extends SearchView{ 
     public CustomSearchView(final Context context) { 
      super(context); 
      this.setIconifiedByDefault(true); 
     } 

     @Override 
     public boolean dispatchKeyEventPreIme(KeyEvent event) { 
      if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && 
       event.getAction() == KeyEvent.ACTION_UP) { 
       this.onActionViewCollapsed(); 
      } 
      return super.dispatchKeyEventPreIme(event); 
     } 
    } 

  • 添加actionViewClass
  •  
        <item 
         android:id="@+id/menu_search" 
         android:title="@string/menu_search" 
         android:icon="@drawable/ic_search" 
         android:showAsAction="collapseActionView|ifRoom" 
         android:actionViewClass="com.myapp.CustomSearchView"/> 
    
  • 创建CustomSearchView到onCreateOptionsMenu
  •  
        CustomSearchView searchView = (CustomSearchView)menu.findItem(R.id.menu_search).getActionView(); 
    
    0

    如果你没有在onBackPressed()方法使用任何功能,从你的Activity.So删除了SearchView本身处理onBackPress事件。

    我使用搜索查看作为

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
        MenuItem searchItem = menu.findItem(R.id.action_search); 
        SearchView searchview = (SearchView) MenuItemCompat.getActionView(searchItem); 
        searchview.setIconifiedByDefault(true); 
        searchview.setOnQueryTextListener(this); 
        searchview.setSubmitButtonEnabled(true); 
        searchview.setQueryHint("Search Here"); 
        super.onCreateOptionsMenu(menu, inflater); 
    } 
    

    和我menu.xml文件如下

    <item 
        android:id="@+id/action_search" 
        android:icon="@drawable/search_tool" 
        android:orderInCategory="1" 
        android:title="Search" 
        app:actionViewClass="android.support.v7.widget.SearchView" 
        app:showAsAction="always|collapseActionView"/> 
    
    16

    这是它会为我的唯一的事情:

    toolbar.collapseActionView(); 
    
    +1

    相当不错的解决方案 –

    +1

    我尝试了这个线程中的所有解决方案。这个解决方案对我来说是最好的。它是使搜索图标回到右上方屏幕的唯一解决方案 – Dika

    0

    你也可以使用collapseActionView。它自动处理后退按钮,倒塌搜索查看

    <item 
         android:id="@+id/action_search" 
         android:icon="@drawable/ic_magnify" 
         android:title="@string/action_title_search" 
         app:actionViewClass="android.support.v7.widget.SearchView" 
         app:showAsAction="ifRoom|collapseActionView" /> 
    
    6

    ,如果你对你的搜索查看

    mSearchView.setIconified(true); 
    

    输入只会清除文本。

    正确的方法来关闭一个搜索查看是

    mSearchView.onActionViewCollapsed();