【发布时间】:2012-07-27 10:40:22
【问题描述】:
我正在开发一个应用程序,用户在该应用程序中按下ActionBar 中的“搜索”图标,并在屏幕顶部显示SearchView。
我的问题是SearchView 既没有聚焦也没有展开,因此用户必须按下Searchview 上的搜索按钮才能使其展开并调出键盘。
应该如何解决?
【问题讨论】:
标签: android search focus expand
我正在开发一个应用程序,用户在该应用程序中按下ActionBar 中的“搜索”图标,并在屏幕顶部显示SearchView。
我的问题是SearchView 既没有聚焦也没有展开,因此用户必须按下Searchview 上的搜索按钮才能使其展开并调出键盘。
应该如何解决?
【问题讨论】:
标签: android search focus expand
要使 SearchView 默认展开,请在初始化时调用 setIconifiedByDefault(false)(例如在 onCreateOptionsMenu(..) 或 onPrepareOptionsMenu(..) 中)。我发现在大多数情况下,它会自动获得焦点,但如果不是简单地调用requestFocus() 也可以。
【讨论】:
onPrepareOptionsMenu(..) 中添加一个requestFocus() 调用对我有用。
requestFocus 对我不起作用。要“集中注意力”,您可以使用false 调用setIconified
app:showAsAction="always"。当我移除自动对焦时,图标消失了,并且出现了 3 个点图标
你也可以调用 expandActionView() 方法来强制它:
@Override
public boolean onCreateOptionsMenu( Menu menu )
{
super.onCreateOptionsMenu( menu );
MenuItem searchMenuItem = menu.findItem( R.id.mi_search ); // get my MenuItem with placeholder submenu
searchMenuItem.expandActionView(); // Expand the search menu item in order to show by default the query
return true;
}
操作栏布局中的搜索项:
<item
android:id="@+id/mi_search"
android:icon="@drawable/abs__ic_search_api_holo_light"
android:title="@string/search"
android:showAsAction="ifRoom|collapseActionView"
android:actionViewClass="com.actionbarsherlock.widget.SearchView"
/>
【讨论】:
searchMenuItem上调用expandActionView(),你应该使用这个:MenuItemCompat.expandActionView(searchMenuItem)。
searchMenuItem.expandActionView();加1
这对我有用:
menu.expandActionView();
【讨论】:
如果你在布局中使用它,你可以调用
mSearchView.onActionViewExpanded()
【讨论】:
View,而不是MenuItem
这对我有用:
在根布局中:
xmlns:app="http://schemas.android.com/apk/res-auto"
SearchView 定义如下:
<android.support.v7.widget.SearchView
android:id="@+id/search_contacts"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="15dp"
android:background="@drawable/search_view"
app:iconifiedByDefault="false"
app:queryHint="Search name or email"
>
<requestFocus />
</android.support.v7.widget.SearchView>
区别在于应用标签。
app:iconifiedByDefault="false"
app:queryHint="Search name or email"
【讨论】:
如果你想拥有它iconifiedByDefault,这对我有用。需要setFocusable 和setIconified。
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setIconifiedByDefault(true);
searchView.setFocusable(true);
searchView.setIconified(false);
searchView.requestFocusFromTouch();
更新:如果您使用 android.support.v7.widget.SearchView,我们的行为将大不相同。如果您不想一直弹出键盘,则需要clearFocus。由于某种原因,在使用 appcompat 时,菜单会一直重新创建。
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setIconified(false);
searchView.clearFocus();
【讨论】:
您可以在 Java 代码中的 SearchView 句柄上使用 SearchView#setIconified() 方法。更多内容:
http://developer.android.com/reference/android/widget/SearchView.html#setIconified(boolean)
您也可以使用SearchView#setIconifiedByDefault()。更多信息在这里:
http://developer.android.com/reference/android/widget/SearchView.html#setIconifiedByDefault(boolean)
【讨论】:
MenuItemCompat 的 SearchView 有一个名为 maxWidth 的属性。
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setMaxWidth(xxx);
使用屏幕宽度代替 xxx offcourse
【讨论】:
如果你在一个activity里面使用你需要使用
view.onActionViewExpanded();
如果您使用的是内部菜单选项,则需要使用
MenuItem.expandActionView();
注意:它仅适用于 SearchView
这两种情况对我有用。
【讨论】:
android:iconifiedByDefault="true"
以上是 XML 中的代码,帮助我将其展开并在单击时自动聚焦在搜索视图上:
【讨论】:
使用这个
SearchManager searchManager = (SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = new SearchView(mActivity.actionBar.getThemedContext());
searchView.setSearchableInfo(searchManager.getSearchableInfo(mActivity.getComponentName()));
searchView.setIconifiedByDefault(false);
searchView.setQueryHint("Search");
menu.findItem(R.id.action_search).setActionView(searchView);
【讨论】:
我使用 android.widget Searchview 并默认图标化。xml 中的以下代码帮助我使其扩展并自动聚焦在搜索视图上,单击时:
<SearchView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:iconifiedByDefault="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:queryHint="Search"/>
【讨论】:
@Pascalius 的回答对我有用。但是每次关闭 SearchView 并再次单击时,您都会失去焦点。所以我将代码插入到setOnMenuItemClickListener 中,如下所示:
MenuItem item = menu.findItem(R.id.action_search);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView searchView = (SearchView) item.getActionView();
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
searchView.setIconifiedByDefault(true);
searchView.setFocusable(true);
searchView.setIconified(false);
searchView.requestFocusFromTouch();
return false;
}
});
【讨论】:
对于 Appcompat Searchview 你可以使用这个方法:
MenuItemCompat.expandActionView(mSearchMenuItem);
【讨论】:
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="Search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always"/>
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setQueryHint("Search the customer...");
searchView.setSearchableInfo(Objects.requireNonNull(searchManager).getSearchableInfo(getComponentName()));
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setIconifiedByDefault(false);
searchView.requestFocus();
}
<pre>
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="Search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always"/>
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setQueryHint("Search the customer...");
searchView.setSearchableInfo(Objects.requireNonNull(searchManager).getSearchableInfo(getComponentName()));
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setIconifiedByDefault(false);
searchView.requestFocus();
}
</pre>
【讨论】:
在 menuItem 上调用 expandActionView()。
menuItem.expandActionView()
【讨论】:
我在使用SearchView widget 时遇到了困难,但expandActionView() method 实际上是在 MenuItem 类中定义的,而不是在 SearchView 类中。所以,我解决了它
MenuItem searchItem = menu.findItem(R.id.item_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchItem.expandActionView();//the method expandActionView is called on searchItem not searchView
【讨论】:
科特林
var searchView = menu.findItem(R.id.action_search).actionView as SearchView
searchView.isIconified = true
【讨论】: