Nice programing

프로그래밍 방식으로 SearchView를 닫는 방법은 무엇입니까?

nicepro 2020. 11. 25. 21:09
반응형

프로그래밍 방식으로 SearchView를 닫는 방법은 무엇입니까?


현재 SearchView내 앱의 작업 표시 줄에이 있습니다. 검색 아이콘을 클릭하면 SearchView확장되고 예상대로 키보드가 팝업됩니다. SearchView상자 에서 "X"를 클릭하면 SearchView예상대로 가 닫힙니다 . 그러나 SearchView가 활성화되고 "뒤로"버튼을 누르면 내 앱이 종료됩니다. 이것은 올바른 동작이지만 지금 시도하고있는 것은 뒤로 버튼 누름을 캡처하고이 표시 SearchView될 때 (내 앱이 아닌) 닫도록 하는 것 SearchView입니다. SearchView OnCloseListener()뒤로 버튼을 누를 프로그래밍 방식으로 호출하는 방법이 있습니까? 예를 들면 다음과 같습니다.

// On a back button press, if we are currently searching,
// close the SearchView. Otherwise, invoke normal back button
// behavior.
public boolean onKeyDown(int keyCode, KeyEvent event) {
   if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (isSearchViewVisible) {
            SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
               .getActionView();

            // This method does not exist
            searchView.invokeClose();
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}

@MarcinOrlowski 답변을 기반으로 다음을 사용할 수도 있습니다.

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.setIconified(true);
    } else {
        super.onBackPressed();
    }
}

사용하다

searchView.setIconified(true)

또한 MenuItemCompat.collapseActionView 를 사용했습니다.

MenuItemCompat.collapseActionView(menuItem)

이를 수행하는 간단한 방법이 있습니다.

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.onActionViewCollapsed();
    } else {
        super.onBackPressed();
    }
}

또는 다음을 사용하십시오.

@Override
public void onBackPressed() {
    searchView.onActionViewCollapsed();
    super.onBackPressed();
}

이렇게하면 뒤로를 누르기 전에 searchView가 축소되고 뒤로 작업이 호출됩니다.

두 솔루션 모두 작동합니다.


이것은 나를 위해 그것을하는 유일한 것입니다.

  toolbar.collapseActionView();

뒤로 버튼 재정의를 가로 채려면 onBackPressed()( 문서 참조 )

@Override
public void onBackPressed() {

    if (isSearchViewVisible) {
        SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
           .getActionView();

        // This method does not exist
        searchView.invokeClose();
    } else {
        super.onBackPressed();
    }
}

편집 :

문서는 말한다 :

필요한 경우 MenuItem에서 expandActionView () 및 collapseActionView ()를 호출하여 자체 코드에서 작업보기를 확장하거나 축소 할 수 있습니다.


searchView에 입력이있는 경우

mSearchView.setIconified(true);

텍스트 만 지워집니다.

searchView를 닫는 올바른 방법은 다음과 같습니다.

mSearchView.onActionViewCollapsed();

사용하다:

searchView.setIconified(true);

내가 선호 !searchView.isIconified()이상 if(isSearchViewVisible)안에 onBackPressed()당신이 당신의 추가 조각이있을 때 옵션 2 일을하지 않는 방법 fragmentmanager's backstack당신이 다시 버튼을 누를 때 보여주고 싶다고.


내 방식 :

  1. CustomSearchView 클래스 만들기

    public class CustomSearchView extends SearchView{
        public CustomSearchView(final Context context) {
            super(context);
            this.setIconifiedByDefault(true);
        }

        @Override
        public boolean dispatchKeyEventPreIme(KeyEvent event) {
            if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && 
                event.getAction() == KeyEvent.ACTION_UP) {
                this.onActionViewCollapsed();
            }
            return super.dispatchKeyEventPreIme(event);
        }
    }

  1. Add actionViewClass
    <item
        android:id="@+id/menu_search"
        android:title="@string/menu_search"
        android:icon="@drawable/ic_search"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="com.myapp.CustomSearchView"/>
  1. Create CustomSearchView into onCreateOptionsMenu
    CustomSearchView searchView = (CustomSearchView)menu.findItem(R.id.menu_search).getActionView();

If you are not use any function in onBackPressed() method ,remove it from your Activity.So that the SearchView itself handle the onBackPress event.

I am using SearchView as

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchview = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchview.setIconifiedByDefault(true);
    searchview.setOnQueryTextListener(this);
    searchview.setSubmitButtonEnabled(true);  
    searchview.setQueryHint("Search Here"); 
    super.onCreateOptionsMenu(menu, inflater);
}

and my menu.xml as follows

<item
    android:id="@+id/action_search"
    android:icon="@drawable/search_tool"
    android:orderInCategory="1"
    android:title="Search" 
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView"/>

Also you can use collapseActionView. It automatically handle back button, collapsing SearchView

<item
      android:id="@+id/action_search"
      android:icon="@drawable/ic_magnify"
      android:title="@string/action_title_search"
      app:actionViewClass="android.support.v7.widget.SearchView"
      app:showAsAction="ifRoom|collapseActionView" />

No need to use onBackPressed() method for this!! I found the solution, do only as I mentioned below so that the SearchView itself handle the on back button press event.

Inside your onCreateOptionsMenu() method,

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem menuItem = menu.findItem(R.id.action_search);
    SearchView searchview = (SearchView) menuItem.getActionView();
    searchview.setIconifiedByDefault(true);
    searchview.setQueryHint("Enter your keyword");
    searchview.setOnQueryTextListener(this); 
    super.onCreateOptionsMenu(menu, inflater);
}

In your menu.xml add showAsAction attribute and set its values as "always|collapseActionView"

<item
    android:id="@+id/action_search_item"
    android:title="Search"
    android:icon="@drawable/ic_search_logo"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="android.support.v7.widget.SearchView"/>

And you're ready to go ;)

P.S. - I was searching for a solution from a long time and now I found one, hope it helps you all.

참고URL : https://stackoverflow.com/questions/17506230/how-do-i-close-a-searchview-programmatically

반응형