自动展开并将焦点放在 SearchView
Posted
技术标签:
【中文标题】自动展开并将焦点放在 SearchView【英文标题】:Expand and give focus to SearchView automatically 【发布时间】:2012-07-27 10:40:22 【问题描述】:我正在开发一个应用程序,用户在该应用程序中按下ActionBar
中的“搜索”图标,并在屏幕顶部显示SearchView
。
我的问题是SearchView
既没有聚焦也没有展开,因此用户必须按下Searchview
上的搜索按钮才能使其展开并调出键盘。
应该如何解决?
【问题讨论】:
【参考方案1】:要使 SearchView 默认展开,请在初始化时调用 setIconifiedByDefault(false)(例如在 onCreateOptionsMenu(..)
或 onPrepareOptionsMenu(..)
中)。我发现在大多数情况下,它会自动获得焦点,但如果不是简单地调用requestFocus()
也可以。
【讨论】:
我不敢说实话,抱歉。 在onPrepareOptionsMenu(..)
中添加一个requestFocus()
调用对我有用。
requestFocus
对我不起作用。要“集中注意力”,您可以使用false
调用setIconified
@SweSnow 你必须同时设置 ...searchView.setIconifiedByDefault(false); searchView.requestFocus();
确保设置了菜单项属性app:showAsAction="always"
。当我移除自动对焦时,图标消失了,并且出现了 3 个点图标【参考方案2】:
你也可以调用 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"
/>
【讨论】:
如果你使用AppCompat,而不是直接在searchMenuItem
上调用expandActionView()
,你应该使用这个:MenuItemCompat.expandActionView(searchMenuItem)
。
@CharlesMadere 方式是唯一对我有用的方式,API 23
为searchMenuItem.expandActionView();
加1
MenuItemCompat.expandActionView(searchMenuItem) 现已弃用
此解决方案已弃用。【参考方案3】:
这对我有用:
menu.expandActionView();
【讨论】:
但关闭图标最初以展开形式不可见。 ***.com/questions/27706192/…【参考方案4】:如果你在布局中使用它,你可以调用
mSearchView.onActionViewExpanded()
【讨论】:
在布局中使用是什么意思? 我的意思是您将其称为View
,而不是MenuItem
这对我不起作用。调用 setIconified() 确实如此。
也为我工作,我不知道为什么在官方网站上他们没有包含在示例代码中。我的意思是,如果我点击搜索按钮,键盘应该正确打开???【参考方案5】:
这对我有用:
在根布局中:
xmlns:app="http://schemas.android.com/apk/res-auto"
SearchView 定义如下:
<android.support.v7.widget.SearchView
android:id="@+id/search_contacts"
android:layout_
android:layout_
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"
【讨论】:
【参考方案6】:如果你想拥有它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();
【讨论】:
【参考方案7】:您可以在 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)
【讨论】:
【参考方案8】:MenuItemCompat 的 SearchView 有一个名为 maxWidth 的属性。
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setMaxWidth(xxx);
使用屏幕宽度代替 xxx offcourse
【讨论】:
【参考方案9】:如果你在一个activity里面使用你需要使用
view.onActionViewExpanded();
如果您使用的是内部菜单选项,则需要使用
MenuItem.expandActionView();
注意:它仅适用于 SearchView
这两种情况对我有用。
【讨论】:
【参考方案10】:android:iconifiedByDefault="true"
以上是 XML 中的代码,帮助我将其展开并在单击时自动聚焦在搜索视图上:
【讨论】:
【参考方案11】:使用这个
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);
【讨论】:
【参考方案12】:我使用 android.widget Searchview 并默认图标化。xml 中的以下代码帮助我使其扩展并自动聚焦在搜索视图上,单击时:
<SearchView
android:id="@+id/searchView"
android:layout_
android:layout_
android:iconifiedByDefault="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:queryHint="Search"/>
【讨论】:
【参考方案13】:@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;
);
【讨论】:
【参考方案14】:对于 Appcompat Searchview 你可以使用这个方法:
MenuItemCompat.expandActionView(mSearchMenuItem);
【讨论】:
【参考方案15】: <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>
【讨论】:
对我来说成功了,你可以试试。【参考方案16】:在 menuItem 上调用 expandActionView()
。
menuItem.expandActionView()
【讨论】:
【参考方案17】:我在使用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
【讨论】:
【参考方案18】:科特林
var searchView = menu.findItem(R.id.action_search).actionView as SearchView
searchView.isIconified = true
【讨论】:
以上是关于自动展开并将焦点放在 SearchView的主要内容,如果未能解决你的问题,请参考以下文章
将焦点保存在 ExpandableListView 中的展开组上
HTML 表单 - 添加新表格行并将焦点设置在第一个输入上的脚本