IT story

Android SearchView에서 키보드를 닫는 방법은 무엇입니까?

hot-time 2021. 1. 5. 19:18
반응형

Android SearchView에서 키보드를 닫는 방법은 무엇입니까?


ActionBar에 searchView가 있습니다. 사용자가 입력을 마치면 키보드를 닫고 싶습니다. searchView에 다음 queryTextListener가 있습니다.

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와 관련이 있는지 또는 둘 다인지 확실하지 않습니다. 누구든지이 일을 얻었거나 왜 작동하지 않는지 알고 있습니까?


비슷한 일을하려고했습니다. SearchActivity다른 곳에서 를 시작하고 Activity로드 될 때 열린 검색 필드에 검색어가 나타나도록해야했습니다. 위의 모든 접근 방식을 시도했지만 마지막으로 ( 위의 Ridcully의 답변 과 유사 ) 변수를 SearchViewin으로 설정 한 onCreateOptionsMenu()다음 사용자가 새 검색을 제출할 때 onQueryTextSubmit()호출 clearFocus()됩니다 SearchView.

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

간단하고 명확하며 깔끔합니다.

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

아래와 같이 onQueryTextSubmit에서 false를 반환하십시오.

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

전화하면 어떻게 든 작동합니다

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

그리고

otherWidget.requestFocus();

나를 위해 다음과 같이 작동합니다.

내 활동에는 멤버 변수가 있습니다.

private SearchView mSearchView;

다음 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의 소스 코드를 살펴본 결과 쿼리 텍스트를 빈 문자열로 재설정하지 않으면 SearchView가 그렇게하고 키보드도 제거하지 않습니다. 실제로 소스 코드에서 충분히 깊게 드릴 다운하면 동일한 결과를 얻을 수 있다고 yuku가 제안했지만 여전히 저수준의 항목을 엉망으로 만들 필요가 없기 때문에 솔루션이 더 좋습니다.


나를 위해, 위의 어느 것도 첫 번째 제출에서 작동하지 않았습니다. 그것은 숨어 있었고 즉시 키보드를 다시 보여주었습니다. 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;
            }
        });

편집 : 더 나은 솔루션을 맨 위에 추가했지만 이전 답변을 참조로 유지했습니다.

 @Override
        public boolean onQueryTextSubmit(String query) {

                  searchView.clearFocus();
            return false;
        }

원래 답변 : setOnQueryTextListener를 사용하여 프로그래밍했습니다. 검색보기가 숨겨지면 키보드가 사라지고 다시 표시 될 때 키보드가 다시 나타나지 않습니다.

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

     });

태블릿 앱에서 이중 창 활동으로 작업하고 있습니다.

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

검색 후 소프트 키보드를 해제하기에 충분했습니다. InputMethodManager를 사용할 필요가 없습니다.


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

도움이 되었기를 바랍니다.


사용할 수 있습니다.

if (isKeybordShowing(MainActivity.this, MainActivity.this.getCurrentFocus())) {
    onBackPressed();
}

public boolean isKeybordShowing(Context context, View view) {
    try {
        InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.hideSoftInputFromWindow(view.getWindowToken(), 0);
        return keyboard.isActive();
    } catch (Exception ex) {
        Log.e("keyboardHide", "cannot hide keyboard", ex);
        return false;
    }
}

나를 위해 일한 두 가지 솔루션, 첫 번째는 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);
 }

아래 코드는 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;
                        }
                    });

왜 이것을 시도하지 않습니까? X 버튼을 터치하면 무슨 일이 있어도 검색보기에 초점이 맞춰집니다.

ImageView closeButton = (ImageView)searchView.findViewById(R.id.search_close_btn);
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText et = (EditText) findViewById(R.id.search_src_text);
                et.setText("");`enter code here`
                searchView.setQuery("", false);
                searchView.onActionViewCollapsed();
                menuSearch.collapseActionView();
            }
        });

ReferenceURL : https://stackoverflow.com/questions/7409288/how-to-dismiss-keyboard-in-android-searchview

반응형