2013-07-06 221 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();