47

Tôi có một searchView trong ActionBar. Tôi muốn loại bỏ bàn phím khi người dùng hoàn tất với đầu vào. Tôi đã sau queryTextListener trên SearchViewCách loại bỏ bàn phím trong 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; 
    } 
}; 

Dựa trên câu hỏi tương tự, đoạn code sau nên bỏ qua bàn phím, nhưng nó không hoạt động trong trường hợp này:

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

Tôi cũng đã cố gắng :

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

Cả hai đều không hoạt động. Tôi không chắc chắn nếu đây là một vấn đề cụ thể Honeycomb hoặc nếu nó liên quan đến searchView trong ActionBar, hoặc cả hai. Có ai nhận được điều này làm việc hoặc biết lý do tại sao nó không hoạt động?

Trả lời

9

Bằng cách nào đó nó hoạt động nếu bạn gọi

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

và sau đó

otherWidget.requestFocus(); 
7

Đối với tôi, các công việc sau:

Trong hoạt động của tôi, tôi có một biến thành viên

private SearchView mSearchView; 

Bằng onCreateOptionsMenu() tôi đặt rằng biến như vậy:

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

Trong QueryTextListener cuối cùng, tôi làm điều này:

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

tôi đã có một cái nhìn tại các mã nguồn của SearchView, và nếu bạn không thiết lập lại truy vấn văn bản vào một chuỗi rỗng, SearchView chỉ làm điều đó, và không loại bỏ bàn phím không. Trên thực tế, khoan xuống đủ sâu trong mã nguồn, nó đến cùng, yuku gợi ý, nhưng tôi vẫn thích giải pháp của tôi tốt hơn, vì tôi không phải lộn xộn xung quanh với những thứ cấp thấp đó.

1

Trong một ứng dụng tablet tôi đang làm việc trên với một hoạt động cửa sổ kép, tôi đã viết chỉ

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

và đó là đủ để bỏ qua những bàn phím mềm mại sau khi tìm kiếm. Không cần phải sử dụng InputMethodManager

59

Tôi đã cố gắng làm một việc tương tự. Tôi cần khởi chạy số SearchActivity từ một số Activity khác và có cụm từ tìm kiếm xuất hiện trên trường tìm kiếm đã mở khi được tải. Tôi đã thử tất cả các phương pháp trên nhưng cuối cùng (tương tự như Ridcully's answer above) Tôi thiết lập một biến SearchView trong onCreateOptionsMenu() và sau đó trong onQueryTextSubmit() gọi clearFocus() trên SearchView khi người dùng gửi một tìm kiếm mới:

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

nơi được '' query'' định nghĩa trong ' 'onCreateOptionsMenu''? –

+0

.. đó là chuỗi truy vấn được xác định ở nơi khác. tôi sẽ chỉnh sửa nó. Dòng đó cũng không cần thiết, chỉ khi bạn muốn điền trước truy vấn và đối số thứ hai (false) ngăn nó chạy truy vấn. – bkurzius

+1

Cảm ơn bạn rất nhiều! searchView.clearFocus() là phần tôi thiếu cho đến bây giờ – satyadeepk

1

tôi đã sử dụng ActionBarSherlock 4.3 và Tôi có một ProgressDialog. Khi tôi loại bỏ nó trong phương thức postExecute, Searchview lấy tiêu điểm. Để khắc phục điều đó:

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

Hy vọng điều đó sẽ hữu ích.

1

Chỉnh sửa: Tôi đã thêm giải pháp tốt hơn ở trên cùng nhưng cũng giữ câu trả lời cũ làm tham chiếu.

@Override 
     public boolean onQueryTextSubmit(String query) { 

        searchView.clearFocus(); 
      return false; 
     } 

Câu trả lời gốc: Tôi lập trình bằng cách sử dụng setOnQueryTextListener. Khi chế độ xem tìm kiếm bị ẩn, bàn phím sẽ biến mất và sau đó khi màn hình hiển thị lại, bàn phím sẽ không bật trở lại.

//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

Tại sao bạn lại sử dụng các số ma thuật, thay vì các hằng số? Ngoài ra, đây chỉ là một câu trả lời hacky. –

24

đơn giản, thẳng vào vấn đề và sạch sẽ:

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

Đây phải là câu trả lời được chấp nhận – AlexF11

+3

Điều này không được gọi nếu 'SearchView' trống ... – Sakiboy

11

chỉ trả về false trên onQueryTextSubmit giống như dưới đây

@Override 
public boolean onQueryTextSubmit(String s) { 
    return false; 
} 
0

Hai giải pháp mà làm việc cho tôi, là người đầu tiên sử dụng Ví dụ về SearchView:

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

Giải pháp thứ hai:

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

Đối với tôi, không có điều nào ở trên làm việc trong lần gửi đầu tiên. Nó đang ẩn nấp và sau đó ngay lập tức tái hiện bàn phím. Tôi đã phải đăng clearFocus() trên trình xử lý của chế độ xem để làm cho nó xảy ra sau khi nó được thực hiện với mọi thứ khác.

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

Dưới Mã đang làm việc cho tôi để ẩn bàn phím trong SearchView

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; 
         } 
        }); 
Các vấn đề liên quan