2011-09-13 127 views
47

我在ActionBar中有一個searchView。我想在用戶完成輸入時關閉鍵盤。我曾在上搜索查看以下queryTextListener如何在Android SearchView中關閉鍵盤?

final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { 
    @Override 
    public boolean onQueryTextChange(String newText) { 
     // Do something 
     return true; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String query) { 

     showProgress(); 
     // Do stuff, make async call 

     getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

     return true; 
    } 
}; 

基於類似的問題,下面的代碼應該駁回鍵盤,但它並沒有在這種情況下工作:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

我也試過:

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0); 

兩者都不工作。我不確定這是否是Honeycomb特定的問題,或者它是否與ActionBar中的searchView相關,或者兩者都有關係。有沒有人得到這個工作,或知道爲什麼它不工作?

回答

9

不知怎的,它的工作原理,如果你打電話

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0); 

然後

otherWidget.requestFocus(); 
7

對於我來說,下面的工作:

在我的活動我有一個成員變量

private SearchView mSearchView; 

In onCreateOptionsMenu()我設置變量,像這樣:

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.library, menu); 
    mSearchView = (SearchView)menu.findItem(R.id.miSearch).getActionView(); 
    mSearchView.setOnQueryTextListener(this); 
    return true; 
} 

QueryTextListener最後,我這樣做:

mSearchView.setQuery("", false); 
mSearchView.setIconified(true); 

我看了一下搜索查看源代碼,如果你不重置查詢文本爲空字符串,SearchView只是這樣做,並且不會刪除鍵盤。實際上,深入研究源代碼,yuku提出了相同的建議,但仍然更喜歡我的解決方案,因爲我不必陷入這些低級別的問題。

1

在平板電腦應用我工作的一個雙窗格的活動,我只寫了

f.getView().requestFocus(); // f is the target fragment for the search

這就夠了搜索後駁回軟鍵盤。無需使用InputMethodManager

59

我試圖做類似的事情。我需要從另一個Activity啓動SearchActivity,並在加載時使搜索字詞顯示在打開的搜索字段中。我嘗試了所有的方法之上,但最終(類似於Ridcully's answer above)的變量I在onCreateOptionsMenu()SearchView設置爲SearchView,然後在onQueryTextSubmit()稱爲clearFocus()當用戶提交一個新的搜索:

private SearchView searchView; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.search_menu, menu); 
    searchView = (SearchView) menu.findItem(R.id.menu_search) 
      .getActionView(); // set the reference to the searchView 
    searchView.setOnQueryTextListener(this); 
    searchMenuItem = (MenuItem) menu.findItem(R.id.menu_search); 
    searchMenuItem.expandActionView(); // expand the search action item automatically 
    searchView.setQuery("<put your search term here>", false); // fill in the search term by default 
    searchView.clearFocus(); // close the keyboard on load 
    return true; 
} 

@Override 
public boolean onQueryTextSubmit(String query) { 
    performNewSearch(query); 
    searchView.clearFocus(); 
    return true; 
} 
+0

是'query''在''onCreateOptionsMenu''定義其中'? –

+0

..這是在別處定義的查詢字符串。我會編輯它。該行也不是必需的,只有在您想要預先填充查詢時,第二個參數(false)纔會停止運行查詢。 – bkurzius

+1

非常感謝! searchView.clearFocus()是我到目前爲止丟失的部分 – satyadeepk

1

我用ActionBarSherlock 4.3我有一個ProgressDialog。當我在postExecute方法中解僱它時,Searchview獲得焦點。修復:

//Handle intent and hide soft keyboard 
    @Override 
    protected void onNewIntent(Intent intent) { 
     setIntent(intent); 
     handleIntent(intent); 
     searchView.setQuery("", false); 
     searchView.setIconified(true); 
     searchView.clearFocus(); 
    } 

    /*When dismiss ProgressDialog, searchview gain focus again and shows the keyboard. I call clearFocus() to avoid it.*/ 

    AsyncTask.onPostExecute(){ 
     if(pd!=null) 
     pd.dismiss(); 
     if(searchView!=null) 
     searchView.clearFocus(); 
    } 

希望它有幫助。

1

編輯:我在頂部添加了更好的解決方案,但也保留了舊的答案作爲參考。

@Override 
     public boolean onQueryTextSubmit(String query) { 

        searchView.clearFocus(); 
      return false; 
     } 

Original Answer:我編程使用setOnQueryTextListener。當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

爲什麼使用幻數而不是常量本身?此外,這只是一個黑客的答案。 –

24

簡單,開門見山,清潔:

@Override 
    public boolean onQueryTextSubmit(String query) { 
     // your search methods 
     searchView.clearFocus(); 
     return true; 
    } 
+2

這應該是被接受的答案 – AlexF11

+3

如果'SearchView'爲空,則不會調用... – Sakiboy

11

只是onQueryTextSubmit返回false就像下面

,使用工作對我來說,第一個
@Override 
public boolean onQueryTextSubmit(String s) { 
    return false; 
} 
0

兩種解決方案SearchView實例:

private void hideKeyboard(){ 
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0); 
} 

第二種解決方案:

private void hideKeyboard(){ 
      InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
      inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
} 
6

對我而言,以上都沒有在第一次提交工作。它正在隱藏,然後立即重新顯示鍵盤。我必須在視圖的處理程序上發佈clearFocus(),以便在完成其他所有操作後使其發生。

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       if (!"".equals(query)) { 
        mSearchView.post(new Runnable() { 
         @Override 
         public void run() { 
          mSearchView.clearFocus(); 
         } 
        }); 
       } 
       return true; 
      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       return false; 
      } 
     }); 
0

下面的代碼爲我工作,以隱藏鍵盤搜索查看

MenuItem searchItem = baseMenu.findItem(R.id.menuSearch); 

edtSearch= (EditText) searchItem.getActionView().findViewById(R.id.search_src_text); 

MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() { 
         @Override 
         public boolean onMenuItemActionExpand(MenuItem item) { 
          edtSearch.post(new Runnable() { 
           @Override 
           public void run() { 
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
            imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0); 
           } 
          }); 
          return true; 
         } 

         @Override 
         public boolean onMenuItemActionCollapse(MenuItem item) { 
          return true; 
         } 
        });