Android 搜索视图在工具栏上的行为不正确
Android search view not behaving right on toolbar
你有显示我的应用程序实际行为的视频:
https://www.youtube.com/watch?v=81XIdEo0lks&feature=youtu.be
你看,当我点击搜索图标时,它只是将它移到左侧,然后我需要再次点击它,然后我需要点击 x 按钮 2 次才能真正退出搜索视图,一团糟.
以下是我希望我的搜索视图的行为方式:
https://www.youtube.com/watch?v=sJ-Z9G0SDhc&t
MainActivity.java(仅相关部分)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
MenuItem searchItem = menu.findItem(R.id.app_bar_search);
SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = null;
if (searchItem != null) {
searchView = (SearchView) searchItem.getActionView();
}
if (searchView != null) {
searchView.setSearchableInfo(searchManager.getSearchableInfo(MainActivity.this.getComponentName()));
}
return super.onCreateOptionsMenu(menu);
}
options_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/app_bar_search"
android:icon="@drawable/ic_search_black_24dp"
android:title="Search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="android.widget.SearchView" />
<item
android:id="@+id/logout_btn"
android:title="Log Out" />
</menu>
我希望我的搜索视图表现得像那个视频中的搜索视图,点击搜索,出现键盘,你可以输入,你可以退出。我还想在进入搜索视图时让这三个垂直点图标消失。
首先声明一个状态变量以确定何时需要隐藏菜单项
boolean isHideMenuState = false;
然后引用需要隐藏在 onCreateOptionsMenu 块中的项目
MenuItem logoutItem = menu.findItem(R.id.logout_btn);
//... initialize other menu items here
//use hidden state to define when to hide item(s)
if(isHideMenuState){
logoutItem.setVisible(false);
//by now the ellipses(...) should go off
//if not try using setShowAsAction passing (SHOW_AS_ACTION_NEVER)
}
else{
logoutItem.setVisible(true);
}
下一步:将焦点更改侦听器添加到您的 searchView
searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// Toggle isHideMenuState when search widget has focus/no focus
isHideMenuState = hasFocus
//Tell menu to re-create itself
invalidateOptionsMenu(); // onCreateOptionsMenu(...) is called again
}
});
最后 UI 尝试更改 searchView 项目的 actionViewClass
app:actionViewClass="android.support.v7.widget.SearchView"
click on the search, the keyboard appears, you can type, you can exit.
为此,您需要这样做:
- 在
onCreateOptionsMenu
中:
- 添加
searchView.setIconifiedByDefault(false);
- 添加
searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
searchView.setIconified(false);
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
searchView.setIconified(true);
searchView.clearFocus();
return true;
}
});
searchView.setIconifiedByDefault(false);
的目的是在用户按下搜索图标时默认显示 SearchView
的展开视图。 searchView.setIconified(false);
是让视图有焦点,显示软键盘。 searchView.setIconified(true);
是当您的用户退出 SearchView
时清除文本。最后,searchView.clearFocus();
是隐藏软键盘。
I also want to make this 3 vertical dots icon disappear when I enter the search view.
为此,您可以这样做:
- 在
onMenuItemActionExpand
中添加logoutItem.setVisible(false);
- 在
onMenuItemActionCollapse
中添加logoutItem.setVisible(true);
你有显示我的应用程序实际行为的视频: https://www.youtube.com/watch?v=81XIdEo0lks&feature=youtu.be 你看,当我点击搜索图标时,它只是将它移到左侧,然后我需要再次点击它,然后我需要点击 x 按钮 2 次才能真正退出搜索视图,一团糟. 以下是我希望我的搜索视图的行为方式: https://www.youtube.com/watch?v=sJ-Z9G0SDhc&t
MainActivity.java(仅相关部分)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
MenuItem searchItem = menu.findItem(R.id.app_bar_search);
SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = null;
if (searchItem != null) {
searchView = (SearchView) searchItem.getActionView();
}
if (searchView != null) {
searchView.setSearchableInfo(searchManager.getSearchableInfo(MainActivity.this.getComponentName()));
}
return super.onCreateOptionsMenu(menu);
}
options_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/app_bar_search"
android:icon="@drawable/ic_search_black_24dp"
android:title="Search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="android.widget.SearchView" />
<item
android:id="@+id/logout_btn"
android:title="Log Out" />
</menu>
我希望我的搜索视图表现得像那个视频中的搜索视图,点击搜索,出现键盘,你可以输入,你可以退出。我还想在进入搜索视图时让这三个垂直点图标消失。
首先声明一个状态变量以确定何时需要隐藏菜单项
boolean isHideMenuState = false;
然后引用需要隐藏在 onCreateOptionsMenu 块中的项目
MenuItem logoutItem = menu.findItem(R.id.logout_btn);
//... initialize other menu items here
//use hidden state to define when to hide item(s)
if(isHideMenuState){
logoutItem.setVisible(false);
//by now the ellipses(...) should go off
//if not try using setShowAsAction passing (SHOW_AS_ACTION_NEVER)
}
else{
logoutItem.setVisible(true);
}
下一步:将焦点更改侦听器添加到您的 searchView
searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// Toggle isHideMenuState when search widget has focus/no focus
isHideMenuState = hasFocus
//Tell menu to re-create itself
invalidateOptionsMenu(); // onCreateOptionsMenu(...) is called again
}
});
最后 UI 尝试更改 searchView 项目的 actionViewClass
app:actionViewClass="android.support.v7.widget.SearchView"
click on the search, the keyboard appears, you can type, you can exit.
为此,您需要这样做:
- 在
onCreateOptionsMenu
中:- 添加
searchView.setIconifiedByDefault(false);
- 添加
- 添加
searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
searchView.setIconified(false);
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
searchView.setIconified(true);
searchView.clearFocus();
return true;
}
});
searchView.setIconifiedByDefault(false);
的目的是在用户按下搜索图标时默认显示 SearchView
的展开视图。 searchView.setIconified(false);
是让视图有焦点,显示软键盘。 searchView.setIconified(true);
是当您的用户退出 SearchView
时清除文本。最后,searchView.clearFocus();
是隐藏软键盘。
I also want to make this 3 vertical dots icon disappear when I enter the search view.
为此,您可以这样做:
- 在
onMenuItemActionExpand
中添加 - 在
onMenuItemActionCollapse
中添加
logoutItem.setVisible(false);
logoutItem.setVisible(true);