如何以编程方式关闭 SearchView?

Posted

技术标签:

【中文标题】如何以编程方式关闭 SearchView?【英文标题】:How do I close a SearchView programmatically? 【发布时间】:2013-07-04 13:56:21 【问题描述】:

我目前在我的应用的操作栏中有一个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);

【问题讨论】:

***.com/a/46930606/1308990 【参考方案1】:

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

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

【讨论】:

重要的是,如果您设置了 app:showAsAction="always",上述解决方案将不起作用 确保设置 searchView.setQuery("", false);为了使 searchView.setIconified(true);上班 使用 searchView.setQuery("", false);在 searchView.setIconified(true) 之前;为我工作,如果你连续放置 2 个 searchView.setIconified(true);为我工作。【参考方案2】:

使用

searchView.setIconified(true)

我也用过MenuItemCompat.collapseActionView

MenuItemCompat.collapseActionView(menuItem)

已编辑

此方法在 API 级别 26.1.0 中已弃用。直接使用collapseActionView()。

MenuItem#collapseActionView()

【讨论】:

这仅在您设置 app:showAsAction="ifroom|collapseActionView" 时有效。 现在不推荐使用,直接在MenuItem上使用collapseActionView()【参考方案3】:

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

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

或使用:

myToolBar.collapseActionView();

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

两种解决方案都可以。

【讨论】:

collapseActionView 不行,第一个解决办法是的【参考方案4】:

这是唯一对我有用的事情:

  toolbar.collapseActionView();

【讨论】:

我尝试了这个线程中的所有解决方案。这个解决方案对我来说是最好的。这是使搜索图标回到右上角的唯一解决方案 IDE 给我“Actionbar.collapseActionView 只能从同一个库组中调用”错误 supportActionBar?.collapseActionView() 为我工作【参考方案5】:

拦截返回按钮覆盖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() 菜单项。

【讨论】:

感谢您的回复!不过,我主要感兴趣的是是否有办法以编程方式调用 SearchView 的关闭事件,即在代码中模仿 SearchView 框“X”按钮按下。 感谢马尔辛的所有帮助。事实证明,我真正想做的是“图标化”我的搜索操作视图(我的搜索视图始终位于操作栏上,并且永远不会折叠到选项菜单中)。感谢您花时间帮助我,并感谢您提供有关覆盖“onBackPressed”的提示。 对我来说 onBackPressed 没有被调用。我还有什么其他解决方案?我试图倾听对搜索视图的关注,但这也没有被调用.. 您不会期望onBackPressed() 在 Activity 之外(即在 Fragment 中),是吗? 对我来说,onBackPressed 根本没有被调用。看起来搜索视图实际上正在吃掉后面的新闻并处理它。例如,我看到调用了 onMenuItemActionViewCollapsed(),但未调用 onBackPressed。我怎样才能覆盖这个?我什至尝试在搜索视图上设置一个 Key Listener,但它仍然不起作用。【参考方案6】:

如果您在 searchView 上有输入

mSearchView.setIconified(true);

只会清除文本。

关闭 searchView 的正确方法是

mSearchView.onActionViewCollapsed();

【讨论】:

【参考方案7】:

用途:

searchView.setIconified(true);

【讨论】:

【参考方案8】:

我更喜欢!searchView.isIconified() 而不是if(isSearchViewVisible)onBackPressed() 方法中,因为当您在fragmentmanager's backstack 中添加了您希望在按下后退按钮时显示的片段时,选项2 不起作用。

【讨论】:

【参考方案9】:

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

在您的 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"/>

你准备好了;)

附注- 找了好久,终于找到了,希望对大家有帮助。

【讨论】:

【参考方案10】:

在 Kotlin 中;

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

searchView.isIconified = true

二、关闭搜索视图

searchView.onActionViewCollapsed()

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

searchView.onActionViewExpanded()

【讨论】:

【参考方案11】:

我的方式:

    创建 CustomSearchView 类
公共类 CustomSearchView 扩展 SearchView 公共CustomSearchView(最终上下文上下文) 超级(上下文); this.setIconifiedByDefault(true); @覆盖 公共布尔dispatchKeyEventPreIme(KeyEvent事件) if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) this.onActionViewCollapsed(); return super.dispatchKeyEventPreIme(event);
    添加actionViewClass
    在 onCreateOptionsMenu 中创建 CustomSearchView
CustomSearchView searchView = (CustomSearchView)menu.findItem(R.id.menu_search).getActionView();

【讨论】:

【参考方案12】:

如果您没有使用 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"/>

【讨论】:

【参考方案13】:

您也可以使用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" />

【讨论】:

【参考方案14】:

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

requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) @覆盖 公共无效句柄OnBackPressed()

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

【讨论】:

【参考方案15】:

最有效的解决方案:

MenuItem menuItem = ....//
menuItem.collapseActionView();

【讨论】:

以上是关于如何以编程方式关闭 SearchView?的主要内容,如果未能解决你的问题,请参考以下文章

Android的SearchView详解

以编程方式实现不滚动的搜索栏

如何以编程方式打开 DAL(Django Autocomplete Light)Select2

如何以编程方式关闭 Discord?

如何以编程方式关闭/禁用 NFC?

如何以编程方式单击剑道树视图节点[关闭]