[android] 소프트 키보드의 ActionBar SearchView 자동 축소 닫기

현재 ActionBar 메뉴 항목을 사용하여 작업 표시 줄에 SearchView를 표시하고 있습니다. 검색 메뉴 항목이 확장되면 내가 원하는 소프트 키보드가 표시됩니다. 이제 사용자가 뒤로 버튼을 눌러 소프트 키보드를 닫을 때 작업 표시 줄에서 SearchView도 축소하고 싶습니다.

MenuItem 및 ActionView에서 다음 리스너 OnKeyListener 및 OnFocusChangeListener를 구현하려고 시도했습니다. 나는 또한 활동에서 OnBackPressed ()를 사용해 보았습니다. 위의 어느 것도 소프트 키보드를 닫기 위해 뒤로 버튼을 사용하는 경우를 감지하지 않습니다.

어떤 아이디어?

SearchView가 표시되는시기를 알기 위해 OnActionExpandListener를 구현했습니다.



답변

게으른 사람에 대한 @ 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);
        }
    }
});


답변

더 나은 해결책을 찾았습니다.

searchView.setOnQueryTextFocusChangeListener().

OnQueryTextFocusChangeListener키보드가 표시되거나 숨겨 때 호출됩니다. 키보드가 표시되고 검색보기에 포커스가있을 때 먼저 호출됩니다. keyboard가 숨겨지고 검색보기가 포커스를 잃을 때 다시 호출 되며 close search view다음을 사용할 수 있습니다.

menuItem.collapseActionView().


답변

다음과 같이 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”를 모두 전역 변수로 만들어야합니다.


답변

Jon Willis의 답변은 훌륭합니다. 이것은 그의 대답에 대한 개선입니다.

먼저 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));


답변

메뉴 레이아웃에 “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>

그 자체로 모든 기능을 찾을 수 있습니다. 쿼리를 보낸 후에는 SearchView에서 “clearFocus”메서드를 호출하여 키보드를 닫는 것을 잊지 마십시오.


답변

이것이 제가 키보드를 사라지게하기 위해 한 것입니다. 이것이 당신을 위해 작동하는지 확인할 수 있습니다. 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;
        }

     });


답변

다음과 같이 달성 할 수 있습니다.

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

이벤트가 시작되지 않았기 때문에 setOnQueryTextFocusChangeListener () 기반 솔루션이 작동하지 않았습니다. 검색 뷰가 포함 된 동일한 활동에서 검색을 수행했기 때문에 searchView가 제출 될 때 포커스를 잃지 않았습니다.

어쨌든 OnQueryTextListener를 사용하는 것이 텍스트를 더 정확하게 제출하는 이벤트를 설명하기 때문에 더 정확하다고 생각합니다.