我目前在应用的操作栏中有一个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);
}
答案 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();
}
}
修改强>:
如有必要,您可以展开或折叠自己的操作视图 代码通过调用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)
我的方式:
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); } }
<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"/>
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()