如何以编程方式关闭 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 类
-
添加actionViewClass
-
在 onCreateOptionsMenu 中创建 CustomSearchView
【讨论】:
【参考方案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?的主要内容,如果未能解决你的问题,请参考以下文章