如何以编程方式关闭SearchView?

时间:2013-07-06 19:15:55

标签: android 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);
}

14 个答案:

答案 0 :(得分:136)

根据@MarcinOrlowski的回答,您也可以使用:

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

答案 1 :(得分:47)

使用

searchView.setIconified(true)

我还使用了MenuItemCompat.collapseActionView

MenuItemCompat.collapseActionView(menuItem)

答案 2 :(得分:31)

有一种简单的方法可以做到这一点:

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

或使用:

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

这将使searchView在按下后面之前折叠,然后将调用后退动作。

两种解决方案都有效。

答案 3 :(得分:27)

这是我唯一能做到的事情:

  toolbar.collapseActionView();

答案 4 :(得分:22)

拦截BACK按钮覆盖onBackPressed()see docs

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

修改

Docs say

  

如有必要,您可以展开或折叠自己的操作视图   代码通过调用expandActionView()和collapseActionView()来实现   菜单项。

答案 5 :(得分:13)

如果您在searchView上输入了

mSearchView.setIconified(true);

只会清除文字。

关闭searchView的正确方法是

mSearchView.onActionViewCollapsed();

答案 6 :(得分:2)

我更倾向于!searchView.isIconified()超过if(isSearchViewVisible) onBackPressed()方法,因为当您在fragmentmanager's backstack中添加了片段时,选项2无效喜欢按下后退按钮时显示。

答案 7 :(得分:2)

使用:

searchView.setIconified(true);

答案 8 :(得分:0)

我的方式:

  1. 创建CustomSearchView类
  2. 
        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. 添加actionViewClass
    2.     <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. 在onCreateOptionsMenu中创建CustomSearchView
      2.     CustomSearchView searchView = (CustomSearchView)menu.findItem(R.id.menu_search).getActionView();
        

答案 9 :(得分:0)

如果您未使用onBackPressed()方法中的任何功能,请将其从您的Activity中删除。因此SearchView本身会处理onBackPress事件。

我正在使用SearchView作为

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

和我的menu.xml如下

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

答案 10 :(得分:0)

您也可以使用collapseActionView。它会自动处理后退按钮,折叠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" />

答案 11 :(得分:0)

无需为此使用onBackPressed()方法! 我找到了解决方案,只能按照我在下面提到的方法进行操作,以便SearchView本身可以处理后退按钮按下事件。

在您的onCreateOptionsMenu()方法中,

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

在您的 menu.xml 中添加 showAsAction 属性并将其值设置为"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"/>

您就可以开始了;)

P.S。 -很久以来我一直在寻找解决方案,现在我找到了,希望对您有帮助。

答案 12 :(得分:0)

以下内容对我有用。当用户单击“后退”按钮时,我试图从Jetpack NavigationView中的Fragment关闭搜索视图-

requireActivity()。getOnBackPressedDispatcher()。addCallback(getViewLifecycleOwner(),新的OnBackPressedCallback(true){ @Override 公共无效handleOnBackPressed(){

        try {
            DashboardActivity activity = (DashboardActivity) getActivity();
            if (activity!=null) {
                if (!activity.mSearchView.isIconified()) {
                    activity.mSearchView.setQuery("",false);
                    activity.mSearchView.setIconified(true);
                } else {
                    NavController navController = Navigation.findNavController(activity, R.id.nav_host_fragment);
                    navController.popBackStack();
                }
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }
});

答案 13 :(得分:0)

在 Kotlin 中;

首先清除输入的文本(可选)

searchView.isIconified = true

二、关闭搜索视图

searchView.onActionViewCollapsed()

Exstra,以编程方式打开搜索视图

searchView.onActionViewExpanded()