2012-03-09 41 views
74

我目前使用ActionBar菜單項在操作欄中顯示SearchView。當搜索菜單項被展開時,軟鍵盤被顯示,這是我想要的。現在,當用戶按下後退按鈕關閉軟鍵盤時,我還想在操作欄中摺疊SearchView。軟鍵盤上的自動摺疊ActionBar SearchView關閉

我已經嘗試在MenuItem和ActionView上實現以下監聽器OnKeyListener和OnFocusChangeListener。我也嘗試在Activity中使用OnBackPressed()。以上都未檢測到使用後退按鈕關閉軟鍵盤時的情況。

任何想法?

我已經實現了OnActionExpandListener以瞭解SearchView何時可見。

+0

這是一個非常受歡迎的答案http://stackoverflow.com/questions/1109022/how-to-close-hide-the-android-soft-keyboard – jmishra 2012-03-09 05:26:26

+2

它不會幫助他,他需要攔截後面鍵盤上的鍵 – dor506 2012-03-09 06:05:17

+2

這個答案應該很有名。還有很多其他答案需要大量的複雜和變通辦法,但這些辦法可能並不總是可以實現的。我感謝你的問題和答案。這正是我所需要的。我希望你能得到更多的讚揚,你應得的。 – acrespo 2014-07-01 20:58:38

回答

36

我找到了一個更好的解決方案。

searchView.setOnQueryTextFocusChangeListener(). 

OnQueryTextFocusChangeListener顯示或隱藏鍵盤的時候被調用。當鍵盤顯示並且搜索視圖將具有焦點時,首先調用。獲取再次調用時keyboard隱藏和搜索視圖將失去焦點,可以close search view然後使用

menuItem.collapseActionView(). 
+4

這是誤導。當鍵盤顯示或隱藏時,「OnQueryTextFocusChangeListener」不會被調用。它只有在'searchView'進入焦點和/或焦點時才被調用。所以,當「SearchView」首次成爲焦點時,「OnQueryTextFocusChangeListener」被調用並且鍵盤也被顯示出來。現在,如果後退按鈕被按下,鍵盤被隱藏,但OnQueryTextFocusChangeListener不會被調用。再次按下後退按鈕時,searchView會摺疊並調用OnQueryTextFocusChangeListener。 – faizal 2013-12-18 11:52:21

10

只重寫onBackPressed這樣的:

@Override 
    public void onBackPressed() { 
     if (searchView.isShown()){ 
      searchView.onActionViewCollapsed(); //collapse your ActionView 
      searchView.setQuery("",false);  //clears your query without submit 
      isClosed = true;      //needed to handle closed by back 
     } else{ 
      super.onBackPressed(); 
     } 
    } 

和你onCreateOptionsMenu會膨脹mSearchView這樣的:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     getMenuInflater().inflate(R.menu.menu_search, menu); 
     mSearchView = (SearchView) menu.findItem(R.id.menu_action_search).getActionView(); 
     mSearchView.setOnQueryTextListener(this); 
     mSearchView.setOnSearchClickListener(this); 
     mSearchView.setOnCloseListener(this); 
     isClosed = true; 
     return true; 
    } 

你們班有這樣的實施:

public class myActivity extends FragmentActivity implements 
    SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener { 

,你還需要:

@Override 
public void onClick(View view) { 
    isClosed = false; 
} 

@Override 
public boolean onClose() { 
    isClosed = true; 
    return false; 
} 

您將需要「mSearchView」和活動「isClosed」兩個全局變量。

+3

我不認爲這是有效的;在我的經驗中,如果鍵盤啓動,則不會調用onBackPressed方法;它只是關閉鍵盤,你需要再次按回來調用該方法。這是2.3;我還沒有用3.x和4.0進行過實驗,但我懷疑這是一樣的。 – Kevlar 2012-04-26 22:33:47

+0

@Kevlar我想你可能是對的。我會再次測試,並確保沒有辦法。似乎我的解決方案與他們想要的略有不同。據我所知,在顯示軟鍵盤時,我不認爲有辦法處理背部。我的解決方案在鍵盤關閉後進行處理。將測試不同的SDK。 – Codeversed 2012-05-01 07:32:13

+1

我曾嘗試摺疊搜索使用:searchMenuItem.collapseActionView();但事實證明searchView.onActionViewCollapsed();爲我做了詭計 - 謝謝! – bkurzius 2013-02-28 21:38:02

97

我會對@ user1258568的懶惰答案進行擴充。這對我有效。請注意,它會在焦點丟失時清除您的查詢。

final MenuItem searchMenuItem = optionsMenu.findItem(R.id.search); 
final SearchView searchView = (SearchView) searchMenuItem.getActionView(); 

searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View view, boolean queryTextFocused) { 
     if(!queryTextFocused) { 
      searchMenuItem.collapseActionView(); 
      searchView.setQuery("", false); 
     } 
    } 
}); 
+1

完美地工作。如果你在代碼中添加一個searchView,你可能需要使用'menu.getItem(yourSearchViewItemPosition)'代替。 – GeeF 2013-02-05 14:05:10

+1

三星Galaxy S 3不工作 – 2013-09-04 06:22:37

+0

@AlexBonel如何?我知道S3和S4擁有白癡硬件按鈕,但我不清楚這將如何影響此片段。 也許這是因爲ActionBar菜單被隱藏,searchMenuItem的行爲不同。 我手邊有S4,我必須測試一下。 – 2013-09-04 17:16:49

1

這就是我爲了讓鍵盤消失所做的。你可以嘗試看看這是否適合你。我將searchView設置爲不可見,然後再次可見。

//set query change listener 
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){ 
     @Override 
     public boolean onQueryTextChange(String newText) { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      /** 
      * hides and then unhides search tab to make sure keyboard disappears when query is submitted 
      */ 
        searchView.setVisibility(View.INVISIBLE); 
        searchView.setVisibility(View.VISIBLE); 
      return false; 
     } 

    }); 
+0

這隻爲我工作。 :) – 2013-10-11 08:21:47

+0

也爲我工作,但您必須添加getActivity()。supportInvalidateOptionsMenu();恢復操作吧 – almisoft 2013-12-11 11:37:51

0
@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getSupportMenuInflater().inflate(R.menu.home_screen, menu); 

     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     final MenuItem searchMenuItem = menu.findItem(R.id.menu_search); 
     final SearchView searchView = (SearchView) searchMenuItem 
       .getActionView(); 
     searchView.setIconifiedByDefault(false); 
     if (searchManager != null && searchView != null) { 
      searchView.setSearchableInfo(searchManager 
        .getSearchableInfo(getComponentName())); 

      searchView 
        .setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { 

         @Override 
         public void onFocusChange(View v, boolean hasFocus) { 

          if (!hasFocus) { 
           if (searchMenuItem != null) { 
            searchMenuItem.collapseActionView(); 
           }// end if 
           if (searchView != null) { 
            searchView.setQuery("", false); 

           }// end if 
          }// end if 

         } 
        }); 

      searchView 
        .setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

         @Override 
         public boolean onQueryTextSubmit(String query) { 
          /** 
          * hides and then unhides search tab to make sure 
          * keyboard disappears when query is submitted 
          */ 
          if (searchView != null) { 
           searchView.setVisibility(View.INVISIBLE); 
           searchView.setVisibility(View.VISIBLE); 

          } 
          return false; 
         } 

         @Override 
         public boolean onQueryTextChange(String newText) { 
          // TODO Auto-generated method stub 
          return false; 
         } 
        }); 

     } 

     return super.onCreateOptionsMenu(menu); 
    } 
1

這是可以實現的是這樣的:基於setOnQueryTextFocusChangeListener(),因爲事件沒有推出,我沒有工作

private void setupSearchView(Menu menu) { 
     final MenuItem searchMenuItem = menu.findItem(R.id.action_search); 
     final SearchView searchView = (SearchView) searchMenuItem.getActionView(); 

     [...] 

     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       searchMenuItem.collapseActionView(); 
       return false; 
      } 
      @Override 
      public boolean onQueryTextChange(String newText) { 
       return true; 
      } 
     }); 
    } 

解決方案 - 將搜索查看絲毫不輸提交時集中,可能因爲我在包含搜索視圖的同一活動中執行搜索。

無論如何,我認爲使用OnQueryTextListener更準確,因爲它更準確地描述了提交文本的事件。

2

喬恩威利斯的答案很好。這是對他的回答的改進。

首先,創建一個實現View.OnFocusChangeListener一個新的類:

public class SearchViewFocusListener implements View.OnFocusChangeListener { 

    private final MenuItem mMenuItem; 

    public SearchViewFocusListener(MenuItem menuItem) { 
     mMenuItem = menuItem; 
    } 

    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (!hasFocus) { 
      mMenuItem.collapseActionView(); 
      if (v instanceof SearchView) { 
       ((SearchView) v).setQuery("", false); 
      } 
     } 
    } 

} 

接下來,設置監聽你的SearchView

searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem)); 
0

如果您想在用戶點擊鍵盤上的搜索圖標可摺疊鍵盤 這可以通過簡單的實現

inside onquerytextsubmitted {

searchView.clearfocus()

}

0

你需要調用setIconified兩次。

要實際摺疊您的搜索視圖並關閉鍵盤。
使用第二個呼叫鍵盤清除搜索視圖的第一個呼叫文本,並關閉搜索視圖。

0

出於某種原因,menuItem.collapseActionView()沒有工作,所以我用searchView.setIconified(true)代替。

這給出了下面的結果作爲代碼示例。

final MenuItem searchItem = (MenuItem) menu.findItem(R.id.menu_item_search); 
final SearchView searchView = (SearchView) searchItem.getActionView(); 

searchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (!hasFocus) { 
      searchView.setIconified(true); 
     } 
    } 
}); 
2

你只需把「collapseActionView」屬性菜單佈局

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item 
     android:id="@+id/menu_item_search" 
     android:title="@string/search" 
     android:iconifiedByDefault="true" 
     android:icon="@drawable/ic_action_search" 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     app:showAsAction="ifRoom|collapseActionView"/> <--this one 
</menu> 

這會給你你通過itself.Don't尋找所有功能忘記調用方法「清除焦點「在SearchView上關閉鍵盤,一旦你發送查詢。